schießen und collidieren?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

andre

Betreff: schießen und collidieren?

BeitragDi, Jan 25, 2011 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
hey leute ich habe leider noch ein problem in meinen spiel willich einmal die targets mit schüssen abschießen (und zerstören) oder die targets mit meinem raumschiff berühren und somit zerstören aber das problem ist es funktioniert immer nur eins von beidem und es kann beim schießen auch entweder nur der schuss oder das target deletet werden hier mein beispiel

Code: [AUSKLAPPEN]
For computerschuss1nr2.shoot1nr2=Each shoot1nr2
for playerschuss.shoot=each shoot
If ImagesCollide(shooter,x,y,0,erdbeere,computerschuss1nr2\shoot1x2,computerschuss1nr2\shoot1y2,0) Then
Delete computerschuss1nr2
punktezaeler=punktezaeler+7
EndIf

If ImagesCollide(kanonenkugel,playerschuss\shootx,playerschuss\shooty,0,erdbeere,computerschuss1nr2\shoot1x2,computerschuss1nr2\shoot1y2,0) Then
Delete playerschuss
delete computerschuss1nr2
endif
;es kann nur eins von beiden collides ausgeführt werden und beim zweiten kann entweder nur der playerschuss deletet werden oder der computerschuss1nr2
next
Next


Danke für jede hilfe
MFG andre

Midimaster

BeitragDi, Feb 01, 2011 10:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Leider ist Dein Beispiel sehr unübersichtlich und für Dritte schwer zu lesen, aber ich glaube, es könnte daran liegen, dass Du das Objekt zerstörst, während es in der FOR/NEXT-Schleife noch benötigt wird.

Die äußere FOR/NEXT durchläuft ja "shoot1nr2 " mit der Zählvariablen "computerschuss1nr2". Nun könnte es ja sein, dass dieses "computerschuss1nr2" in der oberen Hälfte des Codes mit DELETE gelöscht wird. In der unteren Hälfte kommt es aber noch in der Zeile...
Code: [AUSKLAPPEN]
...
If ImagesCollide(kanonenkugel,playerschuss\shootx,playerschuss\shooty,0,erdbeere,computerschuss1nr2\shoot1x2,computerschuss1nr2\shoot1y2,0) Then
...

...vor. So kommt es nie zum Erfüllen des 2.IF. Auch beim nächsten (inneren) Schleifendurchlauf wird es noch verwendet werden, obwohl es schon gelöscht ist.

mögliche Lösung:
merke Dir, in der oberen Hälfte, dass Du löschen willst in einem Flag, lösche dann "computerschuss1nr2" lieber erst kurz vor dem NEXT.

Tipp zum Schreibstil: Die Namen von Zählvariablen dürfen auch etwas kürzer sein....dann ist das Ganze besser lesbar:
Code: [AUSKLAPPEN]
For locC.Shoot1nr2 = Each Shoot1nr2
    For locP.Shoot=each Shoot
        If ImagesCollide(Shooter, x, y, 0, Erdbeere, locC\Shoot1x2, locC\Shoot1y2, 0) Then
            Delete locC
            PunkteZaeler=PunkteZaeler+7
        EndIf

        If ImagesCollide(KanonenKugel, locP\Shootx, locP\Shooty, 0, Erdbeere, locC\Shoot1x2, locC\Shoot1y2, 0) Then
            Delete locP
            Delete locC
        Endif
    Next
Next



So und jetzt noch das mit dem späten Löschen:
Code: [AUSKLAPPEN]
For locC.Shoot1nr2 = Each Shoot1nr2
    locC_weg=0
    For locP.Shoot=each Shoot
        If ImagesCollide(Shooter, x, y, 0, Erdbeere, locC\Shoot1x2, locC\Shoot1y2, 0) Then
            locC_weg=1
            PunkteZaeler=PunkteZaeler+7
        EndIf

        If ImagesCollide(KanonenKugel, locP\Shootx, locP\Shooty, 0, Erdbeere, locC\Shoot1x2, locC\Shoot1y2, 0) Then
            Delete locP
            locC_weg=1
        Endif   
    Next
        ; erst hier wird es nicht mehr benötigt:
        If locC_weg=1 Then
            Delete locC
        Endif
Next

ToeB

BeitragDi, Feb 01, 2011 11:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Und noch ein kleiner Tipp am Rande : ImagesCollide mag zwar verlockend sein, ist aber nicht so schön, es führt zu Fehlern (MAV's) und so sonderlich schnell ist es auch nicht, und vor allem für Schüsse ist es nicht gemacht. Benutze hierfür lieber RectsOverlap, dann setzt du einfach ein imaginäres Rechteck um den Spieler und um den Schuss, und dann gibst du die Koordinaten bei RectsOverlap ein und du hast ein schönes, schnelles und sicheres Ergebnis Wink


mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Ana

BeitragDi, Feb 01, 2011 15:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu deinem Problem Andre,
ich denke das Problem ist das du in der zweiten abfrage hin und wieder auf ein schon gelöschtes Objekt zu greifen willst, denke das einfachste wäre, am ende jeder If-Bedingung ein exit/return je nach dem wie es im code vorkommt zu verwenden.
Glaube das sagt midi auch, war aber zu faul mir das alles durch zu lesen ...

Und zu Rectoverlape, für Schüsse find ich Rectoverlape nicht so toll, wenn man mit ziemlich rechteckigen Dingen zu tun hat, mag auch das verlockend sein, aber besser wäre es meiner Meinung nach wenn du jedem objekt einen Radius gibst und schaust ob Wurzel ( (x1 - x2)^2 + (y1 - y2)^2) kleiner ist als Radius1 + radius2, denk das ist auch laufzeit freundlicher.
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group