Studie: Frameunabhängige Bewegung

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

CodeMaster

Betreff: Studie: Frameunabhängige Bewegung

BeitragMo, Feb 20, 2006 23:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Im Rahmen eines neuen Projektes habe ich eine kurze Studie zu geschwindigkeitsunabhängiger Bewegung programmiert. Denke, es könnte für euch auch ganz nützlich sein:Code: [AUSKLAPPEN]
Global g# = 9.80665, Wind# = 0
Global GameSpeed# = 1, FrameTime#, GameTimer%, LastTimer%

Type TParticle
  Field fX#
  Field fY#
  Field fSpdX#
  Field fSpdY#
  Field fWght#
  Field fCol%
  Field fLifetime%
  Field fStart%
  Field fGlow#
End Type

Graphics 800,600,0,2
SetBuffer BackBuffer()

While Not KeyDown(1)
  Cls
  GameSpeed = GameSpeed + MouseZSpeed() / 20.0
  UpdateTimer
  If GameTimer - LastParticle > 20 Then
    For i = 1 To 100
      TParticle_Create(MouseX(),MouseY(),ATan2(-MouseY(),400-MouseX())+Rand(-20,20),50,Rnd(2,10),$FF0000 + Rand(255) * $100,2000)
    Next
    LastParticle = GameTimer
  EndIf
  TParticle_Update
  TParticle_Show
  Text 0,0, "Time factor: " + GameSpeed
  Text 0,15,"Time stamp: " + GameTimer
  Text 0,30,"Wind: " + Wind
  Flip
Wend
End

Function UpdateTimer()
  Local lTimer% = MilliSecs() - LastTimer
  If GameSpeed < 0 Then GameSpeed = 0
  FrameTime = GameSpeed * lTimer / 1000.0
  GameTimer = GameTimer + Int(GameSpeed * lTimer)
  LastTimer = MilliSecs()
End Function

Function TParticle_Create.TParticle(pX#, pY#, pDir#, pSpd#, pWght#, pCol%, pLifetime%)
  Local lParticle.TParticle = New TParticle
  lParticle\fX = pX
  lParticle\fY = pY
  lParticle\fSpdX = Cos(pDir) * pSpd
  lParticle\fSpdY = Sin(pDir) * pSpd
  lParticle\fWght = pWght
  lParticle\fCol = pCol
  lParticle\fLifetime = pLifetime
  lParticle\fStart = GameTimer
  lParticle\fGlow = 1
  Return lParticle
End Function

Function TParticle_Update()
  Local lParticle.TParticle
  Local lCurrentLifetime
  For lParticle = Each TParticle
    lCurrentLifetime = GameTimer - lParticle\fStart
    If (lCurrentLifetime < lParticle\fLifetime) And (lParticle\fX >= 0) And (lParticle\fY >= 0) And (lParticle\fX < GraphicsWidth()) And (lParticle\fY < GraphicsHeight()) Then
      lParticle\fSpdX = lParticle\fSpdX - lParticle\fSpdX * 0.65 * FrameTime + Wind * 10 * FrameTime
      lParticle\fSpdY = lParticle\fSpdY + lParticle\fWght * g * FrameTime
      lParticle\fX = lParticle\fX + (lParticle\fSpdX * 5 + Rnd(-10,10)) * FrameTime
      lParticle\fY = lParticle\fY + (lParticle\fSpdY * 5 + Rnd(-10,10)) * FrameTime
      lParticle\fGlow = 1 - (lCurrentLifetime / Float(lParticle\fLifetime))^2
    Else
      Delete lParticle
    EndIf
  Next
End Function

Function TParticle_Show()
  Local lParticle.TParticle
  Local lR, lG, lB
  LockBuffer()
  For lParticle = Each TParticle
    If (lParticle\fX >= 0) And (lParticle\fY >= 0) And (lParticle\fX < GraphicsWidth()) And (lParticle\fY < GraphicsHeight()) Then
      lR = (lParticle\fCol And $FF0000) / $10000 * lParticle\fGlow
      lG = (lParticle\fCol And $FF00) / $100 * lParticle\fGlow
      lB = (lParticle\fCol And $FF) * lParticle\fGlow
      WritePixelFast(lParticle\fX, lParticle\fY, lR * $10000 + lG * $100 + lB)
    EndIf
  Next
  UnlockBuffer()
End Function


[edit] Steuerung mit dem Mausrad. Alles andere ist selbsterklärend.
[edit 2] Die Variablen zur Berechnung der Bewegung sind GameSpeed (festzulegender Zeitraffer-Faktor), FrameTime (Faktor für Bewegungsberechnung) und GameTimer (Zeitindex, zu gebrauchen wie Millisecs()).
[edit 3] Die Demo etwas spektakulärer gemacht Wink
Dies ist ein Text, der an jeden Beitrag von dir angehängt werden kann. Es besteht eine Limit von 500 Buchstaben.

Zuletzt bearbeitet von CodeMaster am Mo Apr 01, Parse error: syntax error, unexpected ';' in htdocs\viewtopic.php on line 102
  • Zuletzt bearbeitet von CodeMaster am Mo, Feb 20, 2006 23:20, insgesamt 4-mal bearbeitet

aMul

Sieger des Minimalist Compo 01/13

BeitragMo, Feb 20, 2006 23:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey danke!
Wollte das grad in mein Spiel einbauen.
Da hast du mir einiges an denken(und tippen) erspart^^
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

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group