2D-Kollisonsabfrage - BITTE HELFT MIR!!

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

BadDeath

Betreff: 2D-Kollisonsabfrage - BITTE HELFT MIR!!

BeitragMi, Jan 02, 2008 21:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi! Ich habe vor rund 4 Tagen mit Blitz angefangen und möchte gerne ein RPG-Spiel basteln. Läuft bis jetzt auch alles ganz gut. Ich habe auch kein Problem, sondern eher eine Frage an euch "alten Hasen".

Geht ImagesCollide übersichtlicher?!? Oder muss ich das tatsächlich für jedes Objekt mit in die If-Abfrage einbauen?

Hier der vorläufige Code:

Code: [AUSKLAPPEN]
Global up_key = 200, down_key = 208, left_key = 203, right_key = 205
FrameTimer = CreateTimer (30)

Graphics 1024, 768, 32, 1
SetBuffer BackBuffer()

Type Spieler
   Field PosX
   Field PosY
   Field PosXold
   Field PosYold
   Field Bild
   Field Richtung
End Type

Global Spieler.Spieler = New Spieler
Spieler\PosX = 50
Spieler\PosY = 50

Spieler\Bild = LoadAnimImage("GFX\Alle3.bmp",63,73,0,12)
Baum = LoadImage("GFX\Baum2.bmp")
Brunnen = LoadImage("GFX\Brunnen.bmp")
Bg = LoadImage("GFX\Rasen2.bmp")
MaskImage Brunnen, 255, 0, 255
MaskImage Baum, 255, 0, 255

While Not KeyHit(1)
   Spieler\PosXold = Spieler\PosX
   Spieler\PosYold = Spieler\PosY
   
   TileImage Bg

   If MilliSecs() > ms+ 75
    ms = MilliSecs()
    i = (i+1) Mod 3
   End If

   Spieler\Richtung = 0

   If KeyDown(down_key) Then
      Spieler\Posy = Spieler\Posy + 4
      Spieler\Richtung = 1
   End If

   If KeyDown(up_key) Then
      Spieler\Posy = Spieler\Posy - 4
      Spieler\Richtung = 2
   End If

   If KeyDown(right_key) Then
      Spieler\Posx = Spieler\Posx + 4
      Spieler\Richtung = 3
   End If

   If KeyDown(left_key) Then
      Spieler\Posx = Spieler\Posx - 4
      Spieler\Richtung = 4
   End If
   
   MaskImage Spieler\Bild, 255, 0, 255
   DrawImage Baum, 200, 50   
   DrawImage Brunnen, 700, 600   

   Select Spieler\Richtung
      Case 0
         If ImagesCollide(Spieler\Bild, Spieler\Posx, Spieler\Posy, 0, Baum, 200, 50, 0) Or ImagesCollide(Spieler\Bild, Spieler\Posx, Spieler\Posy, 0, Brunnen, 700, 600, 0) Then   
            Spieler\PosY = Spieler\PosYold
            Spieler\PosX = Spieler\PosXold
            DrawImage Spieler\Bild,Spieler\PosX,Spieler\PosY, 8
         Else
            DrawImage (Spieler\Bild, Spieler\PosX, Spieler\PosY,8)
         End If
      Case 1
          If ImagesCollide(Spieler\Bild, Spieler\Posx, Spieler\Posy, 0, Baum, 200, 50, 0) Or ImagesCollide(Spieler\Bild, Spieler\Posx, Spieler\Posy, 0, Brunnen, 700, 600, 0) Then   
               Spieler\PosY = Spieler\PosYold
               Spieler\PosX = Spieler\PosXold
            DrawImage Spieler\Bild,Spieler\PosX,Spieler\PosY,i + 6
         Else
               DrawImage (Spieler\Bild, Spieler\PosX, Spieler\PosY,i + 6)
         End If
      Case 2
          If ImagesCollide(Spieler\Bild, Spieler\Posx, Spieler\Posy, 0, Baum, 200, 50, 0) Or ImagesCollide(Spieler\Bild, Spieler\Posx, Spieler\Posy, 0, Brunnen, 700, 600, 0) Then   
               Spieler\PosY = Spieler\PosYold
               Spieler\PosX = Spieler\PosXold
            DrawImage Spieler\Bild,Spieler\PosX,Spieler\PosY,i + 0
         Else
               DrawImage (Spieler\Bild, Spieler\PosX, Spieler\PosY,i)
         End If
      Case 3
          If ImagesCollide(Spieler\Bild, Spieler\Posx, Spieler\Posy, 0, Baum, 200, 50, 0) Or ImagesCollide(Spieler\Bild, Spieler\Posx, Spieler\Posy, 0, Brunnen, 700, 600, 0) Then   
               Spieler\PosY = Spieler\PosYold
               Spieler\PosX = Spieler\PosXold
               DrawImage Spieler\Bild,Spieler\PosX,Spieler\PosY,i + 3
         Else
               DrawImage (Spieler\Bild, Spieler\PosX, Spieler\PosY,i + 3)
         End If
      Case 4
          If ImagesCollide(Spieler\Bild, Spieler\Posx, Spieler\Posy, 0, Baum, 200, 50, 0) Or ImagesCollide(Spieler\Bild, Spieler\Posx, Spieler\Posy, 0, Brunnen, 700, 600, 0) Then   
               Spieler\PosY = Spieler\PosYold
               Spieler\PosX = Spieler\PosXold
            DrawImage Spieler\Bild,Spieler\PosX,Spieler\PosY,i + 9
         Else
               DrawImage (Spieler\Bild, Spieler\PosX, Spieler\PosY,i + 9)
         End If
   End Select

   WaitTimer FrameTimer
 Flip 0
