for each

Previous topic - Next topic

Shogun

Hallo alle zusammen,
ich komme immoment irgendwie nicht weiter, folgendes Problem, ich möchte 2 verschiedene Schüsse haben und vom Player aus schießen, funktioniert soweit auch, nur der Schuss wird auch immer am linken oberen Bildschirmrand dargestellt. Wenn ich jetzt nur einen Schuss in der foreach angebe ist es so wie ich es haben möchte.
Der Code unten beinhaltet das meiners erachtens Wichtigste. Würde mich freuen wenn mal jemand drüber schaut.
Code (glbasic) Select

TYPE weapon
weapon1x // x und y position waffe1
weapon1y
weapon2x // x und y position waffe2
weapon2y
ENDTYPE

GLOBAL weapons[] AS weapon

WHILE TRUE

drawthescreen()
player()
fortheshot()
mouse()


WEND
END

FUNCTION fortheshot:

IF SPRCOLL (4, playerx, playery, 5, 300, 400)  Kollision mit Waffensymbol 1
waffe=1
ENDIF

IF SPRCOLL (4, playerx, playery, 7, 200, 200) Kollision mit Waffensymbol 2
waffe=2
ENDIF



IF KEY(29) AND waffe=1
LOCAL shot AS weapon
shot.weapon1x = playerx
shot.weapon1y = playery
delay = GETTIMERALL() + 500
DIMPUSH weapons[], shot
ENDIF


IF KEY(29) AND waffe=2
LOCAL shot AS weapon
shot.weapon2x = playerx
shot.weapon2y = playery
delay = GETTIMERALL() + 500
DIMPUSH weapons[], shot
ENDIF

ENDFUNCTION

FUNCTION drawthescreen:


FOR x = 0 TO 9
FOR y = 0 TO 9

DRAWSPRITE 1, x*64, y*64


NEXT
NEXT



DRAWANIM 4, pldir, playerx, playery

PRINT "<=", mx, my

DRAWSPRITE 5, 300, 400 // Item Waffe 1
DRAWSPRITE 7, 200, 200 // Item Waffe 2


FOREACH shot IN weapons[] // Schuss1 // Violett
DEC shot.weapon1y, 5
DRAWSPRITE 6, shot.weapon1x, shot.weapon1y

NEXT

FOREACH shot IN weapons[] // Schuss2 // grau
DEC shot.weapon2y, 5
DRAWSPRITE 3, shot.weapon2x, shot.weapon2y

NEXT
SHOWSCREEN
ENDFUNCTION


Hoffe, ich habe mich einigermaßen verständlich ausgedrückt. Schranzors gute Erklärung der Types ist mir eigentlich klar, oder doch nicht ganz?
Freue mich über jede Hilfe, Gruß Markus



Edit Schranz0r :
Bitte Code in den Code-Tag packen(Insert Code), danke!

Schranz0r

Mach doch einen Type für den Schuss.

Code (glbasic) Select

TYPE Shot
    x;y
    Sprite_ID
ENDTYPE

GLOBAL Shots[] AS Shot



Dann in einem Event beide Schüsse erstellen(Pseudocode!):

Code (glbasic) Select

IF KEY(Taste) AND timer < GETTIMERALL()
    LOCAL t AS Shot
    LOCAL tmp_y = Player_Y - 10   
   
    FOR i = 0 to 1 // Zwei schüsse
        t.Sprite_ID = Schussbild
        t.x = Player_X
        t.y = tmp_y
        DIMPUSH Shots[],t
       
        INC tmp_y, 20 // zweiter schuss 20 Pixel unter den ersten setzen
    NEXT
   
    timer = GETTIMERALL()+Delay
ENDIF


Das sollte dann einen Schuss unter den anderen erstellen, wenn du dann von links nach rechts ballern willst z.B.

Bewegen kannste dann alles in einer FOREACH, ist einfacher ;)
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

Shogun

ok, danke schonmal, werde es gleichmal ausprobieren.
Was habe ich denn an meinem Beispiel falsch gemacht? Es funktioniert ja nur das der Schuss halt doppelt dargestellt wird.
Wäre schön zu wissen wo der Fehler liegt.

Schranz0r

Du hast es unlogisch gemacht, weil du jeweils in einen Type 2 Schüsse speichern willst.
Angenommen du triffst deinen Gegner mit einem Schuss und der andere geht vorbei, dann ist der wo vorbei geht auch gelöscht.
Schaut erstens mist aus und zweitens ist es nicht der Hit vom Code her!
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

Shogun

Ich weiß nicht ob du mein Beispiel richtig verstanden hast....
Ich möchte zwei verschiedene Waffen haben, z.bsp. shotgun und machinegun. Ich habe 2 verschiedene Waffen-Symbole auf der map. Sobald ich eins berühre ist der key sozusagen aktiv und ich schieße entweder mit
Waffe 1 oder Waffe 2. Das funktioniert ja auch. es ist irgendwo ein kleiner fehler drin, denn ich sehe den schuss doppelt einmal an richtiger stelle und einmal an falscher Stelle, am bildschirm oben links.
Mein Code ähnelt dem Standard Code des Schusstypes der hier schon in mehreren Beispielen gepostet wurde, natürlich geht es bestimt besser.
Meine Idee war halt ein schusstype in dem ich die beiden verschiedenen waffen reinpacke.

Schranz0r

Dann regel das über eine Variable im Type, was es für eine Waffe ist!

Code (glbasic) Select
TYPE shot
    what   // 0 = Pumpgun, 1 = MG , 2 = Sniper ... usw
    x;y     // Position
    speed // schnelligkeit des schusses
ENDTYPE


2 Schüsse in einen Type-Eintrag machen ist nicht nur falsch, sondern kann auch nicht gehen!
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