Komische Schlange

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Suco-X

Betreff: Komische Schlange

BeitragMo, Mai 16, 2005 12:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi.
Hier mal der Code wo ich mit einer Snake Steuerung rumgespielt habe. Die Schlange benimmt sich etwas ungewöhnlich Wink
Steuerung mit Pfeiltasten.

Code: [AUSKLAPPEN]

'Snake Steuerung by Suco-X
'Viel Spass.


'Prinzip meiner Snake Steuerung
Rem

Das Prinzip ist einfacher als man denkt. Es gibt 3 Types.
TSnake, TSnakeHead und TSnakeBody.
In TSnake sind die Grunddaten drin die jeweils von TSnakeHead und TSnakeBody geerbt werden.
Jeder erstellt Snake Kopf bekommt seine Bodys zu beginn zugeteilt. Jeder dieser Bodys
hat einen Parent. Der Erste hat den SnakeKopf als Parent und die restlichen jeweils einen Body.
Die Steuerung des Snake Kopfes erfolgt ber Sin/Cos (normale 08/15 Steuerung).
Jeder Snake Body findet den Winkel von Sich selbst zu seinem Parent raus und setzt ihn so
Wenn der Radius zwischen einem Body und seinem parent zu Gro(>Objekt Radius) wird, bekommt die Speed Variable
einen Wert zugewiesen. So setzt sich angefangen vom Kopf bis zum Schwanz diese Realistisch wirkende
Schlange zusammen. Der Code kanns dir besser erklren.
Mfg Suco
end rem


Strict

Framework brl.basic



Import BRL.pngloader
Import BRL.glmax2d



Type TSnake

   Field x:Float, y:Float
   Field Radius:Float
   Field speed:Float
   Field Angle:Float
   Field Image:TIMage

   Method GetSpeed:Float()
      Return self.Speed
   End Method
   
   
   Method AddAngle(Value:Float)
      self.Angle:+Value
   End Method
   
   
   Method SetPosition(x:Float, y:Float)
      self.x = x
      self.y = y
   End Method
   
   Method GetX:Float()
      Return self.X
   End Method
   
   
   Method GetY:Float()
      Return self.Y
   End Method
   
   
   Method Set(Image:TIMage, Speed:Float, Radius:Float )
      self.Image = Image
      self.Speed = Speed
      self.Radius = Radius
   End Method
   
   
   Method SetImage(Image:TImage)
      self.Image = image
   End Method
   
   
   Method GetImage:TImage()
      Return self.Image
   End Method
   
   
End Type





TSnakeHead.hHeadList = New TList

