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.
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!
Mach doch einen Type für den Schuss.
TYPE Shot
x;y
Sprite_ID
ENDTYPE
GLOBAL Shots[] AS Shot
Dann in einem Event beide Schüsse erstellen(Pseudocode!):
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 ;)
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.
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!
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.
Dann regel das über eine Variable im Type, was es für eine Waffe ist!
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!