Help Mouse move problem (difficult)

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.


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;
}

tomneo2000

21-10-2009 17:10:56

Anyone can help i am really stuck here

my.name

22-10-2009 02:58:31

Function is not called

void MyFrameListener::windowResized(Ogre::RenderWindow* rw)
{
const OIS::MouseState &ms=mymouse->getMouseState();
ms.width=rw->getWidth();
ms.height=rw->getHeight();
}


The class has not subscribed for a call.
Try to call directly.

tomneo2000

22-10-2009 03:51:53

Function is not called

void MyFrameListener::windowResized(Ogre::RenderWindow* rw)
{
const OIS::MouseState &ms=mymouse->getMouseState();
ms.width=rw->getWidth();
ms.height=rw->getHeight();
}


The class has not subscribed for a call.
Try to call directly.


Ok i solve it, a stupid mistake, i got duplicate variable name width and height haha.

Now i can move mouse around whole screen, i also set cursor to center of screen by these code, but when i move my mouse the cursor suddenly appear on left top of screen, it is odd , how can i fix it, except this problem, the cursor move well

MyGUI::IntPoint initpos;
initpos.set(mymouse->getMouseState().width/2, mymouse->getMouseState().height/2);
MyGUI::PointerManager::getInstancePtr()->setPosition(initpos);


How can i make a call to this method when window been resized, for instance, when program started it will make a call to this method then until next time window been resized, this method will be called, it is like automatically call, but only call the method when event occur.

Also i have a button on my screen. The program is able to place a mesh on a specific position of terrain where user clicked. Now the problem is that when i click the button it still place a mesh on terrain, how can i make it like when i click button it won't place any mesh on terrain until my cursor leave button area and click then place a mesh on terrain. For example, RTS game has gui area, so when cursor in gui area only can interactive with gui until cursor leave gui then only can interactive with objects in game world. How can i make this with MyGUI?

Here is my code when user click left mouse button

void LeftMousePressed(const OIS::MouseEvent& evt)
{
if(currentobject)
currentobject->showBoundingBox(false);

//CEGUI::Point cursorpos=CEGUI::MouseCursor::getSingleton().getPosition();
MyGUI::IntPoint cursorpos=MyGUI::InputManager::getInstancePtr()->getMousePosition();
Ray mouseray=mycamera->getCameraToViewportRay(float(cursorpos.left)/float(mymouse->getMouseState().width), float(cursorpos.top)/float(mymouse->getMouseState().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;
}
}


}