360° Bewegung auf Tilemap
Übersicht

![]() |
GoodjeeBetreff: 360° Bewegung auf Tilemap |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe mal einen Code für eine GTA-Steuerung auf einer Tilemap geschrieben.
Für die Kollision sind die Vertices wichtig. Sie geben die Eckpunkte des Players an. Außerdem ist ein SEHR EINFACHES Sliden eingebaut Code: [AUSKLAPPEN] Graphics 800,600,32,2
SetBuffer BackBuffer() SeedRnd MilliSecs() TFormFilter False Global x#=400,y#=300,winkel Global WireFrame=0 Global turn ;speichert die entscheidung beim Sliden Dim vertices(3,1) ;gibt die Eckpunkte des Players an Dim gfx(359) ;die grafik Dim map(24,17) ;die map Const tilesize=32 ;die tilesite ;laden der map Restore map For ty=0 To 17 For tx=0 To 24 Read map(tx,ty) Next Next ;erstellen der gfx gfx(0)=CreateImage(64,32) SetBuffer ImageBuffer(gfx(0)) Color 200,0,0 Rect 4,2,56,28 Color 0,0,200 Rect 32,6,25,20 SetBuffer BackBuffer() MidHandle gfx(0) For i=1 To 359 gfx(i)=CopyImage(gfx(0)) RotateImage(gfx(i),-i) Next ;speichern der vertices vertices(0,0)=-32+4 vertices(0,1)=-16+2 vertices(1,0)=28 vertices(1,1)=-14 vertices(2,0)=-28 vertices(2,1)=14 vertices(3,0)=28 vertices(3,1)=14 ClsColor 0,200,0 ;hauptschleife Repeat Cls ;map zeichnen For tx=0 To 24 For ty=0 To 17 Color 0,0,200 If map(tx,ty) Then Rect tx*tilesize,ty*tilesize,tilesize,tilesize Next Next ;player zeichnen DrawImage(gfx(winkel),x,y) ;vertices malen If WireFrame Then Color 255,255,255 Plot x,y Plot x+Cos(winkel)*vertices(0,0)+Cos(winkel+90)*vertices(0,1),y+Sin(winkel)*-vertices(0,0)+Sin(winkel+90)*-vertices(0,1) Plot x+Cos(winkel)*vertices(1,0)+Cos(winkel+90)*vertices(1,1),y+Sin(winkel)*-vertices(1,0)+Sin(winkel+90)*-vertices(1,1) Plot x+Cos(winkel)*vertices(2,0)+Cos(winkel+90)*vertices(2,1),y+Sin(winkel)*-vertices(2,0)+Sin(winkel+90)*-vertices(2,1) Plot x+Cos(winkel)*vertices(3,0)+Cos(winkel+90)*vertices(3,1),y+Sin(winkel)*-vertices(3,0)+Sin(winkel+90)*-vertices(3,1) EndIf ;bewegen If KeyDown(200) Then ;zwischenwerte ax=x-16+Cos(winkel)* 3 ay=y-16+Sin(winkel)*-3 ;tilepositionen der vertices tilex1=(ax+Cos(winkel)*vertices(1,0)+Cos(winkel+90)*vertices(1,1))/tilesize tiley1=(ay+Sin(winkel)*-vertices(1,0)+Sin(winkel+90)*-vertices(1,1))/tilesize tilex2=(ax+Cos(winkel)*vertices(3,0)+Cos(winkel+90)*vertices(3,1))/tilesize tiley2=(ay+Sin(winkel)*-vertices(3,0)+Sin(winkel+90)*-vertices(3,1))/tilesize If map(tilex1,tiley1)=0 And map(tilex2,tiley2)=0 Then ;keine kollision x=x+Cos(winkel)*3 y=y+Sin(winkel)*-3 turn=0 ;sliden aus ElseIf map(tilex1,tiley1)=1 And map(tilex2,tiley2)=1 Then ;beide kollisionen If turn=0 Then turn=Rnd(1,2) ;eventuell neuen slide Select turn ;entweder links oder rechts drehen Case 2 winkel=winkel+2 DebugLog "links" Case 1 winkel=winkel-2 DebugLog "rechts End Select ElseIf map(tilex1,tiley1)=1 Then ;bei nur einer kollision winkel=winkel+2 ;wird immer gleich geslidet ElseIf map(tilex2,tiley2)=1 Then winkel=winkel-2 EndIf ElseIf KeyDown(208) ;und das selbe nochmal für rückwärtsgang ;zwischenwerte ax=x-16+Cos(winkel)* 3 ay=y-16+Sin(winkel)*-3 tilex1=(ax+Cos(winkel)*vertices(0,0)+Cos(winkel+90)*vertices(0,1))/tilesize tiley1=(ay+Sin(winkel)*-vertices(0,0)+Sin(winkel+90)*-vertices(0,1))/tilesize tilex2=(ax+Cos(winkel)*vertices(2,0)+Cos(winkel+90)*vertices(2,1))/tilesize tiley2=(ay+Sin(winkel)*-vertices(2,0)+Sin(winkel+90)*-vertices(2,1))/tilesize If map(tilex1,tiley1)=0 And map(tilex2,tiley2)=0 Then x=x+Cos(winkel)*-3 y=y+Sin(winkel)*3 turn=0 ElseIf map(tilex1,tiley1)=1 And map(tilex2,tiley2)=1 Then If turn=0 Then turn=Rnd(1,2) Select turn Case 2 winkel=winkel+2 DebugLog "links" Case 1 winkel=winkel-2 DebugLog "rechts End Select ElseIf map(tilex1,tiley1)=1 Then winkel=winkel-2 ElseIf map(tilex2,tiley2)=1 Then winkel=winkel+2 EndIf EndIf ;drehen des players If KeyDown(203) Then winkel=winkel+3 If KeyDown(205) Then winkel=winkel-3 If winkel>359 Then winkel=winkel-360 If winkel<0 Then winkel=360+winkel Flip Until KeyHit(1) .map Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1 Data 1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1 Data 1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1 Data 1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1 Data 1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 |
||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Respekt, funktioniert soweit ohne großartige Bugs. Einzig das man sich in ein Tile "reindrehen" kann, aber dürfte keine große Sache sein das zu beheben wenn ich den Code recht interpretiere ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Geiles Teil ![]() Kann ich zwar nicht gebrauchen, aber sieht super aus ![]() MfG |
||
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans! Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver |
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
wegen der Drehung: bei Linksdrehung muss man vertices 1 und 2 checken, bei rechtsdrehung 0 und 3 glaube ich... ![]() so: eine Überprüfung beim "Lenken", jedoch nicht beim sliden...ich bin nicht wirklich zufrieden, aber naja Code: [AUSKLAPPEN] Graphics 800,600,32,2 SetBuffer BackBuffer() SeedRnd MilliSecs() TFormFilter False Global x#=400,y#=300,winkel Global WireFrame=1 Global turn ;speichert die entscheidung beim Sliden Dim vertices(3,1) ;gibt die Eckpunkte des Players an Dim gfx(359) ;die grafik Dim map(24,17) ;die map Const tilesize=32 ;die tilesite ;laden der map Restore map For ty=0 To 17 For tx=0 To 24 Read map(tx,ty) Next Next ;erstellen der gfx gfx(0)=CreateImage(64,32) SetBuffer ImageBuffer(gfx(0)) Color 200,0,0 Rect 4,2,56,28 Color 0,0,200 Rect 32,6,25,20 SetBuffer BackBuffer() MidHandle gfx(0) For i=1 To 359 gfx(i)=CopyImage(gfx(0)) RotateImage(gfx(i),-i) Next ;speichern der vertices vertices(0,0)=-32+4 ;oben links vertices(0,1)=-16+2 vertices(1,0)=28 ;oben rects vertices(1,1)=-14 vertices(2,0)=-28 ;unten links vertices(2,1)=14 vertices(3,0)=28 vertices(3,1)=14 ;unten rechts ClsColor 0,200,0 ;hauptschleife Repeat Cls ;map zeichnen For tx=0 To 24 For ty=0 To 17 Color 0,0,200 If map(tx,ty) Then Rect tx*tilesize,ty*tilesize,tilesize,tilesize Next Next ;player zeichnen DrawImage(gfx(winkel),x,y) ;vertices malen If WireFrame Then Color 255,255,255 Plot x,y Plot x+Cos(winkel)*vertices(0,0)+Cos(winkel+90)*vertices(0,1),y+Sin(winkel)*-vertices(0,0)+Sin(winkel+90)*-vertices(0,1) ;Plot x+Cos(winkel)*vertices(1,0)+Cos(winkel+90)*vertices(1,1),y+Sin(winkel)*-vertices(1,0)+Sin(winkel+90)*-vertices(1,1) ;Plot x+Cos(winkel)*vertices(2,0)+Cos(winkel+90)*vertices(2,1),y+Sin(winkel)*-vertices(2,0)+Sin(winkel+90)*-vertices(2,1) Plot x+Cos(winkel)*vertices(3,0)+Cos(winkel+90)*vertices(3,1),y+Sin(winkel)*-vertices(3,0)+Sin(winkel+90)*-vertices(3,1) EndIf ;bewegen If KeyDown(200) Then ;zwischenwerte ax=x-(tilesize/2)+Cos(winkel)* 3 ay=y-(tilesize/2)+Sin(winkel)*-3 ;tilepositionen der vertices tilex1=(ax+Cos(winkel)*vertices(1,0)+Cos(winkel+90)*vertices(1,1))/tilesize tiley1=(ay+Sin(winkel)*-vertices(1,0)+Sin(winkel+90)*-vertices(1,1))/tilesize tilex2=(ax+Cos(winkel)*vertices(3,0)+Cos(winkel+90)*vertices(3,1))/tilesize tiley2=(ay+Sin(winkel)*-vertices(3,0)+Sin(winkel+90)*-vertices(3,1))/tilesize If map(tilex1,tiley1)=0 And map(tilex2,tiley2)=0 Then ;keine kollision x=x+Cos(winkel)*3 y=y+Sin(winkel)*-3 turn=0 ;sliden aus ElseIf map(tilex1,tiley1)=1 And map(tilex2,tiley2)=1 Then ;beide kollisionen If turn=0 Then turn=Rnd(1,2) ;eventuell neuen slide Select turn ;entweder links oder rechts drehen Case 2 winkel=winkel+2 DebugLog "links" Case 1 winkel=winkel-2 DebugLog "rechts End Select ElseIf map(tilex1,tiley1)=1 Then ;bei nur einer kollision winkel=winkel+2 ;wird immer gleich geslidet ElseIf map(tilex2,tiley2)=1 Then winkel=winkel-2 EndIf ElseIf KeyDown(208) ;und das selbe nochmal für rückwärtsgang ;zwischenwerte ax=x-(tilesize/2)+Cos(winkel)* 3 ay=y-(tilesize/2)+Sin(winkel)*-3 tilex1=(ax+Cos(winkel)*vertices(0,0)+Cos(winkel+90)*vertices(0,1))/tilesize tiley1=(ay+Sin(winkel)*-vertices(0,0)+Sin(winkel+90)*-vertices(0,1))/tilesize tilex2=(ax+Cos(winkel)*vertices(2,0)+Cos(winkel+90)*vertices(2,1))/tilesize tiley2=(ay+Sin(winkel)*-vertices(2,0)+Sin(winkel+90)*-vertices(2,1))/tilesize If map(tilex1,tiley1)=0 And map(tilex2,tiley2)=0 Then x=x+Cos(winkel)*-3 y=y+Sin(winkel)*3 turn=0 ElseIf map(tilex1,tiley1)=1 And map(tilex2,tiley2)=1 Then If turn=0 Then turn=Rnd(1,2) Select turn Case 2 winkel=winkel+2 DebugLog "links" Case 1 winkel=winkel-2 DebugLog "rechts End Select ElseIf map(tilex1,tiley1)=1 Then winkel=winkel-2 ElseIf map(tilex2,tiley2)=1 Then winkel=winkel+2 EndIf EndIf ;drehen des players If KeyDown(203) Then tilex1=(x-(tilesize/2)+Cos(winkel)*vertices(0,0)+Cos(winkel+90)*vertices(0,1))/tilesize tiley1=(y-(tilesize/2)+Sin(winkel)*-vertices(0,0)+Sin(winkel+90)*-vertices(0,1))/tilesize tilex2=(x-(tilesize/2)+Cos(winkel)*vertices(3,0)+Cos(winkel+90)*vertices(3,1))/tilesize tiley2=(y-(tilesize/2)+Sin(winkel)*-vertices(3,0)+Sin(winkel+90)*-vertices(3,1))/tilesize If map(tilex1,tiley1)=0 And map(tilex2,tiley2)=0 Then winkel=winkel+3:turn=2 EndIf If KeyDown(205) Then tilex1=(x-(tilesize/2)+Cos(winkel)*vertices(1,0)+Cos(winkel+90)*vertices(1,1))/tilesize tiley1=(y-(tilesize/2)+Sin(winkel)*-vertices(1,0)+Sin(winkel+90)*-vertices(1,1))/tilesize tilex2=(x-(tilesize/2)+Cos(winkel)*vertices(2,0)+Cos(winkel+90)*vertices(2,1))/tilesize tiley2=(y-(tilesize/2)+Sin(winkel)*-vertices(2,0)+Sin(winkel+90)*-vertices(2,1))/tilesize If map(tilex1,tiley1)=0 And map(tilex2,tiley2)=0 Then winkel=winkel-3:turn=1 EndIf If winkel>359 Then winkel=winkel-360 If winkel<0 Then winkel=360+winkel DebugLog winkel Flip Until KeyHit(1) .map Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1 Data 1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1 Data 1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1 Data 1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1 Data 1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Schön das es gut ankommt |
||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
$tankY |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Sieht gut aus, muss mich ein wenig in den Code einarbeiten und dann werd ich vllt was drauss machen^^ | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group