Wend
End


PS: wenn ihr die Bilder braucht, sagt mir Bescheid!
  • Zuletzt bearbeitet von BadDeath am Fr, Jan 04, 2008 0:58, insgesamt einmal bearbeitet
 

Dreamora

BeitragMi, Jan 02, 2008 21:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Kollisionen in einem so grossen Stil sind eindeutig eine Aufgabe für Types und "for t.typename = each typename ... imagecollide t\bildhandle, t\x, .... .... next"
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

BadDeath

Betreff: Danke

BeitragMi, Jan 02, 2008 21:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey, danke für die Blitz-Antwort xD

Also soll ich den Brunnen, den Baum... alles z.B. als Typ "Gegenstand" deklarieren und dann mit einer Schleife alle Abfragen? Oder wie?

Danke schonmal!

The_Nici

BeitragMi, Jan 02, 2008 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Apropos an die alten Hasen, suche mal im Codearchiv nach dem Scrollingcode von "DerHase", er hat auch Kollisionen in dem Thread gepostet.

MfG
 

BadDeath

BeitragMi, Jan 02, 2008 22:07
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Nici: meinst du das hier? https://www.blitzforum.de/foru...hp?t=18589

The_Nici

BeitragMi, Jan 02, 2008 22:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein das: https://www.blitzforum.de/foru...147#209147
 

BadDeath

BeitragMi, Jan 02, 2008 22:56
Antworten mit Zitat
Benutzer-Profile anzeigen
ah, danke

kann man das ganze auch etwas was kürzen? also bei dem, den ich oben gepostet hatte
 

BadDeath

Betreff: 2D-Kollison - Ich kriegs nicht hin!!!

BeitragDo, Jan 03, 2008 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, also ich versuche seit gestern abend die objekte, wie baum und brunnen als types zu machen und die kollisons als schleife abzufragen (siehe Post von Dreamora).

Aber ich bekomme das nicht hin! Der Fehler "object not found" tritt beim starten auf und er makiert mir die Zeile, wo Test\Bild gezeichnet wird. Und im Debug-Fenster unter Globals ist Type=0, nicht mal als Knoten zum aufklappen wie Spieler!!

Kann mir bitte jemand helfen? Wäre echt nett, wenn mir jemand dieses Beispiel so macht, dass der Brunnen auch gleich mit in den Typ gezogen wird.


DANKE SCHONMAL, BADDEATH

Code: [AUSKLAPPEN]
Global up_key = 200, down_key = 208, left_key = 203, right_key = 205
FrameTimer = CreateTimer (30)

Graphics 1024, 768, 32, 1
SetBuffer BackBuffer()

Type Spieler
   Field PosX
   Field PosY
   Field PosXold
   Field PosYold
   Field Bild
   Field Richtung
End Type

Global Spieler.Spieler = New Spieler
Spieler\PosX = 50
Spieler\PosY = 50

Type Test
   Field PosX
   Field PosY
   Field Bild
End Type

Global Test.Test = New Test

Test\PosX = 200
Test\PosY = 50

