Was mache ich da falsch?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Yankee

Betreff: Was mache ich da falsch?

BeitragMo, Mai 01, 2006 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Ich wollte mal wissen was ich da bei meinem Code falsch mache...
Also ich habe jetzt zum ersten mal einen animimage selber ausprobiert, aber es funktionier, wie meistens auch, nicht... Sad
Das Spiel läuft ganz normal, bis ich den Feind treffe, da kommt dann immer eine Meldung "Objekt does not exist" oder so...
Hier der Code:(is net lange)
Code: [AUSKLAPPEN]

Graphics 640,480;,16,1

Global me = LoadImage("me.bmp")
Global feind = LoadImage("feind.bmp")
Global bullet = LoadImage("bullet.bmp")
Global explosion = LoadAnimImage("explosion.bmp",48,48,0,10)

Global tot = LoadSound("boom.wav")
Global music = PlayMusic("darkworld2.mod")

Global me_x = 320
Global me_y = 400
Global feind_x = 320
Global feind_y = 10
Global feind_speed = 1

SetBuffer BackBuffer()

While Not KeyHit(1)
   
   Cls

   me
   gegner
   anderes
   
   Flip
   
Wend
Function anderes()
   For neu.schuss = Each schuss
      neu\y = neu\y - 5
      If ImagesCollide(feind,feind_x,fend_y,0,bullet,neu\x,neu\y,0) Then
         PlaySound tot
         Delete neu.schuss
         feind_x = Rnd(10,610)
         ex.explosion = New explosion
         ex\x = feind_x
         ex\y = feind_y
         ex\time = MilliSecs()
         ex\nr = 0
      EndIf
      DrawImage bullet,neu\x,neu\y
      If neu\y < 0 Then
         Delete neu.schuss
      EndIf
   Next
   For ex.explosion = Each explosion
      If ex\time + 50 < MilliSecs()
         ex\nr = ex\nr + 1
         DrawImage explosion,ex\x,ex\y,ex\nr
         If ex\nr = 10 Then Delete ex.explosion
      EndIf
   Next
   DrawImage me,me_x,me_y
   DrawImage feind,feind_x,feind_y
End Function

Function gegner()
   feind_x = feind_x + feind_speed
   If feind_x < 10 Or feind_x > 610 Then feind_speed = -feind_speed
End Function

Function me()
   If KeyDown(203) Then
      me_x = me_x - 3
   EndIf
   If KeyDown(205) Then
      me_x = me_x + 3
   EndIf
   If KeyHit(57) Then
      neu.schuss = New schuss
      neu\x = me_x
      neu\y = me_y - 10
   EndIf
   If me_x < 10 Then me_x = 10
   If me_x > 610 Then me_x = 610
End Function

Type explosion
   Field x
   Field y
   Field nr
   Field time
End Type

Type schuss
   Field x
   Field y
End Type

Bitte brauche Hilfe....

Danke im Vorraus,

Yankee
Um so kleiner der code, um so schwieriger den Fehler zu finden:


Siehst du den Fehler?
Klick mal hier drauf... hehehe

Hubsi

BeitragMo, Mai 01, 2006 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
      If ImagesCollide(feind,feind_x,fend_y,0,bullet,neu\x,neu\y,0) Then
PlaySound tot
Delete neu.schuss
Dort wird evtl. der Schuss gelöscht, und hier:BlitzBasic: [AUSKLAPPEN]
      If neu\y < 0 Then
Delete neu.schuss
EndIf
unter Umständen nochmal. Und schon meckert der Compiller weil der Eintrag gar nicht mehr existiert Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Artemis

BeitragMo, Mai 01, 2006 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
@Hubsi, nicht ganz Twisted Evil !

Es wird neu\y abgefragt, aber das Objekt neu existiert nicht mehr, falls die Kollision erfolgte.

Yankee

BeitragDi, Mai 02, 2006 11:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Ähm.....
Also der neu.schuss wird doch schon gelöscht, wieso will er den dann nochmal abfragen, wenn ich ihn doch schon gelöscht habe?^^ Shocked
Ich äh... kapier da grad nichts.....
Könnt ihr bitte nochmal helfen?

Danke,

Yankee
Um so kleiner der code, um so schwieriger den Fehler zu finden:


Siehst du den Fehler?
Klick mal hier drauf... hehehe

D2006

Administrator

BeitragDi, Mai 02, 2006 11:58
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
01   For neu.schuss = Each schuss
02 neu\y = neu\y - 5
03 If ImagesCollide(feind,feind_x,fend_y,0,bullet,neu\x,neu\y,0) Then
04 PlaySound tot
05 Delete neu.schuss
06 feind_x = Rnd(10,610)
07 ex.explosion = New explosion
08 ex\x = feind_x
09 ex\y = feind_y
10 ex\time = MilliSecs()
11 ex\nr = 0
12 EndIf
13 DrawImage bullet,neu\x,neu\y
14 If neu\y < 0 Then
15 Delete neu.schuss
16 EndIf
17 Next


In Zeile 01 startet die Schleife, in der jedes Element abgeklappert wird. In Zeile 03 wird dann ja geprüft, ob eine Kollision vorhanden ist. In Zeile 05 wird, falls es zur Kollision kam, der aktuelle Typeintrag gelöscht. Wir sind aber immernoch in der Schleife! Er geht also auch noch die restlichen Zeile durch und schon wird auf Zeile 13 auf "neu\x" und "neu\y" zugegriffen. Da wir aber "neu" schon gelöscht haben, existieren diese "x" und "y" nicht mehr und es kommt zu einem Absturz.

Wie du das umgehen kannst: Du musst die Schleife so programmieren, dass der Typeeintrag als letztes in der Schleife gelöscht wird und danach nicht nochmal darauf zugegriffen wird!

MfG
D2006
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Yankee

BeitragDi, Mai 02, 2006 18:18
Antworten mit Zitat
Benutzer-Profile anzeigen
achso..... bin ich doof^^ Shocked
Egal danke nochmal für alles.

Danke danke,

Yankee
Um so kleiner der code, um so schwieriger den Fehler zu finden:


Siehst du den Fehler?
Klick mal hier drauf... hehehe

Kryan

BeitragDi, Mai 02, 2006 19:02
Antworten mit Zitat
Benutzer-Profile anzeigen
eins verstehe ich da auch nicht:

in zeile 05 wird ja neu.schuss gelöscht und schon in zeile 14 wird neu\y verlangt?!! ist bisschen kontrovers!!
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group