Problem mit "object does not exist"

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Razor1994

Betreff: Problem mit "object does not exist"

BeitragMi, Mai 12, 2010 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
So ich bins schon wieder. Ich weiss kein einfallsreicher Titel aber mir ist nichts passenderes eingefallen.
Mein Problem ist:
Ich hatte vor ein kleines Programm zu schreiben das eine Zelle darstellt die "frisst", grösser wird, sich teilt und die 2 neuen Zellen wieder "fressen" usw.
Aber wenn sich die Zelle geteilt hat und auf ein Futterteilchen stösst kommt die Fehlermeldung. Und zwar bei der Funktion Zellewachstum bei rectsoverlap. Hier der Code: [AUSKLAPPEN]
Global screen_x = 640
Global screen_y = 480

Graphics screen_x, screen_y,0,0
SetBuffer BackBuffer()

SeedRnd MilliSecs()
;variablen
Global frametimer = CreateTimer(30)
Global counter
Global richtung = 1
Global anzahlf
;Types

Global rund.zellentyp
Type zellentyp
   Field x
   Field y
   Field groesse
   Field counter
End Type

rund = New zellentyp
rund\x = 300
rund\y = 400
rund\groesse = 50
counter = 0

Global rund2.futter
Type futter
   Field x
   Field y
   Field groesse
   Field naehrwert
End Type

anzahl = Rnd(1,30)
For i = 1 To anzahl
   rund2 = New futter
   rund2\x = Rnd(10,630)
   rund2\y = Rnd(10,470)
   rund2\groesse# = 10
   rund2\naehrwert# = Rnd(1,5)
Next


;Hauptschleife
Repeat
WaitTimer(frametimer)
Cls

   ZelleBewegen
   ZelleWachstum
   Futter
   Zeichnen

Flip 0
Until KeyHit(1)
End

;Funktionen
Function ZelleBewegen()
For rund.zellentyp = Each zellentyp
   rund\counter = rund\counter + 1
   If rund\counter = 30 Then
      richtung = Rnd(0,5)
      rundcounter = 0
   EndIf
   If richtung = 1 Then
      rund\x = rund\x + Rnd(0,3)
      rund\y = rund\y - Rnd(0,3)
   ElseIf richtung = 2 Then
      rund\x = rund\x + Rnd(0,3)
      rund\y = rund\y + Rnd(0,3)
   ElseIf richtung = 3 Then
      rund\x = rund\x - Rnd(0,3)
      rund\y = rund\y + Rnd(0,3)
   ElseIf richtung = 4 Then
      rund\x = rund\x - Rnd(0,3)
      rund\y = rund\y - Rnd(0,3)
   EndIf
   
;randbegrenzungen
   If rund\x => screen_x - rund\groesse Then
      rund\x = rund\x - 5
   ElseIf rund\x =< 0 Then
      rund\x = rund\x + 5
   EndIf

   If rund\y => screen_y - rund\groesse Then
      rund\y = rund\y - 5
   ElseIf rund\y =< 0 Then
      rund\y = rund\y + 5
   EndIf
Next
End Function


Function Futter()
   If KeyHit(28) Then
   SetupFutter
   EndIf
End Function


Function Zeichnen()
For rund2.futter = Each futter
   Oval rund2\x, rund2\y, rund2\groesse, rund2\groesse
Next
For rund.zellentyp = Each zellentyp
   Oval rund\x, rund\y, rund\groesse, rund\groesse
Next
End Function


Function ZelleWachstum()
For rund2.futter = Each futter
   For rund.zellentyp = Each zellentyp
      If RectsOverlap (rund2\x, rund2\y, rund2\groesse, rund2\groesse, rund\x, rund\y, rund\groesse, rund\groesse) Then
      rund\groesse = rund\groesse + rund2\naehrwert
      Delete rund2.futter
      EndIf
   Next
Next

For rund.zellentyp = Each zellentyp
   If rund\groesse => 100 Then
   rund\groesse = 50
   rund = New zellentyp
   rund\groesse = 50
   rund\counter = 0
   EndIf
Next
End Function


Function SetupFutter()
anzahlf = Rnd(1,30)
For i = 1 To anzahlf
   rund2 = New futter
   rund2\x = Rnd(10,630)
   rund2\y = Rnd(10,470)
   rund2\groesse# = 10
   rund2\naehrwert# = Rnd(1,5)
Next
End Function

edit: da es keine bilder braucht könnt ihr es auch einfach bei euch laufen lassen um zu sehen was ich meine.
User posted image
kommt in meinen Runescape clan
  • Zuletzt bearbeitet von Razor1994 am Mi, Mai 12, 2010 18:38, insgesamt einmal bearbeitet

mpmxyz

