Tilemap mit Kollisionsabfrage (Rechteck und Dreieck)

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

 

battlegorge

Betreff: Tilemap mit Kollisionsabfrage (Rechteck und Dreieck)

BeitragDo, Sep 13, 2007 17:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt eine tilemap mit 5 verschiedenen tiles.
Das Quadrat kann mit der Maus bewegt und vergrössert werden.
Für kompliziertere Kollisionen könnt ihr euch das ansehen:
http://www.harveycartel.org/me...l#section2

Code: [AUSKLAPPEN]

Strict

Graphics 640,480,0,75

'spieler
Global playerx=320 'x/y = punkt links oben
Global playery=440
Global playersize=20

'tilemap
Global tilesize=40
Global map[16,12]

'tilemapdaten
#map
DefData 0,0,0,0,0,0,0,0,0,0,4,5,0,0,4,1
DefData 0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,4
DefData 0,1,1,0,0,1,0,0,1,0,0,0,2,1,3,0
DefData 0,0,0,0,0,1,0,0,1,0,0,0,1,0,1,0
DefData 0,0,0,0,0,0,1,1,0,0,0,0,4,1,5,2
DefData 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4
DefData 1,3,0,0,0,0,2,3,0,0,5,4,0,0,0,0
DefData 1,5,0,0,0,0,4,5,0,0,3,2,0,0,1,0
DefData 5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DefData 0,2,0,0,3,0,0,0,0,0,0,4,0,0,5,0
DefData 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

'tilemap einlesen
RestoreData map
For Local j=0 To 11
   For Local i=0 To 15
      ReadData map[i,j]
   Next
Next

'test
Global ms1,ms2

'hauptschleife
Repeat
      ms1=MilliSecs()
   
   f_player()
   f_drawmap()
   
      ms2=MilliSecs()-ms1
      DrawText ms2,10,10
   
   Flip
   Cls
Until KeyHit(key_escape) Or AppTerminate()

'spieler
Function f_player()
   'steuerung
   playerx=MouseX()-playersize
   playery=MouseY()-playersize
   
   If MouseDown(1) And playersize<100 playersize:+1
   If MouseDown(2) And playersize>10 playersize:-1
   
   'kollisionsabfrage
   For Local j=0 To 11
      For Local i=0 To 15
         If map[i,j]>0
            If f_collision(playerx,playery,playersize,i*tilesize,j*tilesize,tilesize,map[i,j]) SetColor 255,0,0
         EndIf
      Next
   Next
   
   'anzeigen
   DrawRect playerx,playery,playersize,playersize
   SetColor 0,255,0
End Function

'tilemap anzeigen
Function f_drawmap()
   For Local j=0 To 11
      For Local i=0 To 15
         If map[i,j]=1 f_rect(i*tilesize,j*tilesize,tilesize)
         If map[i,j]=2 f_tri1(i*tilesize,j*tilesize,tilesize)
         If map[i,j]=3 f_tri2(i*tilesize,j*tilesize,tilesize)
         If map[i,j]=4 f_tri3(i*tilesize,j*tilesize,tilesize)
         If map[i,j]=5 f_tri4(i*tilesize,j*tilesize,tilesize)
      Next
   Next
End Function

'kollisionsfunktion
Function f_collision(x1,y1,s1,x2,y2,s2,tile)
   'quadrat
   If x1>x2+s2 Return
   If x1+s1<x2 Return
   If y1>y2+s2 Return
   If y1+s1<y2 Return
   
   'dreieck
   If tile=2
      If Abs(x2-(x1+s1)) + Abs(y2-(y1+s1)) < tilesize Return
   EndIf
   
   If tile=3
      If Abs((x2+s2)-x1) + Abs(y2-(y1+s1)) < tilesize Return
   EndIf
   
   If tile=4
      If Abs(x2-(x1+s1)) + Abs((y2+s2)-y1) < tilesize Return
   EndIf
   
   If tile=5
      If Abs((x2+s2)-x1) + Abs((y2+s2)-y1) < tilesize Return
   EndIf
   
   Return 1
End Function

'tiles
Function f_rect(x,y,size)
   DrawLine x,y,x+size,y               '0000     1
   DrawLine x,y+size,x+size,y+size         '0000
   DrawLine x,y,x,y+size               '0000
   DrawLine x+size,y,x+size,y+size         '0000
End Function

Function f_tri1(x,y,size)               '   0     2
   DrawLine x+size,y+size,x+size,y         '  00
   DrawLine x+size,y+size,x,y+size         ' 000
   DrawLine x+size,y,x,y+size            '0000
End Function

Function f_tri2(x,y,size)               '0        3
   DrawLine x,y,x,y+size               '00
   DrawLine x,y+size,x+size,y+size         '000
   DrawLine x,y,x+size,y+size            '0000
End Function

Function f_tri3(x,y,size)               '0000     4
   DrawLine x,y,x+size,y               ' 000
   DrawLine x+size,y,x+size,y+size         '  00
   DrawLine x,y,x+size,y+size            '   0
End Function

Function f_tri4(x,y,size)               '0000     5
   DrawLine x,y,x+size,y               '000
   DrawLine x,y,x,y+size               '00
   DrawLine x,y+size,x+size,y            '0
End Function

Markus2

BeitragFr, Sep 14, 2007 12:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe es mir nur angesehen .
Ein Select Case in f_collision wäre besser Wink
Bei f_drawmap auch .

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group