Kollisionsabfrage funktioniert nicht!
Übersicht

![]() |
Stephan87Betreff: Kollisionsabfrage funktioniert nicht! |
![]() Antworten mit Zitat ![]() |
---|---|---|
hallihallo!
da bin ich schon wieder mit meinem nächsten problem ![]() 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 |
||
![]() |
garret |
![]() Antworten mit Zitat ![]() |
---|---|---|
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) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group