Author Topic: Wert nur verändern wenn ich mousebutton drücke  (Read 4250 times)

Offline Shogun

  • Mr. Drawsprite
  • **
  • Posts: 67
    • View Profile
Hallo alle zusammen, ich komme mal wieder nicht weiter.
Ich erstelle mit Hilfe der Types Schüsse. Jetzt habe ich eine Ammo Variable und möchte nur das diese sich verändert wenn ich den Mausbutton drücke.
So sieht mein Code aus:

TYPE SHOT
x
y
ammo
ENDTYPE
GLOBAL shots[] AS SHOT

WHILE TRUE

MOUSESTATE mx, my, b1, b2

IF b1
LOCAL shot AS SHOT
shot.ammo=50
DIMPUSH shots[], shot
ENDIF
FOREACH shot IN shots[]
shot.ammo=shot.ammo-1
PRINT shot.ammo, 200, 200
NEXT

so, mir ist klar des die Variable die ganze Zeit Minus 1 geht. Meine Überlegung mit Else arbeiten und dann shot.ammo=shot.ammo? Also, dass wenn der Mausbutton nicht gedrückt wird einfach die Variable shot.ammo angezeit wird?
Habe ich nicht hinbekommen.

Wie gesagt, ich komme nicht weiter, würde mich freuen wenn jemand hilft.

Offline Quentin

  • Prof. Inline
  • *****
  • Posts: 915
    • View Profile
Prinzipell solltest du bei der Erstellung der Schüsse mit Timer arbeiten (GETTIMERALL()) damit nur eine begrenzte Anzahl an Schüssen pro Zeiteinheit erstellt werden kann.

Vermutlich willst du ja erreichen, daß die Schüsse nach einer bestimmten Zeitspanne wieder gelöscht werden. Habe dein Bespiel ein wenig umgeschrieben, um das zu verdeutlichen.

Code: (glbasic) [Select]
TYPE SHOT
x
y
ammo
ENDTYPE
GLOBAL shots[] AS SHOT
LOCAL shot AS SHOT

LOCAL time_next_shot

WHILE TRUE

MOUSESTATE mx, my, b1, b2

IF b1 AND time_next_shot < GETTIMERALL()
shot.ammo=50
DIMPUSH shots[], shot
time_next_shot = GETTIMERALL() + 100
ENDIF

y = 0
FOREACH shot IN shots[]
shot.ammo = shot.ammo-.1
IF shot.ammo <= 0 THEN DELETE shot
PRINT shot.ammo, 200, y
INC y, 10
NEXT

SHOWSCREEN

WEND

wenn es nicht das ist, was du haben wolltest, gib laut :)

Offline Shogun

  • Mr. Drawsprite
  • **
  • Posts: 67
    • View Profile
Danke erstmal gettimer ist mir bekannt. Ist aber nicht genau das, was ich suche. Durch shot.ammo habe ich ein Wert von z.Bsp. 50. Jetzt möchte ich mit jedem druck auf den Mausbutton den Wert um Minus 1 verringern und das auch anzeigen.
In dem Beispiel das ich geschrieben habe funktioniert es nur nicht richtig, da der Wert die ganze Zeit runter zählt. Ist ja auch soweit klar. Wie baue ich jetzt ein, dass der Wert sich nicht verändert wenn ich nicht den button drücke?
Mit Else oder false arbeiten? Wie gesagt, ich bekomme es nicht richtig hin. Würde mich freuen wenn du nochmal hilfst.

Offline Quentin

  • Prof. Inline
  • *****
  • Posts: 915
    • View Profile
äh, sorry, aber ich kann noch nicht ganz nachvollziehen, was du eigentlich erreichen willst. In deinem Beispiel wird mit Druck auf die Maustaste erst einmal ein Eintrag in shots[] erzeugt. Jetzt willst du gleichzeitig mit einem Mausklick die Variable ammo runterzählen??

Offline Shogun

  • Mr. Drawsprite
  • **
  • Posts: 67
    • View Profile
