Kollisionsproblem...

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Flachzange

Betreff: Kollisionsproblem...

BeitragSo, Apr 16, 2006 15:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute!

Schon bissl länger her, dass ich mal hier war aber erst die Semesterferien ließen mir die Zeit, mal wieder die dicke Staubschicht von meiner Blitz-CD abzuwischen Smile Jetzt bin ich leider auf ein Problem gestoßen, dass mir irgendwie nen Knoten im Kopf verursacht Confused

Folgendes:
ich hab ein paar Fallschirmspringer, die vom Himmel zu Boden segeln. Aufgabe des Spielers ist es, sie mit Hilfe eines befestigten Geschützturmes vom Himmel zu pusten. Ich habe also ein Type für die Fallschirmspringer, sowie ein Type für die "Kanonenkugeln". Dreh- und Angelpunkt der ganzen Geschichte ist jetzt natürlich die Kollisionsabfrage, die prüft ob ein Fallschirmspringer von einer der Kugeln getroffen wurde.
Die Routine sieht folgendermaßen aus:
BlitzBasic: [AUSKLAPPEN]

Function CheckColls()
For enemy.craft = Each craft
For shell.bullet = Each bullet
If ImagesCollide(bullet_gfx,shell\x#,shell\y#,0,diver(enemy\frame),enemy\x#,enemy\y#,0) Then
Delete shell.bullet
Delete enemy.craft

EndIf
Next
Next
End Function


Das funktioniert auch ganz prima. Der Fallschirmspringer wird getroffen und gelöscht - ebenso die Kugel. Allerdings funktioniert datt nur wenn gerade nur EINE Kugel durch den Himmel fliegt. Sollte sich irgendwo noch weitere Kugeln befinden quittiert das der Debugger mit einem Runtime-Error: "Object does not exist"
Ich nehme also an, dass meine Schleifenstruktur irgendwie alle Kugel-Instanzen (shell.bullet) killt..? Aber wieso?
Noch als Randnotiz: sobald eine Kugel die Bildschirmgrenze (800x600) erreicht, wird ihre Type-Instanz gelöscht.

Könnte mir vielleicht jemand mit nem Gedankenanstoß helfen?

Danke,
Flachzange
I'm no superman...!
 

Dreamora

BeitragSo, Apr 16, 2006 15:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein das Problem ist das du Craft löscht, während du noch in der inneren schleife bist. Die restlichen Shells wollen dann natürlich auch auf die Kollision mit dem Craft überprüfen ... nur existiert dieses nicht mehr.


Es gibt zwei Möglichkeiten:

1. Du benützt, nachdem das Craft kollidiert ist, Exit nach den beiden Deletes um die noch verbleibenden Bullets nimmer zu überprüfen (wahrscheinlich die gewollte Reaktion)

2. Du setzt eine Variable auf true, die besagt, dass das aktuelle craft zerstört werden kann.
Nach dem Next der Shell Loop überprüfst du dann ob die Variable true ist. Wenn ja zerstörst du das Craft und setzt die Variable wieder false und lässt die Loop mit dem nächsten Craft weitermachen. Ist umständlicher, sorgt aber dafür, dass alle Shells die mit dem Craft kollidiert wären bei diesem Check gelöscht werden, bevor das Craft zerstört wird.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Flachzange

BeitragSo, Apr 16, 2006 15:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohhh Dreamora.... Embarassed
Danke...das war soo simpel.... vielen, vielen Dank!
Wahrscheinlich hab ich mich schon zu lange mit diesem Codeschnipsel rumgeärgert und das wesentliche nicht mehr gesehn! Shocked

Danke nochmal!
I'm no superman...!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group