Memory Access Violation

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

AmenO

Betreff: Memory Access Violation

BeitragDi, Aug 25, 2009 16:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin @ all...

ich versuche mich gerade am BlitzBasic-Community-Tutorial, oder besser gesagt: ich bin gerade dabei das Pong-Game zu programmieren. Soweit so gut... das Spiel ansich läuft, allerdings erhalte ich bei einer Kollisionsabfrage immer "Memory Access violation."

Hier erstmal mein Code:

Code: [AUSKLAPPEN]
Global xmax = 1024
Global ymax = 768
Global sp1st = 1
Global sp2st = 0
Global xsp1 = xmax / 2
Global xsp2 = ymax / 2
Global fehlersp1 = 0
Global fehlersp2 = 0
Global beweglichkeit = 5

Graphics xmax, ymax, 32, 0

Global frametimer = CreateTimer(60)

SetBuffer BackBuffer()

SeedRnd MilliSecs()

;Grafikdateien
Global kugel = LoadImage("gfx\kugel.png")
Global xkugel# = xmax/2
Global ykugel# = ymax/2
Global winkel = Rand(45, 315)
Global geschwindigkeit = 5

MidHandle kugel ; <- Ursprung auf Mittelpunkt festlegen

Global spieler1 = LoadImage("gfx\spieler_unten.png")
MidHandle spieler1 ; <- Ursprung auf Mittelpunkt festlegen
MaskImage spieler1, 255, 255, 255 ; <- Tranparenzmodus

Global spieler2 = LoadImage("gfx\spieler_oben.png")
MidHandle spieler2 ; <- Ursprung auf Mittelpunkt festlegen
MaskImage spieler2, 255, 255, 255 ; <- Tranparenzmodus

Global begrenzung = LoadImage("gfx\stahltraeger.png")
MaskImage begrenzung, 255, 255, 255

ClsColor 255, 0, 0

Function resetkugel()

   xkugel = xmax / 2
   ykugel = ymax / 2
   
   If Rand(0, 1) = 1 Then
   
      winkel = Rand(105, 45)
   
   Else
   
      winkel = Rand(315, 225)
   
   EndIf

End Function

Repeat

   WaitTimer(frametimer)
   
   For z2 = 0 To 1
   
      If z2 = 1 Then
      
         x = xmax-50
      
      Else
      
         x = 0
      
      EndIf
      
      For z = 0 To ymax/50
      
         DrawImage begrenzung, x, z*50
      
      Next
   
   Next
   
   xkugel = xkugel + Cos(winkel) * geschwindigkeit
   
   ykugel = ykugel + Sin(winkel) * geschwindigkeit
   
   ; Kugel kollidiert mit den Seitenbegrenzungen
   
   If xkugel < 60 Then
   
      winkel = 180 - winkel
   
   EndIf
   
   If xkugel > xmax-60 Then
   
      winkel = 180 - winkel
   
   EndIf
   
   ; Kugel kollidiert mit Spieler
   
   If ImagesCollide(spieler1, xsp1, ymax - 10, 0, kugel, xkugel, ykugel, 0) Then
   
      winkel = 360 - winkel
      
      abweichung = 2 * (xsp1 - xkugel)
      
      winkel = winkel + abweichung
   
   EndIf
   
   If ImagesCollide(spieler2, xsp2, 10, 0, kugel, xkugel, ykugel, 0) Then
   
      winkel = 360 - winkel
      
      abweichung = 2 * (xsp2 - xkugel)
      
      winkel = winkel - abweichung
   
   EndIf
   
   ; Abweichung prüfen - ob über 360°
   
   If winkel < 360 Then
   
      winkel = winkel - 360
   
   ElseIf winkel < 0 Then

      winkel = winkel + 360
   
   EndIf
   
   ; Tastatursteuerung
   
   If KeyDown(203) And sp1st = 1 Then
   
      xsp1 = xsp1 - beweglichkeit
   
   EndIf
   
   If KeyDown(205) And sp1st = 1 Then
   
      xsp1 = xsp1 + beweglichkeit

   EndIf
   
   If KeyDown(44) And sp2st = 1 Then
   
      xsp2 = xsp2 - beweglichkeit

   EndIf
   
   If KeyDown(45) And sp2st = 1 Then
   
      xsp2 = xsp2 + beweglichkeit
   
   EndIf
   
   ; Maussteuerung
   
   If sp1st = 2 Then
   
      xsp1 = xsp1 + MouseXSpeed()
   
   EndIf
   
   If sp2st = 2 Then
   
      xsp2 = xsp2 + MouseXSpeed()
   
   EndIf
   
   ; automatische Spielersteuerung (Computer)
   
   If xsp1 > xkugel And sp1st = 0 Then
   
      xsp1 = xsp1 - beweglichkeit
   
   ElseIf xsp1 < xkugel And sp1st = 0 Then
   
      xsp1 = xsp1 - beweglichkeit
   
   EndIf
   
   If xsp2 > xkugel And sp2st = 0 Then
   
      xsp2 = xsp2 - beweglichkeit
   
   ElseIf xsp2 < xkugel And sp2st = 0 Then
   
      xsp2 = xsp2 + beweglichkeit
   
   EndIf
   
   ; Prüfen, ob die neuen Koordinaten außerhalb des Bildschirmes sind
   
   If xsp1 < 70 Then
   
      xsp1 = 70
   
   ElseIf xsp1 > xmax - 70 Then
   
      xsp1 = xmax - 70
   
   EndIf
   
   If xsp2 < 70 Then
   
      xsp2 = 70
   
   ElseIf xsp2 > xmax - 70 Then
   
      xsp2 = xmax - 70
   
   EndIf
   
   ; Spielersteuerung abfragen
   
   If KeyHit(2) Then
   
      sp1st = sp1st + 1
   
   EndIf
   
   If KeyHit(3) Then
   
      sp2st = sp2st + 1
   
   EndIf
   
   If sp1st > 2 Then
   
      sp1st = 0
   
   EndIf
   
   If sp2st > 2 Then
   
      sp2st = 0
   
   EndIf
   
   ; Prüfen, ob ein Spieler die Kugel durchgelassen hat
   
   If ykugel < -10 Then
   
      fehlersp2 = fehlersp2 + 1
      
      resetkugel
   
   EndIf
   
   If ykugel > ymax + 10 Then
   
      fehlersp1 = fehlersp1 + 1
   
      resetkugel
   
   EndIf

   DrawImage kugel, xkugel, ykugel
   DrawImage spieler1, xsp1, ymax-10
   DrawImage spieler2, xsp2, 10
   
   Flip

   Cls

