schießen und collidieren?
Übersicht

andreBetreff: schießen und collidieren? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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![]() ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group