Allgemeine Frage zum Schleifenaufbau mit Types
Übersicht

BackbufferBetreff: Allgemeine Frage zum Schleifenaufbau mit Types |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Zwar habe ich jetzt so langsam kapiert wie Types funktionieren, aber mit der richtigen Anwendung hapert es noch. Unten habe ich einen Auszug aus meinem Code, bei dem ich jeden Gegnerschuss mit dem Spieler auf Kollision prüfe. Er funktioniert zwar allerdings muss ich hundert mal reinschreiben "wenn bla = null then exit" da er sonst immer wegen fehelnder Objekte meckert.
Ich denke nicht das man das wirklich so macht und wollte daher fragen wie man das ganze sauber programmieren würde. Code: [AUSKLAPPEN] For ship.t_ship = Each t_ship If shot = Null Then Exit DrawImage shot_gfx(Floor(shot\direction/imagestep)*imagestep), shot\xpos+ship\xdistance,shot\ypos+ship\ydistance ;Schuss wird gemalt If ship= Null Then Exit If shot= Null Then Exit If ImagesCollide (shot_gfx(Floor(shot\direction/imagestep)*imagestep), shot\xpos, shot\ypos,0, ship_gfx(Floor(ship\heading/imagestep)*imagestep,ship\image), ship\xpos, ship\ypos,0) Then ;die Bilder vom Schuss und vom Spieler werden auf den absoluten Positionen auf Kollision verglichen DrawImage hit_gfx,shot\xpos+ship\xdistance, shot\ypos+ship\ydistance ;Treffer wird gemalt ship\shield=ship\shield-shot\shotstyle\damage ;Schild des Spielers wird um Schaden reduziert Delete shot ;Schuss wird bei Treffer gelöscht If ship\shield = 0 Then ;wenn Schild des Spielers gleich null DrawImage explosion_gfx, ship\xpos+ship\xdistance, ship\ypos+ship\ydistance ;malt explosion Delete ship ;löscht spielerschiff End If End If Next |
||
MadMental |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi,
Ich denke mal, dass die die ganzen "Exits" weglassen kannst, weil er ja nur Types durchläuft die auch existieren. Selbst wenn, kannst sind die variablen wie "shot" und "ship" falsch deklariert(hoffe richtig geschrieben ...) sonst müssten sie ja "ship.ship" und "shot.shot" oder so heißen. Probiers mal so: Code: [AUSKLAPPEN] For ship.t_ship = Each t_ship DrawImage shot_gfx(Floor(shot\direction/imagestep)*imagestep), shot\xpos+ship\xdistance,shot\ypos+ship\ydistance If ImagesCollide (shot_gfx(Floor(shot\direction/imagestep)*imagestep), shot\xpos, shot\ypos,0, ship_gfx(Floor(ship\heading/imagestep)*imagestep,ship\image), ship\xpos, ship\ypos,0) Then DrawImage hit_gfx,shot\xpos+ship\xdistance, shot\ypos+ship\ydistance ship\shield=ship\shield-shot\shotstyle\damage Delete shot EndIf If ship\shield = 0 Then DrawImage explosion_gfx, ship\xpos+ship\xdistance, ship\ypos+ship\ydistance Delete ship End If Next Hoffe ich konnte dir helfen. MM |
||
Backbuffer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nee, nee, die exits müssen da rein, wenn ich sie weglasse funktioniert es nicht mehr. Das ganze ist nur ein Ausschnitt aus dem Code, d.h. an anderer Stelle werden Objekte auch gelöscht.
Mein Frage war eher so gemeint, ob es nicht einfach eine bessere Art des Aufbaus gibt. Das mit den falsch deklarierten Variabablen habe ich nicht verstanden. |
||
MadMental |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nun, die Variablen die du immer abfrägst kommen ja gar nicht in dem Type vor, weil es keine "type-variablen" sind. Deshalb verstehe ich dein problem nicht ![]() Schalte mal den debugger an und schaue wo immer die Fehlermeldung kommt, wenn du die Exits weglässt. MM |
||
Backbuffer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also hab's gerade noch mal ohne exit ausprobiert, da meckert er schon bei der ersten Draw Zeile.
Im Grund macht er ja was ich will, nur das mit den ganzen Exits ist halt nicht gerade der beste Programmierstil und wenn das Programm mal größer wird hab' ich einfach die Befürchtung, dass ich dann die Übersicht verliere. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Fehlt bei dem Code nicht eine umschließende Schleife die den Tshot - Type durchgeht...?
Code: [AUSKLAPPEN] If shot = Null Then Exit
Die letzte Zeile davon kannst du schonmal sparen, denn nur weil der Schuss gemalt wird, verschwindet er nicht, und von der 1. zur 4. Zeile ändert sich rein gar nichts.
DrawImage [...] ;Schuss wird gemalt If ship= Null Then Exit If shot= Null Then Exit Die Exit's solltest du eigentlich nicht brauchen, wenn du die Objekte nicht löschst und danach versuchst wieder darauf zuzugreifen - setzte lieber eine Variable "die" oder "tot" auf eins und lösche ganz am ende der Schleife alle so markierten Types. Und noch eins: Auf die obige Weise werden treffer/explosionen nur einen Frame lang angezeigt -> lieber auch die Explosionen/Effekte in Types ablegen und verwalten. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Backbuffer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Yep, die 4. Zeile ist wirklich umsonst. Also habe ich das richtig verstanden? Ich mache für die Types einfach noch ein Field tot=0 und anstatt sie dann per delete an gegebener Stelle zu löschen, stelle ich tot auf 1 und am Ende der Schleife schau ich dann per if, ob für das Type tot=1 und lösche es erst dann per delete. | ||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Genau so.
Achte aber drauf, du musst die Types am ende der Aktualisierungsschleife Löschen, nicht innerhalb der verschachtelten Schleifen für Kollision etc., da setzt du nur tot=1. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Backbuffer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hab' den Code jetzt umgestellt und lösche die Types in einer extra Funktion. Wirklich viel übersichtlicher und schöner. Danke für die Hilfe. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group