Typekollision funktionert mal und mal nicht! - erledigt!

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

GargaMel

Betreff: Typekollision funktionert mal und mal nicht! - erledigt!

BeitragSo, Jan 17, 2010 13:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey, ich hab mich jetzt mal ein bisschen mit Types auseinandergesetzt und bin nu leider auf ein Problem gestoßen, des mich noch innen wahnsinn treibt. Da ich durch die SuFu keine Lösung gefunden hab, hoff ich, dass ihr mir weiterhelfen könnt. Folgendes Problem:
Ich hab das Type
Code: [AUSKLAPPEN]
Type komet
   Field x#
   Field y#
   Field vx#
   Field vy#
End Type

und weiter:
Code: [AUSKLAPPEN]
Function komet_erstellen()
   komet1.komet = New komet
   komet1\x = Rand(200,400)
   komet1\y = Rand(200,400)
   komet1\vx = Rnd(-0.4,0.4)
   komet1\vy = Rnd(-0.4,0.4)
End Function

Function komet_zeichnen()
   For komet1.komet = Each komet
      komet1\x = komet1\x + komet1\vx
      komet1\y = komet1\y + komet1\vy
      
      Color 255,255,255
      
      Oval komet1\x,komet1\y,13,13
      
   Next
End Function

Function kollision()
   For komet1.komet = Each komet
      For komet2.komet = Each komet
         If komet1.komet <> komet2.komet Then
            If RectsOverlap(komet1\x,komet1\y,13,13,komet2\x,komet2\y,13,13) Then
               Delete komet2.komet
               Delete komet1.komet
            EndIf
         EndIf
      Next
   Next
End Function


Wenn ich nu alles in mein Programm hau:
Code: [AUSKLAPPEN]
Graphics 1024,768,16,1

SetBuffer BackBuffer()
SeedRnd MilliSecs()

Type komet
   Field x#
   Field y#
   Field vx#
   Field vy#
End Type


Repeat
   Cls
   
   If KeyHit(9) Then komet_erstellen()
   komet_zeichnen()
   kollision()
   
   Flip
Until KeyHit(1) End




Function komet_erstellen()
   komet1.komet = New komet
   komet1\x = Rand(200,400)
   komet1\y = Rand(200,400)
   komet1\vx = Rnd(-0.4,0.4)
   komet1\vy = Rnd(-0.4,0.4)
   
   
End Function
Function komet_zeichnen()
   For komet1.komet = Each komet
      komet1\x = komet1\x + komet1\vx
      komet1\y = komet1\y + komet1\vy
      
      Color 255,255,255
      
      Oval komet1\x,komet1\y,13,13
      
   Next
   
End Function
Function kollision()
   For komet1.komet = Each komet
      For komet2.komet = Each komet
         If komet1.komet <> komet2.komet Then
            If RectsOverlap(komet1\x,komet1\y,13,13,komet2\x,komet2\y,13,13) Then
               Delete komet2.komet
               Delete komet1.komet
            EndIf
         EndIf
      Next
   Next
End Function


dann hab ich das Problem, dass die Kollision nur manchmal funktioniert. Wenn nicht, dann kommt die Fehlermeldung "Object does not exist". Ich hab die vermutung, dass die Kollision nur zwischen zwei hintereinander erstellten Kometen abläuft, andere melden den Fehler. Aber eig dürfte des doch auch nicht sein, da ich doch die Bedingung 'If komet1.komet <> komet2.komet Then . . .' drinne hab. Andererseits hab ich leider auch kp, wie ich des anders machn könnt.
Helft mir doch bitte, ich bin hier am durchdrehn . . .

thx
GargaMel
  • Zuletzt bearbeitet von GargaMel am So, Jan 17, 2010 13:35, insgesamt einmal bearbeitet

Noobody

BeitragSo, Jan 17, 2010 13:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Exit nach dem löschen der beiden Kometen ist wichtig, da du beide Kometen löschst, aber im nächsten Schleifendurchlauf wieder auf den gelöschten zugreifst (per komet1\x).

Du musst also aus der inneren Schleife springen, wenn du beide Kometen gelöscht hast.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Xeres

Moderator

BeitragSo, Jan 17, 2010 13:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem liegt da:
Code: [AUSKLAPPEN]
Delete komet2.komet
Delete komet1.komet
Du Löschst beide Kometen, dann macht die innere Schleife weiter, Komet2 enthält wieder ein Objekt, aber Komet1 ist Null -> auf Felder zugreifen gibt einen Fehler.
Ein Zusätzliches Feld im Type benutzen, das angibt, ob der Komet bei nächster Gelegenheit gelöscht werden soll, z.B. nach dem Zeichnen...

Code: [AUSKLAPPEN]
 Oval komet1\x,komet1\y,13,13
      if komet1\killMe = True then delete komet1
   Next


Edit: Uh,okay, Exit sollte natürlich auch gehen...
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)
 

GargaMel

BeitragSo, Jan 17, 2010 13:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey danke Leute für die schnellen Antworten! Funktioniert nu einwandfrei Very Happy

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group