Kollisionsabfrage funktioniert nicht!

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Stephan87

Betreff: Kollisionsabfrage funktioniert nicht!

BeitragMi, Jan 31, 2007 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
hallihallo!

da bin ich schon wieder mit meinem nächsten problem Very Happy und zwar würde ich gerne die figur durch eine map wandern lassen, die aus zwei texturen besteht (von mir aus boden und wand). wenn er gegen die wand läuft soll er nicht david copperfield spielen und durchlaufen, sondern an der wand stehenbleiben, logisch. nun scheiter ich jedoch an der kollisionsabfrage. schaut euch mal bitte den folgenden code an und sagt mit bitte, wieso die abfrage falsch ist. ich habe versucht, die for-schleife wegzulassen und manuell die positionen einzugeben (wie 32, 0 oder 64, 64). das funktioniert dann tatsächlich auch bei dem einzelnen objekt. nur im ganzen gesehen nicht. er gibt mir die ganze zeit über aus, er würde kollidieren, obwohl er es ja nicht tut (zumindest nicht mit der anderen textur).

Code: [AUSKLAPPEN]

' img0: Textur Boden; img1: Textur Wand; imgPlayer: Textur Spieler; imgBomb: Textur Bombe


' Variablen werden deklariert
Global Map%[20, 15]
Global LivingPlayers:TList = CreateList()
Global BombsList:TList = CreateList()

Global img0:TImage = LoadImage("media\img0.png")
Global img1:TImage = LoadImage("media\img1.png")
Global imgBomb:TImage = LoadImage("media\imgBomb.png")
Global playRight:TImage = LoadImage("media\playRight.png")
Global playLeft:TImage = LoadImage("media\playLeft.png")
Global playUp:TImage = LoadImage("media\playUp.png")
Global playDown:TImage = LoadImage("media\playDown.png")
Global imgPlayer:TImage = playRight
Local OwnPlayer:TOwnPlayer = New TOwnPlayer ' Eigener Spieler wird erstellt

'
Graphics 640, 480
SeedRnd MilliSecs()

' Hier wird die Map generiert
For Local x% = 0 To 19
   For Local y% = 0 To 14
      
      Map[x, y] = Rand(0, 1)
      
   Next
Next



' Mainloop
Repeat
   Cls
   DrawMap()
   OwnPlayer.UpdateState
   OwnPlayer.DrawPlayer
   
      For Local x1% = 0 To 19
         For Local y1% = 0 To 14
         xneu = 32*x1
         yneu = 32*y1
      If ImagesCollide(imgPlayer, OwnPlayer.x, OwnPlayer.y, 0, img1, xneu, yneu, 0) Then Print "COLLIDE " + xneu + " " + yneu
         Next
      
      Next

   Flip
      
Until KeyDown(key_escape)







Function DrawMap()
   
   For Local x%= 0 To 19
      For Local y% = 0 To 14

         If Map[x, y] = 0 DrawImage img0, 32*x, 32*y Else DrawImage img1, 32*x, 32*y
         
      Next
   Next
   
End Function



Function CheckIfWon()
   If CountList(LivingPlayers) = 1 Print "Du hast gewonnen"
End Function



Type TPlayer
   Field x% = 0
   Field y% = 0
   Field speed% = 1
   Field living = True
   
   Method DrawPlayer()
      
      DrawImage imgPlayer, x, y      
      
   End Method
   
   Function CreatePlayer:TPlayer()
   
      Local NewPlayer:TPlayer = New TPlayer
      ListAddLast LivingPlayers, NewPlayer
   
   End Function

End Type

Type TOwnPlayer Extends TPlayer
   
   Method UpdateState()
      
      If KeyDown(KEY_UP) y:-1*speed; imgPlayer = playUp
      If KeyDown(KEY_DOWN) y:+1*speed; imgPlayer = playDown
      If KeyDown(KEY_RIGHT) x:+1*speed; imgPlayer = playRight
      If KeyDown(KEY_LEFT) x:-1*speed; imgPlayer = playLeft
      If KeyDown(key_space) Then
         NewBomb = TBomb.CreateBomb(x, y)
      End If

      'If ImagesCollide(playRight, x, y, 0, img1, 32, 0, 0) Print "COLLIDE"
      'If ImagesCollide(imgPlayer, x, y, 0, img1, 64, 0, 0) Print "COLLIDE"      
   End Method
   
End Type



Type TBomb
   Field x%
   Field y%
   Field timer = CreateTimer(1)
   
   Method UpdateTimer()
      If timer = 3 Explode()
   End Method
   
   Method DrawBomb()
   
      DrawImage imgBomb, x, y
   
   End Method
   
   Method Explode()
      Map[x+1, y] = 0
      Map[x-1, y] = 0
      Map[x, y-1] = 0
      Map[x, y+1] = 0
      ListRemove(BombsList, Self)
   End Method
   
   
   Function CreateBomb:TBomb(x%, y%)
   
      Local NewBomb:TBomb = New TBomb
      NewBomb.x = x
      NewBomb.y = y
      ListAddLast BombsList, NewBomb
   
   End Function
End Type
[/quote]

garret

BeitragDo, Feb 01, 2007 22:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn alle deine Bilder, Spieler und Boden, gleich groß sind (also alle 32 Pixel oder so), berühren sie sich immer. ImagesCollide prüft, ob sich zwei Bilder berühren, was bei dir, so wie ich das zu sehen glaube, demzufolge immer der Fall ist (auch wenn sich nur zwei "Zipfel" berühren). Für tilebasierte Kollisionen würde ich sowieso nie ImagesCollide nehmen, da es meiner Meinung nach dafür ungeeignet ist.
Du könntest die Kollisionsabfrage realisieren, indem du nur die Koordinaten verarbeitest und auf die speziellen Kollisionsbefehle verzichtest. Das Ganze lässt sich unter anderem mit Mod ganz gut machen.

Also etwa: If spielerX Mod 32 = 0 Then (RunterGehen möglich)

Außerdem sind diese "simplen" mathematischen Berechnungen etwas schneller als die Kollisionsfunktionen.

MfG garret
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group