Mal wieder ImagesCollide und MAV...

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Klip

Betreff: Mal wieder ImagesCollide und MAV...

BeitragDi, Nov 29, 2005 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Tag,

ich programmiere jetzt seit einigen Tagen an meinem Projekt, bisher lief alles problemlos, aber nun fängt B3D schon wieder an zu mucken. Ich prüfe, ob der Spieler mit der Landebasis kollidiert.

Ist das der Fall, so führe ich eine Levelwechselfunktion aus. Soweit, so gut.

Manchmal klappt es, manchmal nicht. Wenn ich beispielsweise irgendwo eine Zeile neu einfüge, in der ich eine absolut unrelevante Variable verwende, tritt der Fehler auf. Nehme ich die neue Zeile dann per Kommentar wieder raus, kommt der Fehler immer noch...

Dann irgendwann ist er auf einmal wieder weg, ich verzweifele langsam.

Hier die Stelle, wo der Fehler auftritt:
BlitzBasic: [AUSKLAPPEN]

; ControlMap() checks for collisions and reaching the objective.
Function ControlMap()

If map_success = True Then SwitchMap()

If ImagesCollide(player_image,player_x,player_y,player_f,base_image,base_x,base_y,0) ; in dieser Zeile kommt die Meldung
map_success = True
EndIf
If ImagesCollide(player_image,player_x,player_y,player_f,map_image,0,0,0)
map_number = map_number - 1
map_success = True
EndIf

End Function


Das Bild existiert, es wird VORHER gemalt, ohne Probleme. Wenn ich eine If Filetype = True-Abfrage einfüge, kommt die MAV trotzdem. Woran könnte es liegen?
Das Spielerbild (player_image) wird nirgends aus dem Speicher entfernt.

Ich bin für jegliche Hilfe sehr dankbar, alleine komme ich nicht mehr weiter.
 

BIG BUG

BeitragDi, Nov 29, 2005 22:48
Antworten mit Zitat
Benutzer-Profile anzeigen
ImagesCollide kann bei bestimmten Treiberversionen auf NVidia-Karten zu unmotivierten MAVs führen(Auch im Debugmodus MAV anstatt Image does not exist).
Auf jeden Fall solltest Du den neuesten Treiber und die neueste B3D-Version benutzten.


Ansonsten habe ich da noch eine Routine gemacht als Ersatz für ImageRectCollide(Ist in den meisten Fällen anstatt ImagesCollide auch ausreichend):

Code: [AUSKLAPPEN]

Function ImgRectCollide(image,xpos1, ypos1, xpos2, ypos2, width2, height2, mask=0)

   Local startx, starty, endx, endy, ix, iy

   Local width1  = ImageWidth(image)
   Local height1 = ImageHeight(image)

   xpos1   = xpos1 - ImageXHandle(image)
   ypos1   = ypos1 - ImageYHandle(image)

   startx = xpos2 - xpos1
   starty = ypos2 - ypos1
   endx   = startx + width2
   endy   = starty + height2

   If startx < 0       Then startx = 0
   If starty < 0       Then starty = 0
   If endx   > width1  Then endx   = width1
   If endy   > height1 Then endy   = height1

   endx = endx - 1
   endy = endy - 1

   If startx > endx Or starty > endy Then Return 0

   LockBuffer ImageBuffer(image)
   For ix = startx To endx
      For iy = starty To endy

         If mask <> (ReadPixelFast(ix, iy, ImageBuffer(image)) And $00FFFFFF) Then
            UnlockBuffer ImageBuffer(image)
            Return 1
         EndIf
      Next
   Next 
   UnlockBuffer ImageBuffer(image)

End Function



Function ImgRectCollideFast(image,xpos1, ypos1, xpos2, ypos2, width2, height2, mask=0)

   Local startx, starty, endx, endy, ix, iy, x[3], y[3]

   Local width1  = ImageWidth(image)
   Local height1 = ImageHeight(image)

   xpos1   = xpos1 - ImageXHandle(image)
   ypos1   = ypos1 - ImageYHandle(image)

   startx = xpos2 - xpos1
   starty = ypos2 - ypos1
   endx   = startx + width2
   endy   = starty + height2

   If startx < 0       Then startx = 0
   If starty < 0       Then starty = 0
   If endx   > width1  Then endx   = width1
   If endy   > height1 Then endy   = height1

   endx = endx - 1
   endy = endy - 1

   If startx > endx Or starty > endy Then Return 0

   x[0] = startx
   y[0] = starty
   x[1] = (startx + endx) Shr 1
   y[1] = (starty + endy) Shr 1
   x[2] = endx
   y[2] = endy

   LockBuffer ImageBuffer(image)
   For ix = 0 To 2
      For iy = 0 To 2   
         If mask <> (ReadPixelFast(x[ix], y[iy], ImageBuffer(image)) And $00FFFFFF) Then
            UnlockBuffer ImageBuffer(image)
            Return 1
         EndIf
      Next
   Next
   UnlockBuffer ImageBuffer(image)

End Function



Aus Geschwindigkeitsgründen werden bei der unteren Version nur 9 ausgewählte Punkte geprüft Kanten&Mitte.
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

Klip

BeitragMi, Dez 07, 2005 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Tut mir leid, dass ich mich so lange nicht gemeldet habe. Hatte Klausurstress und bin auch die letzten Tage nicht zum Programmieren gekommen.

Deine Funktionen klappen einwandfrei, vielen Dank. Damit wäre das MAV-Problem ein für allemal gelöst. Auf so eine Idee wäre ich zwar vielleicht gekommen aber ich hätte es niemals umsetzen können, weswegen ich den Gedanken dann auch sofort wieder verworfen hätte.

Wie auch immer.

Dankeschön nochmal, ich schreibe dich in die Credits, wenn es denn fertig wird. Du hast mein Projekt gerettet Wink

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group