Allgemeine Frage zum Schleifenaufbau mit Types

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Backbuffer

Betreff: Allgemeine Frage zum Schleifenaufbau mit Types

BeitragDi, Feb 05, 2008 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 05, 2008 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 05, 2008 17:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 05, 2008 18:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Sad
Schalte mal den debugger an und schaue wo immer die Fehlermeldung kommt, wenn du die Exits weglässt.

MM
 

Backbuffer

BeitragDi, Feb 05, 2008 18:18
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Xeres

Moderator

BeitragDi, Feb 05, 2008 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Fehlt bei dem Code nicht eine umschließende Schleife die den Tshot - Type durchgeht...?
Code: [AUSKLAPPEN]
If shot = Null Then Exit   
   DrawImage [...]
   ;Schuss wird gemalt
   If ship= Null Then Exit
   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.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Backbuffer

BeitragDi, Feb 05, 2008 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Xeres

Moderator

BeitragDi, Feb 05, 2008 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Backbuffer

BeitragMi, Feb 06, 2008 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group