Spieler\Bild = LoadAnimImage("GFX\Alle3.bmp",63,73,0,12)
Test\Bild = LoadImage("GFX\Baum.bmp")

Brunnen = LoadImage("GFX\Brunnen.bmp")
Bg = LoadImage("GFX\Rasen2.bmp")
MaskImage Brunnen, 255, 0, 255



While Not KeyHit(1)
   Spieler\PosXold = Spieler\PosX
   Spieler\PosYold = Spieler\PosY
   Spieler\Richtung = 0
   
   TileImage Bg
   DrawImage Test\Bild, Test\PosX, Test\PosY
   MaskImage Test\Bild, 255, 0, 255

   If MilliSecs() > ms+ 75
    ms = MilliSecs()
    i = (i+1) Mod 3
   End If
   
   If KeyDown(down_key) Then
      Spieler\Posy = Spieler\Posy + 4
      Spieler\Richtung = 1
   End If

   If KeyDown(up_key) Then
      Spieler\Posy = Spieler\Posy - 4
      Spieler\Richtung = 2
   End If

   If KeyDown(right_key) Then
      Spieler\Posx = Spieler\Posx + 4
      Spieler\Richtung = 3
   End If

   If KeyDown(left_key) Then
      Spieler\Posx = Spieler\Posx - 4
      Spieler\Richtung = 4
   End If
   
   MaskImage Spieler\Bild, 255, 0, 255
      
   DrawImage Brunnen, 700, 600   

   Select Spieler\Richtung
      Case 0
         For Test.Test = Each Test
               If ImagesCollide(Spieler\Bild, Spieler\PosX, Spieler\Posy, 0, Test\Bild, Test\PosX, Test\PosY, 0) Then
               Spieler\PosY = Spieler\PosYold
               Spieler\PosX = Spieler\PosXold
               DrawImage Spieler\Bild,Spieler\PosX,Spieler\PosY, 8   
            Else
               DrawImage (Spieler\Bild, Spieler\PosX, Spieler\PosY,8)
            End If            
         Next
      Case 1
         ;For Test.Test = Each Test
               If ImagesCollide(Spieler\Bild, Spieler\PosX, Spieler\Posy, 0, Test\Bild, Test\PosX, Test\PosY, 0) Then
               Spieler\PosY = Spieler\PosYold
               Spieler\PosX = Spieler\PosXold
               DrawImage Spieler\Bild,Spieler\PosX,Spieler\PosY, i + 6   
            Else
               DrawImage (Spieler\Bild, Spieler\PosX, Spieler\PosY,i+6)
            End If
         ;Next
      Case 2
         ;For Test.Test = Each Test
               If ImagesCollide(Spieler\Bild, Spieler\PosX, Spieler\Posy, 0, Test\Bild, Test\PosX, Test\PosY, 0) Then
               Spieler\PosY = Spieler\PosYold
               Spieler\PosX = Spieler\PosXold
               DrawImage Spieler\Bild,Spieler\PosX,Spieler\PosY, i
            Else
               DrawImage (Spieler\Bild, Spieler\PosX, Spieler\PosY,i)
            End If
         ;Next
      Case 3
         ;For Test.Test = Each Test
               If ImagesCollide(Spieler\Bild, Spieler\PosX, Spieler\Posy, 0, Test\Bild, Test\PosX, Test\PosY, 0) Then
               Spieler\PosY = Spieler\PosYold
               Spieler\PosX = Spieler\PosXold
               DrawImage Spieler\Bild,Spieler\PosX,Spieler\PosY, i + 3   
            Else
               DrawImage (Spieler\Bild, Spieler\PosX, Spieler\PosY,i+3)
            End If
         ;Next
      Case 4
         ;For Test.Test = Each Test
               If ImagesCollide(Spieler\Bild, Spieler\PosX, Spieler\Posy, 0, Test\Bild, Test\PosX, Test\PosY, 0) Then
               Spieler\PosY = Spieler\PosYold
               Spieler\PosX = Spieler\PosXold
               DrawImage Spieler\Bild,Spieler\PosX,Spieler\PosY, i + 9   
            Else
               DrawImage (Spieler\Bild, Spieler\PosX, Spieler\PosY,i+9)
            End If
         ;Next

   End Select

   WaitTimer FrameTimer
 Flip 0
Wend
End
Rolling Eyes

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group