360° Bewegung auf Tilemap

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Goodjee

Betreff: 360° Bewegung auf Tilemap

BeitragDi, Aug 08, 2006 12:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Aug 08, 2006 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

aMul

Sieger des Minimalist Compo 01/13

BeitragDi, Aug 08, 2006 18:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Geiles Teil Smile

Kann ich zwar nicht gebrauchen, aber sieht super aus Wink

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

BeitragDi, Aug 08, 2006 21:24
Antworten mit Zitat
Benutzer-Profile anzeigen
wegen der Drehung: bei Linksdrehung muss man vertices 1 und 2 checken, bei rechtsdrehung 0 und 3 glaube ich... Rolling Eyes

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

BeitragDo, Aug 10, 2006 0:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht gut aus, muss mich ein wenig in den Code einarbeiten und dann werd ich vllt was drauss machen^^

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group