BeitragMi, Mai 12, 2010 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
"Object does not exist" Wink
BlitzBasic: [AUSKLAPPEN]
For rund2.futter = Each futter
For rund.zellentyp = Each zellentyp
If RectsOverlap (rund2\x, rund2\y, rund2\groesse, rund2\groesse, rund\x, rund\y, rund\groesse, rund\groesse) Then
rund\groesse = rund\groesse + rund2\naehrwert
Delete rund2.futter
EndIf
Next
Next

Hier hast du eine Sache nicht bedacht:
Nachdem rund2 gelöscht wurde, kann es sein, dass weitere Kollisionen geprüft werden, da nach der geprüften Zelle weitere Zellen folgen können. Da das zu prüfende Objekt aber schon gelöscht wurde, gibt es die entsprechende Fehlermeldung.
Hier bietet sich ein Exit an, um die innere Schleife vorzeitig zu verlassen.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

Razor1994

BeitragMi, Mai 12, 2010 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Also 1. Natürlich heisst es "object does not exist" welch dummer Fehler Embarassed Weiss aber nicht wie man das ändern kann.
2. Ich war in der Hilfe wegen Exit aber weiss jetzt nicht ob ich das ganz richtig kapiert habe. Währe der code dann so? So funktionierts nämlich.
Code: [AUSKLAPPEN]
For rund2.futter = Each futter
   For rund.zellentyp = Each zellentyp
      If RectsOverlap (rund2\x, rund2\y, rund2\groesse, rund2\groesse, rund\x, rund\y, rund\groesse, rund\groesse) Then
      rund\groesse = rund\groesse + rund2\naehrwert
      Delete rund2.futter
      exit
      EndIf
   Next
Next
User posted image
kommt in meinen Runescape clan

mpmxyz

BeitragMi, Mai 12, 2010 18:29
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Halte mal nach diesem Symbol Ausschau: user posted image
2. Warum muss man zweifeln, wenn der Code so funktioniert, wie er funktionieren sollte? Wink
Du scheinst den Befehl richtig verstanden zu haben: Mit Exit springt man aus einer Schleife.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
  • Zuletzt bearbeitet von mpmxyz am Mi, Mai 12, 2010 18:30, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragMi, Mai 12, 2010 18:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde sicherheitshalber ausschließen, dass rund und rund2 das Selbe Objekt sind... wenn trotzdem klappt - um so besser - aber man kann ja nie wissen...
Code: [AUSKLAPPEN]
For rund2.futter = Each futter
   For rund.zellentyp = Each zellentyp
      If rund <> rund2 Then
         If RectsOverlap (rund2\x, rund2\y, rund2\groesse, rund2\groesse, rund\x, rund\y, rund\groesse, rund\groesse) Then
            rund\groesse = rund\groesse + rund2\naehrwert
            Delete rund2.futter
            Exit
         EndIf
      EndIf
   Next
Next
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)

mpmxyz

BeitragMi, Mai 12, 2010 18:31
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres:
*HUST*
"rund" ist ein "zellentyp" und "rund2" ist ein "futter".
Wie hast du es geschafft, dass diese Bedingung mal nicht zutrifft? Wink
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Xeres

Moderator

BeitragMi, Mai 12, 2010 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaub, ich hab in letzter Zeit was an den Augen... Rolling Eyes (aber wer benutzt schon rund und rund2 für verschiedene Types? Confused ) Aber sollten sich rein evolutionär mal Fresszellen entwickeln, die andere Zellen verspeisen...
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)
 

Razor1994

BeitragMi, Mai 12, 2010 18:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Also Xeres (ich les irgendwie immer Xerxes^^)
Ich nehme rund und rund2 für verschiedene Types weil ich auch noch quadratische plane. Und das mit den Fresszellen ist eine Gute Idee die bau ich gleich ein.(oder versuchs zumindest. Falls ichs nicht schaffen sollte erfahrt ihrs als erste^^)
User posted image
kommt in meinen Runescape clan

M0rgenstern

BeitragFr, Mai 14, 2010 17:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ich weiß jetzt nicht, ob der Fehler behoben wurde, aber mir kommt die erste Zeile in diesem Codeblock komisch vor:
BlitzBasic: [AUSKLAPPEN]
Global rund2.futter 
Type futter
Field x
Field y
Field groesse
Field naehrwert
End Type


Du deklarierst den Typ Futter erst danach, daran könnte es liegen.

Sorry wenn ich Müll rede, habe länger nicht mehr mit BB Types gearbeitet.

Lg, M0rgenstern

mpmxyz

BeitragFr, Mai 14, 2010 18:42
Antworten mit Zitat
Benutzer-Profile anzeigen
@M0rgenstern
Es ist (fast) egal, wo man seine Types deklariert.
Es sind nur Definitionen für ein paar Daten, aber kein echter Code, welcher ausgeführt wird.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

M0rgenstern

BeitragFr, Mai 14, 2010 19:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, ich hab mich eher an der Deklaration BlitzBasic: [AUSKLAPPEN]
Global rund2.futter
gestört.
Da war ich mir nicht so sicher bei.

Lg, M0rgenstern

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group