Programm stürzt aus ab - warum?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Sirthaw

Betreff: Programm stürzt aus ab - warum?

BeitragMi, Sep 04, 2013 21:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Abend!

Ich arbeite gerade an einem simplen 2d Shooter, aber mein Programm stürzt ungefähr nach
20 Sekunden ab und ich weiß nicht warum.
Es erscheint dann die Meldung "Blitzcc.exe funktioniert nicht mehr". Dann wird nach einer Lösung gesucht, aber keine gefunden.
Ich habe die Stelle, die den Programmabsturz verursacht, auch schon gefunden, aber mir ist es ein
Rätsel warum mein Programm an dieser Stelle abstürzt.
Hier die Funktion, wo der Fehler auftritt :
Code: [AUSKLAPPEN]



Function createSatellit()

If zaehler_satellit=0 And anzahl_pflanze>=8 Then

  instanz.satellit = New satellit
  instanz\s_x = Rand(0,700)
  instanz\s_y = -50
  zaehler_satellit=1

EndIf

For instanz.satellit = Each satellit
  instanz\s_y = instanz\s_y +1
  DrawImage satellit_image,instanz\s_x,instanz\s_y

  If instanz\s_y=100 Then zaehler_satellit=0
  If instanz\s_y>600 Then Delete instanz.satellit


;HIER TRITT DAS PROBLEM AUF
  If ImagesCollide(satellit_image,instanz\s_x,instanz\s_y,0,spieler,spieler_pos_x,spieler_pos_y,0) Then
    Text 100,0,"Collision";
  endif



Next

End Function





Das Problem liegt also irgendwie an ImagesCollide.
Hoffentlich könnt ihr mir helfen.
Mfg, Sirthaw

Holzchopf

Meisterpacker

BeitragMi, Sep 04, 2013 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
In der Hilfe steht zu ImagesCollide Zitat:
Unter modernen Grafikkarten funktioniert der Befehl teilweise nicht mehr und es kann zu Abstürzen kommen. Daher wird eine Verwendung für Programme, die man weitergeben möchte, nicht empfohlen.

Genau der Fall scheint bei dir einzutreffen.

Eine typische Alternative wäre die Verwendung einer einfachen Distanzberechnung (mittels Phytagors). Das wird oft verwendet, funktioniert Computer-unabhängig und ist meines Wissens nach sogar deutlich schneller als die pixelweise Kollisionsdetektion. Ist zwar etwas ungenauer, fällt aber meistens in der Hitze des Gefechts keinem Spieler auf.

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

CO2

ehemals "SirMO"

BeitragMi, Sep 04, 2013 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube es war mal irgendwie sowas mit "ImagesCollide" führt bei manchen Grakas zu Abstürzen, allerdings habe ich schon lange nichts mehr mit BlitzBasic gemacht, kann das also nicht mit Sicherheit sagen.
Setz mal ImagesOverlap ein und probiers nochmal (Wenn die Kollision nicht pixelgenau sein muss, ist das sogar die schnellere Variante).

EDIT: Holzchopf war schneller Wink
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
 

Sirthaw

BeitragMi, Sep 04, 2013 21:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für Antworten. Ok, dann probiere ich das mal mit Pythagoras.
Bei ImagesOverlap tritt das selbe Problem auf.

Xeres

Moderator

BeitragMi, Sep 04, 2013 21:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Siehe: FAQ: ImagesCollide & Memory Access Violation ?!
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)
 

Sirthaw

BeitragMi, Sep 04, 2013 21:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, danke, die Funktion (ImgCollide) von BIG BUG ist interssant aber
da gibt es den selben Absturz.

Holzchopf

Meisterpacker

BeitragMi, Sep 04, 2013 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Sirthaw hat Folgendes geschrieben:
Bei ImagesOverlap tritt das selbe Problem auf.


Dann liegt das Problem aber nicht am ImagesCollide! Das (gepaart mit der Aussage, dass es erst nach 20Sek abstürze) kann eigentlich nur bedeuten, dass du irgendwo in deiner Hauptschleife eine Grafik lädst - was fehlschlägt sobald der Speicher voll ist. Sämtliche (Grafik-)Befehle die dann ein gültiges, existierendes Bild als Argument erwarten, werden dann leider den Absturz hervorrufen.

Kannst du bitte deine Hauptschleife nach LoadImage und LoadAnimImage durchforsten? Wenn du was findest - nimm's aus der Hauptschleife raus Wink

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

Sirthaw

BeitragMi, Sep 04, 2013 21:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, ich finde kein Loadimage in der Hauptschleife.
Ich poste mal den ganzen Code, hoffe das nutzt was. Smile

Code: [AUSKLAPPEN]


AppTitle "Shooter"

Graphics 800,600,16,2
SetBuffer BackBuffer()

SeedRnd MilliSecs()
timer = CreateTimer(50)