Type TSnakeHead Extends TSnake

   Global hHeadList:TList
   
   
   Field hBodyList:TList
   Field hMaxBodys:Int = 10
   
   
   Method New()
      self.hHeadList.AddLast(Self)
   End Method


   Function GetInstance:TSnakeHead()
      Return New TSnakeHead
   End Function
   
   
   Function RenderAndUpdate()
      For Local TempObject:TSnakeHead = EachIn self.hHeadList
         TempObject.Update()
         TempObject.Render()
      Next
   End Function
   
   
   Method RenderAndUpdateBodys()
      For Local TempObject:TSnakeBody = EachIn self.hBodyList
         TempObject.Update()
         TempObject.Render()
      Next
   End Method
   
   
   Method SetData(x:Float, y:Float, Image:TImage, Speed:Float)
      self.SetPosition(x,y)
      self.Set(Image,Speed,Image.Width)
      self.CreateBodys()
   End Method
   
   
   Method AddBody()
      Local FirstBody:TSnakeBody
      
      FirstBody = TSnakeBody(self.hBodyList.Last())
      
      If FirstBody = Null
         Return
      EndIf
      
      Local NewBody:TSnakeBody = TSnakeBody.GetInstance()
      NewBody.hParent = FirstBody
      NewBody.SetData(FirstBody.GetX(),FirstBody.GetY(),FirstBody.image,FirstBody.speed)
      NewBody.IsLast = True
      FirstBody.IsLast = False
      self.hBodyList.AddLast(NewBody)
      
      self.hMaxBodys:+1
      
   End Method
   
   
   
   Method CreateBodys()
      self.hBodyList = Null
      self.hBodyList = New TList
      
      Local LastBody:TSnakeBody = Null
      Local TempBody:TSnakeBody = Null
      For Local i:Int = 0 Until self.hMaxBodys
      
         TempBody = TSnakeBody.GetInstance()
         TempBody.SetData(self.GetX(),self.GetY(),snakebody_img,0.0)
         
         If i = 0
            TempBody.hParent = Self
         Else
            TempBody.hParent = LastBody
         EndIf
         
   
         LastBody = TempBody
         
         self.hBodyList.AddLast(TempBody)
      Next
      TempBody.IsLast = True
      
      
   End Method
   
   
   Method Update()
      self.x:+Sin(self.Angle)*self.Speed
      self.y:-Cos(self.Angle)*self.Speed
      
      self.RenderAndUpdateBodys()
      
   End Method
   
   
   
   Method Render()
   
      ResetStates()
      SetBlend ALPHABLEND
      SetScale 1.4,1.4
      SetRotation self.Angle
      
      SetColor 30,30,30
      SetAlpha 0.6
      DrawImage self.Image,self.GetX()+10,self.GetY()
      
      SetColor 255,255,255
      SetAlpha 1.0
      DrawImage self.Image,self.GetX(),self.GetY()

   End Method
   

End Type




Type TSnakeBody Extends TSnake
   
   Field hParent:TSnake = Null
   Field OldSpeed:Float
   Field IsLast:Byte = False
   
   Function GetInstance:TSnakeBody()
      Return New TSnakeBody
   End Function
   
   
   Method SetData(x:Float, y:Float, Image:TImage, Speed:Float)
      self.SetPosition(x,y)
      self.Set(Image,Speed,Image.Width)
   End Method
   

   Method Update()
      
      If self.hParent
         Local TempAngle:Float = WInkel2D(self.GetX(),self.GetY(),self.hParent.GetX(),self.hParent.GetY())
         Local TempDistance:Float = Distance2D(self.GetX(),self.GetY(),self.hParent.GetX(),self.hParent.GetY())
         self.Speed = (TempDistance>self.Radius)*self.hParent.Speed
         self.Angle = TempAngle
      EndIf

      self.x:+Sin(self.Angle)*self.Speed
      self.y:-Cos(self.Angle)*self.Speed
            
   End Method
   
   
   Method Render()
      
      ResetStates()
      
      SetBlend ALPHABLEND
      SetRotation self.Angle
      
      SetColor 30,30,30
      SetAlpha 0.7
      DrawImage self.Image,self.GetX()+5,self.GetY()
      
      SetAlpha 1.0
      SetColor 255,255,255
      DrawImage self.Image,self.GetX(),self.GetY()
         
   End Method
   
End Type







Graphics 1024,768,32,60

AutoMidHandle True

Global snakehead_img = CreateImage(32,32)
Global snakebody_img = CreateImage(32,32)
Global tile_img      = CreateImage(32,32)



SetColor 0,255,0
DrawOval 0,0,32,32
SetColor 0,0,255
DrawOval 10,10,4,4
DrawOval 20,10,4,4

GrabImage(snakehead_img,0,0)




SetColor 0,150,0
DrawOval 0,0,32,32
GrabImage(snakebody_img,0,0)



SetColor 100,60,100
DrawRect 0,0,32,32
glPolygonMode(GL_BACK, GL_LINE)
SetColor 200,100,100
DrawRect 0,0,32,32
glPolygonMode(GL_BACK, GL_FILL)
GrabImage(tile_img,0,0)




Local Snake1:TSnakeHead = TSNakeHead.GetInstance()
Snake1.SetData(GraphicsWidth()/2,GraphicsHeight()/2,snakehead_img,2.5)




