Tilemap mit Kollisionsabfrage (Rechteck und Dreieck)
Übersicht BlitzMax, BlitzMax NG Codearchiv & Module
battlegorgeBetreff: Tilemap mit Kollisionsabfrage (Rechteck und Dreieck) |
Do, Sep 13, 2007 17:24 Antworten mit Zitat |
|
---|---|---|
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 |
Fr, Sep 14, 2007 12:30 Antworten mit Zitat |
|
---|---|---|
Habe es mir nur angesehen .
Ein Select Case in f_collision wäre besser Bei f_drawmap auch . |
||
Übersicht BlitzMax, BlitzMax NG Codearchiv & Module
Powered by phpBB © 2001 - 2006, phpBB Group