I am in need of some help, iv been working this problem for a few weeks now and cant get it right. Iv searched the forum but haven't found much luck on the specifics of timing a particle system to different machine speeds. I want to have a consistent rate of emission on any pc, i know it might slow down the game(like how eschalon gets slow) of a really slow PC but that's ok, I would add a slider for effects. I just want to make sure it looks decent on a fast machine, right now it seems to emit a bunch of particles then stop and emit a few seconds later when the die. I'm using a timing function that i found in the code DB. I just don't know where i need to multiply the AppSpeed() in my particle update. Frankly im not sure if im even doing any of the timing stuff right for it at all. I understand the regular animation timing, and it works, its just an issue with how im doing it in the particle system. Ill post the code, but i cant promise itl make much sense lol. Any help on this is appreciated if im making sense.
Timing Function below
Module mymods.timing
Private
Global AppTime_UPS
Global AppTime_Iterator
Global AppTime_CurrentTime
Global AppTime_PauseStart=0
Global AppTime_Speed:Float=1.0
Global AppTime_DesiredLoopTime#=1000.0/60.0
Global AppTime_LastUpdateTime=0
Global AppTime_LastUPSTime
Public
Rem
bbdoc:
EndRem
Function UpdateAppTime(framerate=60)
Local time
Local elapsed
If AppTime_PauseStart Return
AppTime_DesiredLoopTime=1000.0/framerate
time=MilliSecs()
If AppTime_LastUpdateTime=0
AppTime_Speed#=1.0
AppTime_LastUpdateTime=time
AppTime_CurrentTime=time
AppTime_LastUPSTime=time
Else
elapsed=time-AppTime_LastUpdateTime
If Not elapsed
elapsed=1
Delay 1
time:+1
EndIf
AppTime_Speed=Float(elapsed)/Float(AppTime_DesiredLoopTime)
AppTime_CurrentTime=time
AppTime_LastUpdateTime=time
EndIf
AppTime_Iterator:+1
If AppTime_CurrentTime-AppTime_LastUPSTime>=1000
AppTime_UPS=Float(AppTime_Iterator)/(Float(AppTime_CurrentTime-AppTime_LastUPSTime)/1000.0)
AppTime_LastUPSTime=AppTime_CurrentTime
AppTime_Iterator=0
EndIf
EndFunction
Rem
bbdoc:
EndRem
Function AppTime()
Return AppTime_CurrentTime
EndFunction
Rem
bbdoc:
EndRem
Function AppSpeed#()
Return AppTime_Speed
EndFunction
Rem
bbdoc:
EndRem
Function UPS:Int()
Return AppTime_UPS
EndFunction
Rem
bbdoc:
EndRem
Function PauseApp()
If AppTime_PauseStart Return
AppTime_PauseStart=MilliSecs()
EndFunction
Rem
bbdoc:
EndRem
Function ResumeApp()
If Not AppTime_PauseStart Return
If AppTime_LastUpdateTime
Local elapsed=MilliSecs()-AppTime_PauseStart
AppTime_LastUpdateTime:+elapsed
EndIf
AppTime_PauseStart=0
EndFunction
My particle code if it helps.
Type tJParticle
Field x:Float
Field y:Float
Field r:Byte
Field g:Byte
Field b:Byte
Field alpha:Float
Field scale:Float
Field rot:Float
Field xspeed:Float
Field yspeed:Float
Field age:Float = 0
Function Create:tJParticle(x:Float, y:Float, initialalpha:Float, initialscale:Float, initialxspeed:Float, initialyspeed:Float)
Local temp:tJParticle = New tJParticle
temp.x = x
temp.y = y
temp.alpha = initialalpha
temp.scale = initialscale
temp.xspeed = initialxspeed
temp.yspeed = initialyspeed
Return temp
End Function
End Type
Type tJEmitter
Field partimg:tImg = LoadImg("particle.png")
Field Layer1:TList = CreateList()
Field pmax:Int
Field x:Float
Field y:Float
Field frame:Float
Field emitdelay:Float = 1
Field emitrate:Int = 1
Field blendmode:Int = LIGHTBLEND
Field pred:Int = 200
Field pgreen:Int = 100
Field pblue:Int = 50
Field xaccel:Float = 0
Field yaccel:Float =.0001
Field initialalpha:Float = 1
Field initialalphajitter:Float = 0
Field alphadecay:Float =.01
Field alphadecayjitter:Float = 0
Field initialscale:Float = 0
Field initialscalejitter:Float = 0
Field scalerate:Float =.01
Field scaleratejitter:Float = 0
Field lifetime:Float = 200
Method Update()
Local time:Int = MilliSecs()
For Local t:tJParticle = EachIn layer1
t.x = t.x + (t.xspeed * AppSpeed())
t.y = t.y + (t.yspeed * AppSpeed())
t.alpha = t.alpha - (alphadecay * AppSpeed())
t.scale = t.scale + (scalerate * AppSpeed())
If t.alpha <= 0 Or t.age >= lifetime Then
ListRemove(layer1, t)
End If
t.age:+1 * AppSpeed()
Next
If layer1.Count() < pmax And frame >= emitdelay Then
For Local e:Int = 0 To emitrate
ListAddLast(layer1, tJParticle.Create(x, y, initialalpha, initialscale, Rnd(- 1, 1), - 1))
Next
frame = 0
Else
frame:+AppSpeed()
End If
End Method
Method Draw()
RenderState.Push()
SetBlend(blendmode)
For Local t:tJParticle = EachIn layer1
SetColor(pred, pgreen, pblue)
SetAlpha(t.alpha)
SetScale(t.scale, t.scale)
DrawImg(partimg, t.x, t.y)
Next
RenderState.Pop()
DrawText(layer1.Count(), x, y - 30)
End Method
Function Create:tJEmitter(x:Float, y:Float, pmax:Int)
Local temp:tJEmitter = New tJEmitter
temp.pmax = pmax
temp.x = x
temp.y = y
Return temp
End Function
End Type
Type tJParticleSystem Extends tGameObject
Field emitters:TList = CreateList()
Method Draw()
For Local t:tJEmitter = EachIn emitters
t.Draw()
Next
End Method
Method Update()
For Local t:tJEmitter = EachIn emitters
t.x = x
t.y = y
t.Update()
Next
End Method
Method CreateEmitter(pmax:Int)
ListAddLast(emitters, tJEmitter.Create(x, y, pmax))
End Method
Function Create:tJParticleSystem(name:String, x:Float, y:Float)
Local temp:tJParticleSystem = New tJParticleSystem
temp.name = name
temp.x = x
temp.y = y
ListAddLast(tGameObject.objectlist, temp)
Return temp
End Function
End Type
Function GetParticleSystem:tJParticleSystem(name:String)
For Local t:tJParticleSystem = EachIn tGameObject.objectlist
If t.name = name Then Return t
Next
Throw "psystem not found: " + name
End Function
Function CreateJParticleSystem:tJParticleSystem(name:String, x:Float, y:Float)
Return tJParticleSystem.Create(name, x, y)
End Function
Function AddEmitter(system:Object, pmax:Int)
If tJParticleSystem(system) Then
tJParticleSystem(system).CreateEmitter(pmax)
Else If String(system) Then
GetParticleSystem(String(system)).CreateEmitter(pmax)
End If
End Function
|