Repeat
Cls

   DrawText "PRESS RETURN TO START",GraphicsWidth()/2,GraphicsHeight()/2
   
   If KeyHit(KEY_RETURN)
      Exit
   EndIf
   

Flip
FlushMem()
Forever


Repeat
Cls


If KeyDown(KEY_LEFT)
   Snake1.AddAngle(-(Snake1.GetSpeed()*1.0))
ElseIf KeyDown(KEY_RIGHT)
   Snake1.AddAngle((Snake1.GetSpeed()*1.0))
EndIf







If Rand(0,200) = 1
   Snake1.AddBody()
EndIf





ResetStates()
TileImage tile_img,0,0

TSnakeHead.RenderAndUpdate()

Flip
FlushMem()
Until KeyHit(KEY_ESCAPE)

Function ResetStates()
   SetColor 255,255,255
   SetRotation 0.0
   SetScale 1.0,1.0
   SetAlpha 1.0
   SetBlend MASKBLEND
End Function

Function Distance2D:Float(x1:Float,y1:Float,x2:Float,y2:Float)
   Local Result:Float = 0.0
   result = Sqr(((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2)))
   Return result
End Function       

Function Winkel2D(x1:Float,y1:Float,x2:Float,y2:Float)
   Return Float(ATan2(y1-y2,x1-x2)+270) Mod 360
End Function



Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Markus2

BeitragMo, Mai 16, 2005 16:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Nett Smile

Eine ist aus dem Fenster geflohen Shocked

stfighter01

BeitragMo, Mai 16, 2005 17:09
Antworten mit Zitat
Benutzer-Profile anzeigen
nette sache.
wenn dus noch schaffst den drehwinkel der einzelelemente zu begrenzen, sag ich meister zu dir.
Denken hilft!

DA

BeitragMo, Mai 16, 2005 17:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

Mhm. Mit der Demo krieg ich nach kurzer Zeit ein "Memory Access Violation"?
Könnte das vieleicht an der Demo liegen?

Thx
DarkAngel
Deutscher Blitz Basic Chat

Suco-X

Betreff: ......

BeitragMi, Mai 18, 2005 12:10
Antworten mit Zitat
Benutzer-Profile anzeigen
@DarkAngel : Keine ahnung was das sein könnte. Vllt hat er Probleme beim erstellen der Grafiken.

@STFighter : Versteh nicht genau was du meinst

Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB
 

Blitzkrieg Bop

BeitragMi, Mai 18, 2005 13:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!
Nice Suco.
@DA: Ne, mit meiner Demo gehts auch Very Happy
~ Hey Ho Let's Go ~

diGGa

GruppenKaspar

BeitragMi, Mai 18, 2005 13:53
Antworten mit Zitat
Benutzer-Profile anzeigen
DarkAngel hat Folgendes geschrieben:
Moin,

Mhm. Mit der Demo krieg ich nach kurzer Zeit ein "Memory Access Violation"?
Könnte das vieleicht an der Demo liegen?

Thx
DarkAngel


vielleicht hattest du den blitzchat an xD
Gestern Nacht Schlug der Regen an mein Fenster
Ich ging durch das dunkle Zimmer und
glaubte im Licht der Straßenlampe
Den Geist unseres jahrhunderts auf der
Straße zu sehen
Der uns sagte, daß wir alle am Rande
des Abgrunds stehen.
- Al Steward


Athlon 64 3000+ / Radeon 9600 / 1024mb ddram

DA

BeitragDo, Mai 19, 2005 20:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

hoppla. Hat wirklich den BlitzChat am laufen Embarassed. Habs jetzt nochmal getestet, jetzt gehts. Wink

Thx
DarkAngel
Deutscher Blitz Basic Chat

Ninja

BeitragMo, Jul 11, 2005 13:11
Antworten mit Zitat
Benutzer-Profile anzeigen
hi Suco,
Schöner wär's wenn alle den selben weg wie der Kopf zurücklegen würden, besonders wenn ich einen "hügel" bilde wird dieser abgeflacht, hoffe du verstehst was ich meine.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group