Null object for Object Timer?

Monkey Forums/Monkey Beginners/Null object for Object Timer?

underdrummer(Posted 2014) [#1]
Hi all, I'm new to Monkey X and the forums. I have a Fantom Engine question. I hope it's okay to ask it here.
I want to use CreateObjTmer just for the timer. I don't need OnUpdateTimer to do anything to an object but the parameters for the overload are ftObject, TimerId. So I created a generic object and assigned it Null. It still doesn't work. Do you have to use a non-null object for CreateObjTimer?
OnObjectUpdate Method
...
CreateObjTimer(g.generic, g.tmShotTime, 3000)

'OnObjectTimer Method
Method OnObjectTimer:Int(timerId:Int, obj:ftObject)
'check for shot Time timer
If timerId = g.tmShotTime Then
'timer is done so allow player to shoot again
g.playerCanShoot = True
'reset bulletCount (give player 3 more shots before timer fires again)
g.bulletCount = 0
Endif
Is it not possible to use Null objects here?
Thanks.


rIKmAN(Posted 2014) [#2]
You might be better off posting this in the FantomEngine thread as it is not obvious from your title that this is related to FantomEngine, so Mike might not see it.

Try here: http://www.monkeycoder.co.nz/Community/posts.php?topic=5315


MikeHart(Posted 2014) [#3]
Hi underdummer,

next time just prefix your topic title with fantomEngine. Makes it easier to find. Or ask at my own forum.

Anyway, ftEngine.CreateTimer is what you might need. A null object won't work as there is a reference between an object and a timer when you create the timer like you had. And the object needs to be updated for the object timer to update. So use use ftEngine.CreateTimer. That should work.


underdrummer(Posted 2014) [#4]
Hi MikeHart,

Thank you for the response . I will use fantomEngine in my subject next time I post on Monkey X. Should I be asking fantomEngine questions on this website forum or the fantomGL support forum?
Anyways, I replaced my CreateObjTimer with CreateTimer but it's not working. When using CreateTimer,
is the timer still updated in the OnObjectTimer() Method? I did not get a compile error but my app acts as if the timer never triggered.
Thanks.


MikeHart(Posted 2014) [#5]
I will post a sample over the day.


MikeHart(Posted 2014) [#6]
Here you go:

Strict

#rem
	Script:			Timer.monkey
	Description:	Sample script to show how to use timer
	Author: 		Michael Hartlef
	Version:      	1.0
#End

' Set the AutoSuspend functionality to TRUE so OnResume/OnSuspend are called
#MOJO_AUTO_SUSPEND_ENABLED=True

' Import the fantomEngine framework which imports mojo itself
Import fantomEngine

' The _g variable holds an instance to the cGame class
Global _g:cGame

'***************************************
' The cGame class controls the app
Class cGame Extends App
	' Create a field to store the instance of the cEngine class, which is an instance
	' of the ftEngine class itself
	Field fE:cEngine

	' Define two constants for timer IDs	
	Const engineTimer:Int = 1
	Const objectTimer:Int = 2
	
	
	'------------------------------------------
	Method OnCreate:Int()
		' Set the update rate of Mojo's OnUpdate events to be determined by the devices refresh rate.
		SetUpdateRate(0)
		
		' Create an instance of the fantomEngine, which was created via the cEngine class
		fE = New cEngine
	
		' Create a timer without a connection to an object which creates new circles at every second
		fE.CreateTimer(engineTimer, 1000, -1)
		

		Return 0
	End
	'------------------------------------------
	Method OnUpdate:Int()
		' If the CLOSE key was hit, exit the app ... needed for GLFW and Android I think. 
		If KeyHit( KEY_CLOSE ) Then fE.ExitApp()
		
		' Determine the delta time and the update factor for the engine
		Local timeDelta:Float = Float(fE.CalcDeltaTime())/60.0

		' Update all objects of the engine
		If fE.GetPaused() = False Then
			fE.Update(timeDelta)
		Endif
		Return 0
	End
	'------------------------------------------
	Method OnRender:Int()
		' Check if the engine is not paused
		If fE.GetPaused() = False Then
			' Clear the screen 
			Cls 255,0,0
		
			' Render all visible objects of the engine
			fE.Render()
		Endif
		Return 0
	End
End	

'***************************************
' The cEngine class extends the ftEngine class to override the On... methods
Class cEngine Extends ftEngine
	'------------------------------------------
	Method OnObjectTimer:Int(timerId:Int, obj:ftObject)
		' This method is called when an objects' timer was being fired.
		If timerId = _g.objectTimer
			obj.Remove()
		Endif
		Return 0
	End	

    '------------------------------------------
	Method OnTimer:Int(timerId:Int)
		' This method is called when an engine timer was being fired.
		If timerId = _g.engineTimer
			' Create a simple circle
			Local circle := self.CreateCircle(20,Rnd(self.GetCanvasWidth()),Rnd(self.GetCanvasHeight()))

			' Two ways to create an object bound timer
			' circle.CreateTimer(_g.objectTimer, 1500)
			self.CreateObjTimer(circle, _g.objectTimer, 1500)
		Endif
		Return 0
	End	
End

'***************************************
Function Main:Int()
	' Create an instance of the cGame class and store it inside the global var 'g'
	_g = New cGame
	
	Return 0
End





underdrummer(Posted 2014) [#7]
Thank you MikeHart. I can now use CreateTimer like a pro!


MikeHart(Posted 2014) [#8]
:-)