"Object does not Exist"-Fehler

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Garik

Betreff: "Object does not Exist"-Fehler

BeitragMi, Aug 02, 2006 18:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn im folgenden Code das erste Teilchen auf die Tür trifft, erscheint in der Zeile
"If Atom\Ladung=0 And tuer=1 And Atom\Y <=300 Then" die Fehlermeldung "Object does not exist". Wie behebe ich diesen Fehler?
Zur besseren Übersicht hab ich mal die für den Fehler möglicherweise relevanten Stellen markiert.

Graphics 1280,1024,32,1
SetBuffer BackBuffer()
SeedRnd MilliSecs()

;Einlesen der Grafiken
Positiv=LoadImage("Positivteilchen.png")
Negativ=LoadImage("Negativteilchen.png")
Zielbox=LoadImage("Zielbox.png")
Global Tuer_Auf=LoadImage("Tür_Auf.png")
Global Tuer_Zu=LoadImage("Tür_Zu.png")

;Font
Global Lebenfont=LoadFont("Arial",60,1,0,0)
Global Gameoverfont=LoadFont("Arial",250,1,0,0)

SetFont lebenfont

;Konstanten
Const tuer_x=585
Const tuer_y=296

;Variablen

Geschw=2 ;2 Pixel pro Durchlauf
Global tuer=1 ;Tür offen
Global Leben=4


;Types
Type Teilchen
Field X ;X-Position
Field Y ;Y-Position
Field Ladung ;Negativ/Positiv
End Type



Global Atom.Teilchen



;Hauptschleife
Repeat
ClsColor 0,0,0
Cls


;Teilchen werden gezeichnet
For Atom.Teilchen = Each Teilchen
If Atom\Ladung = 1 Then
DrawImage Positiv,Atom\X,Atom\Y
End If
If Atom\Ladung = 0 Then
DrawImage Negativ,Atom\X,Atom\Y
End If
Atom\Y = Atom\Y - Geschw
If Atom\Y <= 300 Then Delete Atom.Teilchen
a=a+1
leben
Next

If MilliSecs() - Timer1 > 500 Then
Timer1 = MilliSecs()
GenTeilchen
End If


;Zeichnen der Zielbox
DrawImage Zielbox,490,0

;Türsteuerung
Tuersteuerung


Flip
Until KeyHit(1)
End


;Generierung der Teilchen
Function GenTeilchen()

Atom.Teilchen = New Teilchen
Atom\X = Rand(600,650) ;zufällige X-Pos
Atom\Y = 1024 ;Y-Pos
Atom\Ladung = Rand(0,1) ;0 = Negativ, 1 = Positiv
End Function



;Steuerung der Tür
Function Tuersteuerung()

;Tür wird in jeweiligem Zustand gezeichnet
If tuer=0 Then
DrawImage tuer_zu,tuer_x,tuer_y
End If
If tuer=1 Then
DrawImage tuer_auf,tuer_x,tuer_y
End If


;Beim Drücken der Leertaste ändert sich der Zustand der Tür
If KeyHit(57) Then
tuer=tuer+1
If tuer>1 Then
tuer=0
End If
End If

End Function

Function Leben()

;Leben werden angezeigt
Text 628,15,Leben


;Game Over, wenn keine Leben mehr
If Leben=0 Then
SetFont gameoverfont
Text 50,350,"Game Over"
Delay 3000
End
End If

;Leben verlieren, wenn Negativteilchen reinkommt
If Atom\Ladung=0 And tuer=1 And Atom\Y <=300 Then
Leben=Leben-1
End If

End Function


Thx im Voraus
 

Dreamora

BeitragMi, Aug 02, 2006 18:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Indem du Atom auch an die Funktion übergibst.
Da eine Funktion ein abgeschlossener Variablenraum ist, hat die Funktionen keinen Schimmer was ausserhalb existiert, falls es nicht global definiert ist.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Hubsi

BeitragMi, Aug 02, 2006 18:53
Antworten mit Zitat
Benutzer-Profile anzeigen
If Atom\Y <= 300 Then Delete Atom.Teilchen -> Hier löscht Du den Eintrag und gleich darauf wird in der Function leben() versucht auf diesen Eintrag nochmals zuzugreifen.
Abhilfe verschafft die Function vor dem löschen aufzurufen, oder, wenn dies die Programmfunktion beeinträchtigen würde, die Function nur aufzurufen wenn der Eintrag nicht Null ist:
Code: [AUSKLAPPEN]
if atom.teilchen<>null leben()
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Garik

BeitragMi, Aug 02, 2006 19:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Thx für die schnellen Antworten erstmal.

@Dreamora
Typeobjekte sind doch automatisch global oder? Außerdem hab ich Atom.Teilchen zur Sicherheit trotzdem globalisiert, daran kann es also nicht liegen, trotzdem thx. Wink

@Hubsi
Wenn ich deine Zeile einfüge, kommt keine fehlermeldung mehr, aber die Leben werden immer noch nicht abgezogen, da muss ich nomma genauer gucken, ob ich vllt etwas übersehen hab.

Hubsi

BeitragMi, Aug 02, 2006 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann würde ein aufrufen der Function leben() noch vor dem löschen des Eintrags dem wohl Abhilfe schaffen, bzw. schlicht die Abfrage ob ein Leben gelöscht werden soll aus der Function raus und in die Schleife reinzunehmen.
Und Types sind nicht standardmäßig global (verwechselst Du vielleicht mit Arrays), sonst würde die Zeile
Zitat:
Global Atom.Teilchen

auch kaum Sinn machen Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Garik

BeitragMi, Aug 02, 2006 19:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Very Happy
dass ich da nicht selbst draufgekommen bin...
 

Dreamora

BeitragMi, Aug 02, 2006 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt scheint global zu sein
Bitte benutze das nächste mal [ code] [ /code] um den Code richtig formatiert einzufügen. Das heisst Tabulator wenn du in ein If oder eine Schleife oder eine Funktion kommst und so.
Einfach damit code lesbar ist.

Ach ja: .Teilchen musst du net jedes Mal schreiben. Es reicht wenn du es bei der Definition machst. Danach ist die Variable immer vom Type Teilchen und kann von keinem anderen Type mehr sein. (soll Leute geben die behaupten das erhöhe die Lesbarkeit, was kompletter Blödsinn ist. Dann würden sie besser einen TypeKürzerl vorne anhängen, wie teil für .Teilchen -> teilAtom)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group