Until KeyHit(1)
End


Ich habe mir den Code auch schon mehrfach angeschaut und versucht den Fehler zu finden, aber irgendwie... naja, finde ich den halt nicht Very Happy.
Der Fehler tritt bei folgender Zeile auf:

Code: [AUSKLAPPEN]
If ImagesCollide(spieler1, xsp1, ymax - 10, 0, kugel, xkugel, ykugel, 0) Then


Wenn ich spieler1 durch spieler2 ersetze, dann funktioniert alles problemlos (soweit ich das jetzt testen konnte).

In diesem Sinne hoffe ich mal auf eure Unterstützung Smile

PS: Ist es eigentlich normal bzw. warum ist das so, dass LoadImage()-Funktionen nach dem Graphics()-Befehl kommen müssen?
... - Wenn ich die davor schreibe, dann kommt beispielweise bei der Kugel schon, dass die Grafik nicht gefunden werden konnte.

Edit:\\ Sorry, hab mich leider in der Kategorie vertan... vielleicht könnte jemand das Thema nach BlitzBasic/Blitz3D verschieben Smile
  • Zuletzt bearbeitet von AmenO am Di, Aug 25, 2009 18:56, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragDi, Aug 25, 2009 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist (u.U.) ein bekannter Bug:
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)
 

AmenO

BeitragDi, Aug 25, 2009 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Frage ist dann nur, warum es mit dem Bild vom zweiten Spieler bisher immer funktioniert hat... wenn ich also

Code: [AUSKLAPPEN]
If ImagesCollide(spieler1, xsp1, ymax - 10, 0, kugel, xkugel, ykugel, 0) Then


durch

Code: [AUSKLAPPEN]
If ImagesCollide(spieler2, xsp1, ymax - 10, 0, kugel, xkugel, ykugel, 0) Then


ersetze, dann funktioniert das ganze...

Xeres

Moderator

BeitragDi, Aug 25, 2009 17:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist ja, dass diese Fehler sporadisch und nicht vorhersehbar auftreten. BIG BUG hat im verlinkten Thema eine Ersatzfunktion bereit gestellt.
Irgendein Fehler ist mir im Code nicht aufgefallen.
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)
 

AmenO

BeitragDi, Aug 25, 2009 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke... mit der Funktion scheint es tatsächlich zu funktionieren. Ich hab jetzt mal ein bisschen rumprobiert und es kam nie ein MAV Smile. Danke nochmal für die Hilfe Smile.

hazumu-kun

BeitragDi, Aug 25, 2009 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Bilder müssen nach Graphics geladen werden wenn man als flag bei loadimage managed(standard) oder vram speicherung verwendet.
Beim Graphics Befehl wird der Grafikspeicher geflusht(wörtlich: runtergespült).
Danach sind alle Bilder weg.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

Nicdel

BeitragDi, Aug 25, 2009 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Diese Flags gibt es allerdings nur bei Blitz+.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group