W
dark orbit schrieb:
Verstehe den Satz nicht so ganz ... ich probiers trotzdem mal: Du musst den Maus-Cursor selbst zeichnen, wenn du einen eigenen willst oder ein GUI-Framework verwenden wie bspw. CEGUI. Dazu findest du auch einiges im Ogre-Wiki.
oki thx, ich werd mich gleich mal mit OIS_SDL_PLATFORM beschäftigen.
Keyboard und Mouse capture rufe ich im frameRenderingQueued auf und mache die subjektiv langsame Geschindigkeit daran fest das wenn ich mit der Mouse das RenderWindow verlasse der Cursor von CeGUI nicht unbedingt ganz bis zum Rand fährt, evt. ist hier mein verständniss falsch.
Was ich bezüglich deines Zitats oben meinte:
BEI OIS ist als default ja
DISCL_EXCLUSIVE
eingestellt, was dann ermöglicht das man via CeGUI oder mittels OgrePanelOverlayElement einen benutzer definierten Cursor innerhalb des RenderWindows erstellt.
Das Problem hierbei ist das der Cursor niemals das render Window verlässt.
Ich hab das Ganze nun aber bisher so gelöst das ich folgendes deffiniere:
#if defined OIS_WIN32_PLATFORM
pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_FOREGROUND" )));
pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_NONEXCLUSIVE")));
pl.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_FOREGROUND")));
pl.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_NONEXCLUSIVE")));
#elif defined OIS_LINUX_PLATFORM
pl.insert(std::make_pair(std::string("x11_mouse_grab"), std::string("false")));
pl.insert(std::make_pair(std::string("x11_mouse_hide"), std::string("false")));
pl.insert(std::make_pair(std::string("x11_keyboard_grab"), std::string("false")));
pl.insert(std::make_pair(std::string("XAutoRepeatOn"), std::string("true")));
#endif
dadurch wird der SystemCursor angezeigt, natürlich auch im RenderWindow ABER man kann mit dem Cursor das RenderWindow verlassen!
Momentan benutze ich folgendes:
bool gameClient::mouseMoved( const OIS::MouseEvent &arg )
{
if (mMouse->getMouseState().X.abs <= 0 || mMouse->getMouseState().X.abs >= mMouse->getMouseState().width
||
mMouse->getMouseState().Y.abs <= 0 || mMouse->getMouseState().Y.abs >= mMouse->getMouseState().height)
{
showSysCursor(true);
outOfWindow = true;
//!Reset MouseButtons to Up
mTrayMgr->injectMouseUp(arg, OIS::MB_Left);
mTrayMgr->injectMouseUp(arg, OIS::MB_Right);
mCameraMan->injectMouseUp(arg, OIS::MB_Left);
mCameraMan->injectMouseUp(arg, OIS::MB_Right);
return false;
}
else
{
outOfWindow = false;
showSysCursor(false);
if (mTrayMgr->injectMouseMove(arg)) return true;
mCameraMan->injectMouseMove(arg);
return true;
}
}
um eine Flag zu setzen outOfWindow die nur dann die verarbeitung von Events zulässt wenn sich der Cursor innerhalb des RenderWindows befindet, das Pseudo-Weiterleiten von MouseButton Up events hat übrigens denn sinn das beim Verlassen des RenderWindows automatisch MouseButton UP event bzw dessen verarbeitung eingeleitet wird sonst ergeben sich da Probleme.
Die Funktion , showSysCursor() blendet mir dann beim verlassen des RenderWindows des SystemCursor wieder ein, bzw aus beim betreten des RenderWindows:
void gameClient::showSysCursor(bool visible)
{
#ifdef _WIN32
CURSORINFO info;
info.cbSize = sizeof(CURSORINFO);
BOOL gotCursorInfo = GetCursorInfo(&info);
while ( gotCursorInfo )
{
if ( (visible && info.flags == CURSOR_SHOWING) // visible
|| (!visible && info.flags == 0 ) ) // hidden
{
break;
}
int showResult = ShowCursor(visible); // this only increases an internal display counter in windows, so it might have to be called some more
if ( showResult < 0 )
{
break;
}
info.cbSize = sizeof(CURSORINFO); // yes, it really must be set each time
gotCursorInfo = GetCursorInfo(&info);
}
#else
//!!!!!x11____if ( Visible )
//!!!!!x11____XDefineCursor( Device->display, mWindow, invisCursor );
//!!!!!x11____else
//!!!!!x11____XUndefineCursor( Device->display, Device->window );
#endif
}
den X11 part muss ich noch umbauen. aber das ganze klappt dann auch soweit.
Sinn ist halt das der SystemCursor das renderWindow verlassen kann und dann auch als solcher zu sehen ist. und innerhalb des RenderWindows ein benutzerdefinierter Cursor sichtbar wird.
Ich hoffte halt das es eine einfachere Lösung hierfür gibt.
Hoffe das war nun klarer zu verstehen.