fantomEngine, Why are my objects not updating?
Monkey Forums/Monkey Beginners/fantomEngine, Why are my objects not updating?
| ||
| I am very new to Monkey X and fantomEngine so please be gentle. I am making a simple game for HTML 5. I create some spider images objects and have them move across the screen. When a spider obj crosses a certain point on the X-axis I want each individual object to be removed. My code only removes the last object created. I probably need to use a list or something but I'm not sure how. Below is code from my spawnenemy method and the onobjectupdate methods 'SpawnEnemy Method Method SpawnEnemy:ftObject() 'y = the highest Y pos lane first Local y:Int = 102 'for loop to create a spider in each lane For Local spawn:Int = 1 To 5 'spawn enemy in lanes 1 - 5 enemy = eng.CreateImage(atlas, 0, 0, 64, 64, -32, y) enemy.SetLayer(layerGame) enemy.SetRadius(10) enemy.SetSpeedX(Rnd(0.5, 3)) enemy.SetColGroup(grpEnemy) enemy.SetColWith(grpShot, True) 'raise spider count spiderCount += 1 'raise Y pos 64 eachtime it loops y += 64 'enemyArray[spawn] = enemy Print("I SPAWNED AN ENEMY") Next Endif Return enemy End 'OnObjectUpdate Method Method OnObjectUpdate:Int(obj:ftObject) ' This method is called when an object finishes its update 'when object equals enemy object If obj = g.enemy Then If obj.GetPosX() > 400 Then g.lP -= 1 'increase # of spiders that made it through g.spiderGotThroughCount += 1 obj.Remove() Endif Endif What am I doing wrong here? Thanks. |
| ||
| Do you call the Update method or your engine instance? How does your OnUpdate method looks like. please put your code next into code tags. What is IP? Another problem is that you only store the latest object inside your global enemy field. You shoudl give the object a tag or ID and check it against that. Then it should work. I will post a sample later. Need to go out. |
| ||
| Hi MikeHart, Thanks for the reply. lP is lifePoints variable. I don't know how to assign tag or Id. Looking forward to an example. I have posted my OnUpdate Method section that deals with the enemies. There are only enemies on the night screen. Method OnUpdate:Int()
' Determine the delta time and the update factor for the engine
Local d:Float = Float(eng.CalcDeltaTime())/60.0
If isSuspended = False Then
Select gameMode
'player is in the night screen
Case gmPlayNight
'play night background music (looping)
If playNightSound = True Then
sndDayBackGround.Stop()
sndNightBackGround.SetVolume(0.3)
sndNightBackGround.Play(2)
playNightSound = False
playDaySound = True
Endif
'If TouchHit(0) Then
'eng.TouchCheck(layerTitle)
'Endif
'collision check the game layer
eng.CollisionCheck(layerGame)
eng.Update(Float(d))
'during play mode, allow player to exit wwith ESCAPE key
If KeyHit(KEY_ESCAPE) Then
'stop any music if playing
sndNightBackGround.Stop()
sndDayBackGround.Stop()
g.layerDayBackGround.SetActive(False)
g.layerNightBackGround.SetActive(False)
g.layerGame.SetActive(False)
g.layerDirections.SetActive(False)
g.layerTitle.SetActive(True)
gameMode = gmMenu
Endif
'TESTING ONLY!
'Print("MouseX: "+MouseX()+" MouseY: "+MouseY())
If spidersRemaining <= 0 And lP > 0 Then
'start a timer before fading out to day screen
eng.CreateTimer(tmEndOfNightPause, 3000)
If endOfNightPause = True Then
'g.layerDirections.SetAlpha(0.0)
'g.layerTitle.SetAlpha(0.0)
g.layerGame.SetActive(False)
g.layerDirections.SetActive(False)
g.layerTitle.SetActive(False)
'MAKES SCREEN FADE IN AND OUT
'layer transition of 2000 milliseconds
layerNightBackGround.CreateTransAlpha(0.01, 1000, False, tmFadeOutNight)
Endif
Endif
UpdateInfoText()
...Thanks. |
| ||
| HI MikeHart, Still looking forward to a reply from you. I tried this per your suggestions but I guess I'm not doing it right. SpawnEnemy Method... For Local spawn:Int = 1 To 5
'spawn enemy in lanes 1 - 5
enemy = eng.CreateImage(atlas, 0, 0, 64, 64, -32, y)
enemy.SetLayer(layerGame)
enemy.SetRadius(10)
enemy.SetSpeedX(Rnd(speedMin, speedMax)) 'set this speed according to level
enemy.SetColGroup(grpEnemy)
enemy.SetColWith(grpShot, True)
enemyId += 1
enemy.SetTag(enemyId)
'raise spider count
spiderCount += 1
'raise Y pos 64 eachtime it loops
y += 64
'enemyArray[spawn] = enemy
Print("I SPAWNED AN ENEMY and it's id is: "+enemy.GetTag())
NextOnObjectUpdate Method... 'when object equals enemy object
If obj = g.enemy Then
'loop through enemies
For Local loop:Int = 1 To g.spiderCount
'check each ones X position and tag
If obj.GetTag() = loop And obj.GetPosX() > 400 Then
g.lP -= 1
'increase # of spiders that made it through
g.spiderGotThroughCount += 1
obj.Remove()
'Endif
'Next
'EndifIt still only updates the final enemy. ??? |
| ||
| Sorry, was very busy. I will try later this day. Have to go to work now. |
| ||
Sorry for the delay. But here you go. If you have questions, just ask. My preferred location would be the fantomEngine support forum.
Strict
#rem
Script: UpdateObjects.monkey
Description: Sample script to show how to update objects based on their category
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 a constant for a timer
Const engineTimer:Int = 1
' Define 2 constants to identify each type of object
Const ENEMY:Int = 100
Const FRIEND:Int = 101
'------------------------------------------
Method SpawnObject:Void()
' Create a simple circle
Local tmpObj := fE.CreateCircle(20,fE.GetCanvasWidth()-20,Rnd(20,fE.GetCanvasHeight()-20))
' Give it a random speed facing left
tmpObj.SetSpeed(Rnd(5,10),270)
' Give it a random size
tmpObj.SetScale(Rnd(0.2,1.0))
' Now create a timer to spawn the next object
fE.CreateTimer(engineTimer, Rnd(200,1000))
' Tag the object with a 50% chance to be a FRIEND or an ENEMY, and give it a color.
If Rnd(10)>5
tmpObj.SetTag(ENEMY)
Else
tmpObj.SetTag(FRIEND)
tmpObj.SetColor(255,0,255)
Endif
End
'------------------------------------------
Method OnCreate:Int()
' Set the update rate of Mojo's OnUpdate events to be determined by the devices refresh rate.
SetUpdateRate(60)
' 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, 500)
' Create tweo lines to mark where each object type will be removed
fE.CreateLine(20,0,20,fE.GetCanvasHeight())
fE.CreateLine(200,0,200,fE.GetCanvasHeight())
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 0,255,0
' Render all visible objects of the engine
fE.Render()
' Draw some debugging info on the screen
SetColor(255,255,0)
DrawText("FPS: "+ fE.GetFPS(), 20,20)
DrawText("ObjCount: "+ fE.GetObjCount(), 20,40)
' Restore the current color of the engine
fE.RestoreColor()
Endif
Return 0
End
End
'***************************************
' The cEngine class extends the ftEngine class to override the On... methods
Class cEngine Extends ftEngine
Method OnObjectUpdate:Int(obj:ftObject)
' This method is called when an object finishes its update. You can deactivate the event via ftObject.ActivateUpdateEvent.
' Remove the enemy object depending on its tag and X-Position
If obj.GetTag()=_g.ENEMY And obj.GetPosX() < 20
obj.Remove()
Endif
' Remove the friend object depending on its tag and X-Position
If obj.GetTag()=_g.FRIEND And obj.GetPosX() < 200
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
_g.SpawnObject()
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
|
| ||
| The problem you had was that g.enemy online stores the last enemy object you have created. That is why your code only updates the last object. You need to identify an object via GetTag, GetID, GetName, GetColGroup, whatever... which you have set before. Or store it differently before. |
| ||
| MikeHart, Awesome! It's working great now. I used obj.SetTag(ENEMY) like you suggested. Now my OnObjectUpdate updates EACH enemy. Thank you for your time. |
| ||
| No problem. :-) |