HELP on terrain listener

sunny83

06-01-2006 07:41:19

I am newbie to Pyogre.

and i encounter problem for the following code.

class Bot(ogre.FrameListener):
def __init__(self,sceneManager):
#entity creation
self.sceneManager = sceneManager
self.entity = sceneManager.createEntity('Player','Base.003.mesh');
self.entity_node = sceneManager.rootSceneNode.createChildSceneNode(ogre.Vector3(128,25,128))
self.entity_node.attachObject(self.entity)
#parameter setup
self.height= 25.0
self.speed = 30.0
self.rotSpeed = 30.0
#rayscenequery
self.terrainRayQuery = tl.TerrainListener(self.entity_node,self.sceneManager)
root= ogre.Root.getSingleton()
root.addFrameListener(self.terrainRayQuery)
def frameStarted(self,frameEvent):
pass



# Terrain Listener using terrain ray query

import pyogre.ogre as ogre


class TerrainListener(ogre.FrameListener):
def __init__(self,target,sceneManager):
self.sceneManager = sceneManager
self.raySceneQuery = sceneManager.createRayQuery(ogre.Ray(target.position,
ogre.Vector3.NEGATIVE_UNIT_Y))
self.target = target

def frameStarted(self, frameEvent):
# clamp to terrain
updateRay = ogre.Ray()
updateRay.origin = self.target.position
updateRay.direction = ogre.Vector3.NEGATIVE_UNIT_Y
self.raySceneQuery.ray = updateRay
for queryResult in self.raySceneQuery.execute():
if queryResult.worldFragment is not None:
pos = self.target.position
self.target.position = (pos.x, pos.y - queryResult.distance + 15.0, pos.z)
break

return true


it shows error in the frame listener
Traceback (most recent call last):
File "C:\Python24\pyogre\ogre_demos\character.py", line 68, in ?
application.go()
File "C:\Python24\pyogre\ogre_demos\SampleFramework.py", line 23, in go
if not self._setUp():
File "C:\Python24\pyogre\ogre_demos\SampleFramework.py", line 48, in _setUp
self._createScene()
File "C:\Python24\pyogre\ogre_demos\character.py", line 28, in _createScene
self.player=Bot(sceneManager)
File "C:\Python24\pyogre\ogre_demos\character.py", line 59, in __init__
root.addFrameListener(self.terrainRayQuery)
File "C:\Python24\Lib\site-packages\pyogre\ogre.py", line 13524, in addFrameListener
return _ogre.Root_addFrameListener(*args)
TypeError: argument number 2: a 'Ogre::FrameListener *' is expected, 'TerrainListener' is received


Can anyone please help me , wats wrong with the code?

sunny83

07-01-2006 07:48:49

I am already been using Ogre and is new to Pyogre

but I am not sure why i cant do the following llline


self.tListener = terrainListener(something)
root=ogre.root.getSingleton()
root.addFrameListener(self.tListener)

it keep on saying that i cant use the argument self.tListener

Clay

07-01-2006 10:58:50

You have to call the __init__ function of the parent class when you subclass a pyogre class. (Remember that Python does not automatically call the parent class' constructor, you must do that yourself.)

So the first line of Bot.__init__ should be:
class Bot(ogre.FrameListener):
def __init__(self,sceneManager):
ogre.FrameListener.__init__(self)
# your code here


This is also the same for the TerrainListener:
class TerrainListener(ogre.FrameListener):
def __init__(self,target,sceneManager):
ogre.FrameListener.__init__(self)
# your code here


Let me know if this doesn't fix the problem, or if you have any other questions.

sunny83

08-01-2006 07:31:00

it works..thanks