Global spieler = LoadImage("player.png")
Global shoot = LoadImage("shoot.png")
Global hintergrund = LoadImage("bg.png")
Global satellit_image = LoadImage("satellit.png")


Global kaktus = LoadImage("pflanze.png")

MaskImage satellit_image,255,0,255
MaskImage kaktus,255,0,255
MaskImage spieler,255,0,255
MaskImage shoot,255,0,255

Global spieler_pos_x=350, spieler_pos_y=500,shot_counter=0

Global zaehler_pflanze
Global zaehler_satellit

Global anzahl_pflanze


Type shot
 Field shot_x
 Field shot_y
End Type

Type planttype
  Field pflanze_x
  Field pflanze_y
End Type

Type satellit
 Field s_x
 Field s_y
End Type

Repeat
Cls

ClsColor 225,225,0

createKaktus()
createSatellit()
movePlayer()
createShoot()

Text 0,0,anzahl_pflanze


WaitTimer(timer)
Flip 0
Until KeyHit(1)



Function movePlayer()

  If KeyDown(203) Then spieler_pos_x = spieler_pos_x - 3
  If KeyDown(205) Then spieler_pos_x = spieler_pos_x + 3

  If KeyDown(200) Then spieler_pos_y = spieler_pos_y - 3
  If KeyDown(208) Then spieler_pos_y = spieler_pos_y + 3

  If spieler_pos_y>550 Then spieler_pos_y=550
  If spieler_pos_y<0 Then spieler_pos_y=0

  If spieler_pos_x<0 Then spieler_pos_x=0
  If spieler_pos_x>750 Then spieler_pos_x=750



  DrawImage spieler,spieler_pos_x,spieler_pos_y

End Function


Function createShoot()

  If KeyDown(57) Then
    shot_counter = shot_counter + 1
  EndIf

  If shot_counter = 5 Then

    info.shot = New shot
    info\shot_x = spieler_pos_x
    info\shot_y = spieler_pos_y
    shot_counter = 0

  EndIf

  For info.shot = Each shot
    info\shot_y = info\shot_y - 8
    DrawImage shoot,info\shot_x,info\shot_y
    If shot_y < 0 Then Delete info.shot
  Next

End Function




Function createKaktus()

If zaehler_pflanze=0 Then

 instanz.planttype = New planttype
 instanz\pflanze_x = Rand(0,750)
 instanz\pflanze_y = -50
 zaehler_pflanze=1
 anzahl_pflanze = anzahl_pflanze+1

EndIf



For instanz.planttype = Each planttype
  instanz\pflanze_y = instanz\pflanze_y+1
  DrawImage kaktus,instanz\pflanze_x,instanz\pflanze_y
 
  If instanz\pflanze_y=10 Then zaehler_pflanze=0
  If instanz\pflanze_y>600 Then Delete instanz.planttype
 


Next

End Function 



Function createSatellit()

If zaehler_satellit=0 And anzahl_pflanze>=8 Then

  instanz.satellit = New satellit
  instanz\s_x = Rand(0,700)
  instanz\s_y = -50
  zaehler_satellit=1

EndIf

For instanz.satellit = Each satellit
  instanz\s_y = instanz\s_y +1
  DrawImage satellit_image,instanz\s_x,instanz\s_y

  If instanz\s_y=100 Then zaehler_satellit=0
  If instanz\s_y>600 Then Delete instanz.satellit

  If ImagesCollide(satellit_image,instanz\s_x,instanz\s_y,0,spieler,spieler_pos_x,spieler_pos_y,0) Then Text 100,0,"Collision"

 ; For info.shot = Each shot
  ;  If ImagesCollide(satellit_image,instanz\s_x,instanz\s_y,0,shoot,info\shot_x,info\shot_y,0) Then
   ;   c = 2;
   ; EndIf
  ;Next
 

Next

End Function

Holzchopf

Meisterpacker

BeitragMi, Sep 04, 2013 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, ja. Ich hab heut' aber auch Tomaten auf den Augen Rolling Eyes denn DAS hätte mir schon Anfangs auffallen können:
BlitzBasic: [AUSKLAPPEN]
If instanz\s_y>600 Then Delete instanz.satellit
If ImagesCollide(satellit_image,instanz\s_x,instanz\s_y,0,spieler,spieler_pos_x,spieler_pos_y,0) Then


Du löscht die instanz, versuchst aber in der nächsten Zeile noch darauf zuzugreifen. Entweder musst du die Zeile mit der Abfrage und dem Löschen ans Ende der Funktion schieben oder vor weiteren etwaigen Zugriffen auf die Instanz instanz diese auf Vorhandensein prüfen. Geht glaube ich in BB ganz einfach BlitzBasic: [AUSKLAPPEN]
If instanz<>Null Then
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

Sirthaw

BeitragMi, Sep 04, 2013 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, Ja, jetzt funktioniert es! Very Happy
Vielen Dank!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group