Rythym Games

Blitz3D Forums/Blitz3D Programming/Rythym Games

daaan(Posted 2005) [#1]
Hi, I wanted to make a rythym game like DDR or Donkey Konga. My question is, how do I keep the program running at a set BPM.
Thanks


slenkar(Posted 2005) [#2]
check out the rendertweening tutorial at blitzcoder.com,to make the program run a set 'frames per second'
then set up timers to control BPM

e.g.
GLOBAL BPM_Timer
GLOBAL BPM=20
GLOBAL BPM_INTERVAL=(60/BPM)*1000
GLOBAL time

[main loop]

Time=millisecs()
if Time>BPM_Timer+BPM_INTERVAL
BPM_Timer =time
music_game_function()
endif



John Blackledge(Posted 2005) [#3]
I think he means:

http://www.blitzcoder.com/cgi-bin/articles/show_article.pl?f=johnblackledge09202003161847.html

I guess it's about time I moved it to this site.


Ice9(Posted 2005) [#4]
you'll need your own beat.wav

this uses delta time rather than render tweening

;S. Richardson
;ICE9
;Give Me The Beat



Graphics3D 800,600,0,2

Global wavKonga = LoadSound("beat.wav")


;desired frames per second
Const  TARGET_FPS# = 30.0

;for timing	
Global previous% = MilliSecs()	
Global lastFPS%  = MilliSecs()
Global fpscount

;for beats per minute
Const MINUTE =60*TARGET_FPS#
BPM=120

camera = CreateCamera()
PositionEntity camera,0,0,-15
light = CreateLight()
PositionEntity light,20,20,40

Type cube
Field entity
End Type

piv=CreatePivot()
PositionEntity piv,0,0,0
For cnt = 1 To 100
	TheCube.cube= New cube
	TheCube\entity = CreateCube(piv)
	PositionEntity TheCube\entity,Float(Rnd(-5,+5)),Float(Rnd(-5,+5)),Float(Rnd(-5,+5)),False
	EntityColor TheCube\entity,Rnd(0,255),Rnd(0,255),Rnd(0,255)
Next


While KeyDown(1)=0

	;calculate delta time
	CalcTimer()
	now%   = MilliSecs()
	delta# = (now - previous) / (1000 / TARGET_FPS)
	If delta <= 0 Then delta = 0.001
	previous = now
	
	;add interval to beat variable
	GiveMeTheBeat=GiveMeTheBeat+delta#
	
	;turn the balls
	TurnEntity piv,1*delta#,2*delta#,3*delta#
	For TheCube= Each Cube
		TurnEntity TheCube\entity,4*delta#,2*delta#,3*delta#		
	Next	
	;if interval reached then give me the beat
	If GiveMeTheBeat > MINUTE/BPM
		PlayBeat()		
		GiveMeTheBeat=0
		For TheCube= Each Cube
			ScaleEntity TheCube\entity,1.5,1.5,1.5	
					
		Next
		scaled=1
	EndIf
	;update the world delta for animation timing
	UpdateWorld delta
	
	Flip True
	VWait
	
	RenderWorld
	
	If scaled=1
		For TheCube= Each Cube
			ScaleEntity TheCube\entity,1,1,1
		Next
		scaled=0
	EndIf

Wend 

;Play the beat
Function PlayBeat()
	chnBeat = PlaySound(wavKonga)
End Function


;Calculate interval
Function CalcTimer#()

	ms_passed#=MilliSecs()-render_time
	render_time=MilliSecs()
	multiplier#=(multiplier#*4.0 + Float(ms_passed#/ TimePerFrame))/5.0
	If multiplier# >2 Then multiplier#=2
	;Get fps
	frames=frames+1
	If MilliSecs()-r_time=>1000 Then fpscount=frames : frames=0 : r_time=MilliSecs()
 
End Function




Ice9(Posted 2005) [#5]
One thing about both methods, if your frame rate drops below
your desired frame rate you'll get pops in both the sound
and the graphics.