Programm stürzt aus ab - warum?
Übersicht

SirthawBetreff: Programm stürzt aus ab - warum? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
In der Hilfe steht zu ImagesCollide![]() 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 BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für Antworten. Ok, dann probiere ich das mal mit Pythagoras.
Bei ImagesOverlap tritt das selbe Problem auf. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Sirthaw |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok, danke, die Funktion (ImgCollide) von BIG BUG ist interssant aber
da gibt es den selben Absturz. |
||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() ![]() ![]() mfG Holzchopf |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
Sirthaw |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hm, ich finde kein Loadimage in der Hauptschleife.
Ich poste mal den ganzen Code, hoffe das nutzt was. ![]() 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 |
||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok, ja. Ich hab heut' aber auch Tomaten auf den Augen ![]() BlitzBasic: [AUSKLAPPEN] If instanz\s_y>600 Then Delete instanz.satellit 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 BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
Sirthaw |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ah, Ja, jetzt funktioniert es! ![]() Vielen Dank! |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group