tomneo2000
21-10-2009 14:05:22
I know this question has been ask before but the solution is not work for me. My cursor only can move around a small square on the left top of window so i add this code to my FrameListener . Of course, my FrameListener inherit Ogre's WindowEventListener.
When i compile it i got these error:
1>c:\documents and settings\administrator\桌面\ogreproject\object_picking\object_picking\objectpicking.cpp(94) : error C2059: syntax error : 'constant'
1>c:\documents and settings\administrator\桌面\ogreproject\object_picking\object_picking\objectpicking.cpp(99) : error C2039: 'evt' : is not a member of 'OIS::MouseState'
1> c:\ogresdk\include\ois\oismouse.h(42) : see declaration of 'OIS::MouseState'
1>c:\documents and settings\administrator\桌面\ogreproject\object_picking\object_picking\objectpicking.cpp(99) : error C2039: 'key' : is not a member of 'OIS::MouseState'
1> c:\ogresdk\include\ois\oismouse.h(42) : see declaration of 'OIS::MouseState'
Any one know how to solve it ?
My code is here
void MyFrameListener::windowResized(Ogre::RenderWindow* rw)
{
const OIS::MouseState &ms=mymouse->getMouseState();
ms.width=rw->getWidth();
ms.height=rw->getHeight();
}
When i compile it i got these error:
1>c:\documents and settings\administrator\桌面\ogreproject\object_picking\object_picking\objectpicking.cpp(94) : error C2059: syntax error : 'constant'
1>c:\documents and settings\administrator\桌面\ogreproject\object_picking\object_picking\objectpicking.cpp(99) : error C2039: 'evt' : is not a member of 'OIS::MouseState'
1> c:\ogresdk\include\ois\oismouse.h(42) : see declaration of 'OIS::MouseState'
1>c:\documents and settings\administrator\桌面\ogreproject\object_picking\object_picking\objectpicking.cpp(99) : error C2039: 'key' : is not a member of 'OIS::MouseState'
1> c:\ogresdk\include\ois\oismouse.h(42) : see declaration of 'OIS::MouseState'
Any one know how to solve it ?
My code is here
class MyFrameListener:public FrameListener, public OIS::KeyListener, public OIS::MouseListener, public Ogre::WindowEventListener
{
protected:
enum queryflag
{
ninjamask=1<<0,
robotmask=1<<1
};
SceneManager* myscenemgr;
Camera* mycamera;
SceneNode* mCameraNode;
SceneNode* mCameraYawNode;
SceneNode* mCameraPitchNode;
SceneNode* mCameraRollNode;
Ogre::Degree Yrotatescale;
Ogre::Degree Xrotatescale;
Ogre::Vector3 movescale;
OIS::Keyboard* mykeyboard;
OIS::Mouse* mymouse;
RaySceneQuery* myrayscenequery;
CEGUI::Renderer* mygui;
Vector3 cammove;
SceneNode* currentobject;
float rotatespeed;
float movespeed;
bool keeprender;
bool lmousedown;
bool rmousedown;
int objectcount;
bool robotmod;
Ogre::String debugtext;
Overlay* debugoverlay;
MyGUI::Gui* mGUI;
public:
MyFrameListener(SceneManager* _myscenemgr, Camera* _mycamera, OIS::Keyboard* _mykeyboard, OIS::Mouse* _mymouse, CEGUI::Renderer* _mygui, MyGUI::Gui* _gui)
{
myscenemgr=_myscenemgr;
mycamera=_mycamera;
mykeyboard=_mykeyboard;
mymouse=_mymouse;
mygui=_mygui;
myrayscenequery=myscenemgr->createRayQuery(Ray());
rotatespeed=0.5f;
movespeed=35.0f;
cammove.x=cammove.y=cammove.z=0.0f;
keeprender=true;
lmousedown=false;
rmousedown=false;
robotmod=true;
objectcount=0;
currentobject=NULL;
Yrotatescale=Ogre::Degree(0.0f);
Xrotatescale=Ogre::Degree(0.0f);
mCameraNode=myscenemgr->getSceneNode("CameraNode");
mCameraYawNode=myscenemgr->getSceneNode("CameraYawNode");
mCameraPitchNode=myscenemgr->getSceneNode("CameraPitchNode");
mCameraRollNode=myscenemgr->getSceneNode("CameraRollNode");
movescale=Ogre::Vector3(0,0,0);
debugtext="Key not pressed";
debugoverlay=OverlayManager::getSingleton().getByName("Core/DebugOverlay");
debugoverlay->hide();
mGUI=_gui;
MyGUI::LayoutManager::getInstance().load("buttongui.layout");
MyGUI::ButtonPtr mybutton=mGUI->findWidget<MyGUI::Button>("MyButton");
mykeyboard->setEventCallback(this);
mymouse->setEventCallback(this);
}
~MyFrameListener()
{
myscenemgr->destroyQuery(myrayscenequery);
}
void MyFrameListener::windowResized(Ogre::RenderWindow* rw)
{
const OIS::MouseState &ms=mymouse->getMouseState();
ms.width=rw->getWidth();
ms.height=rw->getHeight();
}
bool keyPressed(const OIS::KeyEvent& evt)
{
if(evt.key==OIS::KC_ESCAPE)
{
keeprender=false;
}
if(evt.key==OIS::KC_M)
{
if(!robotmod)
robotmod=true;
else
robotmod=false;
}
if(mykeyboard->isKeyDown(OIS::KC_W)||mykeyboard->isKeyDown(OIS::KC_UP))
{
//cammove.z-=movespeed;
movescale.z-=movespeed*0.05f;
debugtext="Key pressed";
}
if(mykeyboard->isKeyDown(OIS::KC_S)||mykeyboard->isKeyDown(OIS::KC_DOWN))
{
//cammove.z+=movespeed;
movescale.z+=movespeed*0.05f;
debugtext="Key pressed";
}
if(mykeyboard->isKeyDown(OIS::KC_A)||mykeyboard->isKeyDown(OIS::KC_LEFT))
{
//cammove.x-=movespeed;
movescale.x-=movespeed*0.05f;
debugtext="Key pressed";
}
if(mykeyboard->isKeyDown(OIS::KC_D)||mykeyboard->isKeyDown(OIS::KC_RIGHT))
{
//cammove.x+=movespeed;
movescale.x+=movespeed*0.05f;
debugtext="Key pressed";
}
if(mykeyboard->isKeyDown(OIS::KC_PGDOWN))
{
//cammove.y+=movespeed;
movescale.y-=movespeed*0.05f;
mCameraNode->setPosition(mCameraNode->getPosition()-Ogre::Vector3(0, movespeed, 0));
debugtext="Key pressed";
}
if(mykeyboard->isKeyDown(OIS::KC_PGUP))
{
//cammove.y-=movespeed;
movescale.y+=movespeed*0.05f;
mCameraNode->setPosition(mCameraNode->getPosition()+Ogre::Vector3(0, movespeed, 0));
debugtext="Key pressed";
}
return keeprender;
}
bool keyReleased(const OIS::KeyEvent& evt)
{
if(evt.key==OIS::KC_W||evt.key==OIS::KC_UP)
{
//cammove.z=0;
movescale.z=0;
}
if(evt.key==OIS::KC_S||evt.key==OIS::KC_DOWN)
{
//cammove.z=0;
movescale.z=0;
}
if(evt.key==OIS::KC_A||evt.key==OIS::KC_LEFT)
{
//cammove.x=0;
movescale.x=0;
}
if(evt.key==OIS::KC_D||evt.key==OIS::KC_RIGHT)
{
//cammove.x=0;
movescale.x=0;
}
if(evt.key==OIS::KC_PGUP)
{
//cammove.y=0;
movescale.y=0;
}
if(evt.key==OIS::KC_PGDOWN)
{
//cammove.y=0;
movescale.y=0;
}
debugtext="Key not pressed";
return keeprender;
}
bool mouseMoved(const OIS::MouseEvent& evt)
{
//CEGUI::System::getSingleton().injectMouseMove(evt.state.X.rel, evt.state.Y.rel);
if(lmousedown)
{
DragObject(evt);
}
if(rmousedown)
{
//mycamera->yaw(Degree(-evt.state.X.rel*rotatespeed));
//mycamera->pitch(Degree(-evt.state.Y.rel*rotatespeed));
Yrotatescale=Ogre::Degree(-evt.state.X.rel*rotatespeed);
Xrotatescale=Ogre::Degree(-evt.state.Y.rel*rotatespeed);
}
return keeprender;
}
bool mousePressed(const OIS::MouseEvent& evt, OIS::MouseButtonID id)
{
if(id==OIS::MB_Left)
{
LeftMousePressed(evt);
lmousedown=true;
}
if(id==OIS::MB_Right)
{
RightMousePressed(evt);
rmousedown=true;
}
return keeprender;
}
bool mouseReleased(const OIS::MouseEvent& evt, OIS::MouseButtonID id)
{
if(id==OIS::MB_Left)
{
LeftMouseReleased(evt);
lmousedown=false;
}
if(id==OIS::MB_Right)
{
RightMouseReleased(evt);
rmousedown=false;
}
return keeprender;
}
void LeftMousePressed(const OIS::MouseEvent& evt)
{
if(currentobject)
currentobject->showBoundingBox(false);
CEGUI::Point cursorpos=CEGUI::MouseCursor::getSingleton().getPosition();
Ray mouseray=mycamera->getCameraToViewportRay(cursorpos.d_x/float(width), cursorpos.d_y/float(height));
myrayscenequery->setRay(mouseray);
myrayscenequery->setSortByDistance(true);
myrayscenequery->setQueryMask(robotmask|ninjamask);
RaySceneQueryResult &result=myrayscenequery->execute();
RaySceneQueryResult::iterator pointer;
for(pointer=result.begin(); pointer!=result.end(); pointer++)
{
if(pointer->movable && pointer->movable->getName().substr(0, 5) !="tile[")
{
if(pointer->movable->getParentSceneNode()->getName()!="CameraRollNode")
{
currentobject=pointer->movable->getParentSceneNode();
if(currentobject)
currentobject->showBoundingBox(true);
break;
}
}
else if(pointer->worldFragment)
{
Entity* ent;
char name[16];
if(robotmod)
{
sprintf(name, "Robot%d", objectcount++);
ent=myscenemgr->createEntity(name, "robot.mesh");
ent->setQueryFlags(robotmask);
}
else
{
sprintf(name, "Ninja%d", objectcount++);
ent=myscenemgr->createEntity(name, "ninja.mesh");
ent->setQueryFlags(ninjamask);
}
currentobject=myscenemgr->getRootSceneNode()->createChildSceneNode(String(name)+"node", pointer->worldFragment->singleIntersection);
currentobject->attachObject(ent);
currentobject->setScale(0.1f, 0.1f, 0.1f);
break;
}
}
}
void LeftMouseReleased(const OIS::MouseEvent& evt)
{
}
void RightMousePressed(const OIS::MouseEvent& evt)
{
//CEGUI::MouseCursor::getSingleton().hide();
MyGUI::PointerManager::getInstance().setVisible(false);
}
void RightMouseReleased(const OIS::MouseEvent& evt)
{
//CEGUI::MouseCursor::getSingleton().show();
MyGUI::PointerManager::getInstance().setVisible(true);
}
void CameraMove()
{
Ogre::Real mPitchAngle;
Ogre::Real mPitchAngleSign;
mCameraPitchNode->pitch(Xrotatescale);
mCameraYawNode->yaw(Yrotatescale);
mCameraNode->translate(mCameraYawNode->getOrientation()*mCameraPitchNode->getOrientation()*movescale, Ogre::Node::TS_LOCAL);
mPitchAngle=(2*Ogre::Degree(Ogre::Math::ACos(mCameraPitchNode->getOrientation().w))).valueDegrees();
mPitchAngleSign=mCameraPitchNode->getOrientation().x;
if(mPitchAngle>50)
{
if (mPitchAngleSign>0)
{
mCameraPitchNode->setOrientation(Ogre::Quaternion(Ogre::Math::Sqrt(0.8f), Ogre::Math::Sqrt(0.18f), 0, 0));
}
else if (mPitchAngleSign<0)
{
mCameraPitchNode->setOrientation(Ogre::Quaternion(Ogre::Math::Sqrt(0.8f), -Ogre::Math::Sqrt(0.18f), 0, 0));
}
}
Yrotatescale=Ogre::Degree(0.0f);
Xrotatescale=Ogre::Degree(0.0f);
//movescale=Ogre::Vector3(0,0,0);
}
bool frameStarted(const FrameEvent& evt)
{
if(mykeyboard)
mykeyboard->capture();
if(mymouse)
mymouse->capture();
//mycamera->moveRelative(cammove*evt.timeSinceLastFrame);
CameraMove();
CameraCollision();
OverlayElement* debug=OverlayManager::getSingleton().getOverlayElement("Core/DebugText");
debug->setCaption(debugtext);
return keeprender;
}
void CameraCollision()
{
Vector3 campos=mCameraNode->getPosition();
myrayscenequery->setSortByDistance(false);
Ray camray(Vector3(campos.x, 5000.0f, campos.z), Vector3::NEGATIVE_UNIT_Y);
myrayscenequery->setRay(camray);
RaySceneQueryResult &result=myrayscenequery->execute();
RaySceneQueryResult::iterator pointer;
Real intersectheight;
for(pointer=result.begin(); pointer!=result.end(); pointer++)
{
if(pointer->worldFragment)
{
intersectheight=pointer->worldFragment->singleIntersection.y;
if((intersectheight+10)>campos.y)
{
mCameraNode->setPosition(campos.x, intersectheight+10, campos.z);
break;
}
}
}
}
void DragObject(const OIS::MouseEvent& evt)
{
CEGUI::Point cursorpos=CEGUI::MouseCursor::getSingleton().getPosition();
myrayscenequery->setSortByDistance(false);
Ray mouseray=mycamera->getCameraToViewportRay(cursorpos.d_x/float(width), cursorpos.d_y/float(height));
myrayscenequery->setRay(mouseray);
RaySceneQueryResult &result=myrayscenequery->execute();
RaySceneQueryResult::iterator pointer;
for(pointer=result.begin(); pointer!=result.end(); pointer++)
{
if(pointer->worldFragment)
{
currentobject->setPosition(pointer->worldFragment->singleIntersection);
break;
}
}
}
};
class ObjectPicking
{
private:
Root* myroot;
RenderWindow* mywin;
SceneManager* myscenemgr;
Camera* mycamera;
Viewport* vp;
CEGUI::OgreCEGUIRenderer* mygui;
CEGUI::System* myguisystem;
OIS::InputManager* myinputmgr;
OIS::Keyboard* mykeyboard;
OIS::Mouse* mymouse;
MyFrameListener* myframelistener;
SceneNode* cameranode;
MyGUI::Gui* mGUI;
public:
ObjectPicking()
{
}
~ObjectPicking()
{
}
void go()
{
CreateRoot();
DefineResource();
SetupRenderSystem();
CreateRenderWindow();
InitResource();
SetupScene();
SetupInputSystem();
SetupCEGUI();
CreateFrameListener();
StartGame();
}
void CreateRoot()
{
myroot=new Root();
}
void DefineResource()
{
String secname, type_name, pathname;
ConfigFile cf;
cf.load("resources.cfg");
ConfigFile::SectionIterator pointer=cf.getSectionIterator();
while(pointer.hasMoreElements())
{
secname=pointer.peekNextKey();
ConfigFile::SettingsMultiMap* setting=pointer.getNext();
ConfigFile::SettingsMultiMap::iterator pt;
for(pt=setting->begin(); pt!=setting->end(); pt++)
{
type_name=pt->first;
pathname=pt->second;
ResourceGroupManager::getSingleton().addResourceLocation(pathname, type_name, secname);
}
}
}
void SetupRenderSystem()
{
if(!myroot->restoreConfig() && !myroot->showConfigDialog())
{
MessageBox(0, "Setup render system failed", "Error", 0);
}
}
void CreateRenderWindow()
{
myroot->initialise(false);
mywin=myroot->createRenderWindow("Ogre Object Picking", 800, 600, false);
}
void InitResource()
{
TextureManager::getSingleton().setDefaultNumMipmaps(5);
ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
}
void SetupScene()
{
myscenemgr=myroot->createSceneManager(ST_EXTERIOR_CLOSE, "myscenemgr");
myscenemgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
myscenemgr->setSkyDome(true, "Examples/CloudySky", 5, 8);
myscenemgr->setWorldGeometry("terrain.cfg");
mycamera=myscenemgr->createCamera("mycamera");
//SceneNode* camnode=myscenemgr->getRootSceneNode()->createChildSceneNode("mycamera");
cameranode=myscenemgr->getRootSceneNode()->createChildSceneNode("CameraNode", Ogre::Vector3(40, 100, 580));
SceneNode* camerayawnode=cameranode->createChildSceneNode("CameraYawNode");
SceneNode* camerapitchnode=camerayawnode->createChildSceneNode("CameraPitchNode");
SceneNode* camerarollnode=camerapitchnode->createChildSceneNode("CameraRollNode");
camerarollnode->attachObject(mycamera);
//camnode->attachObject(mycamera);
vp=mywin->addViewport(mycamera);
mycamera->setAspectRatio(vp->getActualWidth()/vp->getActualHeight());
mycamera->setNearClipDistance(5);
camerayawnode->yaw(Degree(-30));
camerapitchnode->pitch(Degree(-45));
//mycamera->setPosition(40, 100, 580);
//mycamera->yaw(Degree(-30));
//mycamera->pitch(Degree(-45));
}
void SetupInputSystem()
{
size_t hwnd;
mywin->getCustomAttribute("WINDOW", &hwnd);
myinputmgr=OIS::InputManager::createInputSystem(hwnd);
mykeyboard=static_cast<OIS::Keyboard*>(myinputmgr->createInputObject(OIS::OISKeyboard, true));
mymouse=static_cast<OIS::Mouse*>(myinputmgr->createInputObject(OIS::OISMouse, true));
}
void SetupCEGUI()
{
//mygui=new CEGUI::OgreCEGUIRenderer(mywin, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, myscenemgr);
//myguisystem=new CEGUI::System(mygui);
//CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLookSkin.scheme");
//CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseArrow");
mGUI=new MyGUI::Gui();
mGUI->initialise(mywin);
//mGUI->setSceneManager(myscenemgr);
}
void CreateFrameListener()
{
myframelistener=new MyFrameListener(myscenemgr, mycamera, mykeyboard, mymouse, mygui, mGUI);
myroot->addFrameListener(myframelistener);
}
void StartGame()
{
myroot->startRendering();
}
};
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
try
{
ObjectPicking op;
op.go();
}
catch(Ogre::Exception& e)
{
MessageBox(0, "Create game failed", "Error", 0);
}
return 0;
}