ja, wie in einem shooter, ich drücke den Button und die Munition geht z.Bsp. von 50 auf 49. Mein Beispiel funktioniert ja, nur zählt er eben nach dem klick die ganze Zeit, auch wenn ich den button los lasse.

Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5116
  • O Rly?
    • View Profile
Macht er nicht wenn du es in der IF-Abfrage mit GETTIMERALL() machst!
 
Code: (glbasic) [Select]

GLOBAL Shots_in_Magazin = 50   // Maximale schüsse im Magazin
...
 
IF b1 AND time_next_shot < GETTIMERALL()
    LOCAL shot AS SHOT

        //shot.ammo=50  // für was das bitte???
   
    DEC Shots_in_Magazin, 1
    shot.x = mx
    shot.y = my
   
    DIMPUSH shots[], shot
    time_next_shot = GETTIMERALL() + 100
ENDIF

I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Offline Shogun

  • Mr. Drawsprite
  • **
  • Posts: 67
    • View Profile
dann probiere ich es mal mit gettimer. mit else oder sowas in der Art wäre es schon schöner.

Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5116
  • O Rly?
    • View Profile
Was willst du da mit einem ELSE ?
Würde dir garnix bringen...
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Offline amarliani

  • Mr. Polyvector
  • ***
  • Posts: 115
    • View Profile
Also, wenn ich richtig begriffen hab, was du möchtest, ist der Fehler glaub ich hier:

Code: (glbasic) [Select]
MOUSESTATE mx, my, b1, b2

//hier fängst du die Maustasten-Schleife an
IF b1
LOCAL shot AS SHOT
shot.ammo=50
//und erzeugst erst mal nen neuen shot
DIMPUSH shots[], shot
ENDIF
//hier ist die Schleife zu Ende

//und hier werden dann AUSSERHALB der Maustasten-Schleife die ammos runtergezählt!
//Dieser Teil wird im Programm immer erreicht, auch ohne Mausklick!
FOREACH shot IN shots[]
shot.ammo=shot.ammo-1
PRINT shot.ammo, 200, 200
NEXT

Wenn ich deinen Code richtig begriffen habe, dann müßte das Ganze eher so aussehen:

Code: (glbasic) [Select]
MOUSESTATE mx, my, b1, b2

IF b1
   LOCAL shot AS SHOT
   shot.ammo=50
   DIMPUSH shots[], shot

   FOREACH shot IN shots[]
      DEC shot.ammo, 1
      PRINT shot.ammo, 200, 200
   NEXT[
ENDIF

Das Problem ist nur, dass du mit deinem Code nicht nur bei jedem Mausklick eine ammo runterzählst, sondern gleichzeitig auch noch einen neuen shot erzeugst. Ist das so gewünscht? Denn die ammo-Variable wird ja jedesmal an exakt der gleichen Stelle ausgegegeb, und so schnell, wie das passiert, siehst du eh immer nur die Angabe für den letzten shot.

Offline Shogun

  • Mr. Drawsprite
  • **
  • Posts: 67
    • View Profile
Naja, dann weiß ich ja schonmal wie ich es lösen kann.

Ich dachte, man könne es folgendermaßen machen, nur eine Überlegung

also, ammo ist z.Bsp. 50

if b1 dec shot.ammo, 1                              wenn nicht b1 gedrückt wird dann ist der ammowert=ammowert also dann den aktuellen wert abfragen.

Da lag ich damit jawohl völlig falsch.




Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5116
  • O Rly?
    • View Profile
Du weißt schon, dass jeder SHOT dann Ammo 50 hat?
Wenn du mit Ammo die Schüsse zählen willst, die du noch zur verfügung hast, dann mußt du eine Locale/Globale definieren und mit jedem Schuss da eins abziehen ;)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Offline Shogun

  • Mr. Drawsprite
  • **
  • Posts: 67
    • View Profile
Und wieder hat mir der Schranzor geholfen, danke.

Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5116
  • O Rly?
    • View Profile
JAJA der gute alte Sch... achso ich  :-[
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard