linux使用Ogre+SDL进行游戏开发
我选择的是ubuntu8.04 + codeblocks8.02的开发环境。
Ogre用的是1.4.5的版本。
下面是用SDL进行的一个简单的代码.
图:
Ogre用的是1.4.5的版本。
下面是用SDL进行的一个简单的代码.
#include
<
Ogre.h
>
#include < iostream >
#include < SDL / SDL.h >
#include < SDL / SDL_syswm.h >
#include < SDL / SDL_events.h >
using namespace std;
using namespace Ogre;
class AppListener : public FrameListener
{
public :
AppListener( RenderWindow * _win ) : win( _win )
{
}
public :
bool frameStarted( const FrameEvent & evt)
{
if ( ! FrameListener::frameStarted( evt ) )
return false ;
SDL_PollEvent( & event );
return true ;
}
bool frameEnded( const FrameEvent & evt)
{
if ( ! FrameListener::frameEnded( evt ) )
return false ;
SDL_PollEvent( & event );
if ( event .type == SDL_KEYDOWN )
{
if ( event .key.keysym.sym == SDLK_ESCAPE )
return false ;
}
return true ;
}
private :
RenderWindow * win;
SDL_Event event ;
};
void parseWindowGeometry( Ogre::ConfigOptionMap & config, unsigned int & width, unsigned int & height, bool & fullscreen );
int main()
{
Root * root = new Root( " plugins.cfg " );
RenderWindow * win;
if ( ! root -> showConfigDialog() )
return 0 ;
if ( SDL_WasInit( SDL_INIT_VIDEO ) == 0 )
{
unsigned int height = 300 , width = 400 ;
bool fullscreen;
parseWindowGeometry( root -> getRenderSystem() -> getConfigOptions(), width, height, fullscreen );
root -> initialise( false );
SDL_Init( SDL_INIT_VIDEO );
SDL_SetVideoMode( width, height / 2 , 0 , 0 );
SDL_WM_SetCaption( " OgreTest " , " ogretest " );
SDL_SysWMinfo info;
SDL_VERSION( & info.version);
SDL_GetWMInfo( & info);
std:: string dsp( & (DisplayString(info.info.x11.display)[ 1 ]));
std::vector < Ogre::String > tokens = Ogre::StringUtil::split(dsp, " . " );
Ogre::NameValuePairList misc;
std:: string s = Ogre::StringConverter::toString(( long )info.info.x11.display);
s += " : " + tokens[ 1 ] + " : " ;
s += Ogre::StringConverter::toString(( long )info.info.x11.window);
misc[ " parentWindowHandle " ] = s;
win = root -> createRenderWindow( " ogre " , width, height, fullscreen, & misc);
/// we need to set the window to be active by ourselves, since GLX by default sets it to false, but then activates it upon recieving some X event (which it will never recieve since we'll use SDL).
/// see OgreGLXWindow.cpp
win -> setActive( true );
win -> setAutoUpdated( true );
}
else
{
win = root -> initialise( true );
}
root -> addFrameListener( new AppListener( win ) );
root -> startRendering();
return 0 ;
}
void parseWindowGeometry( Ogre::ConfigOptionMap & config, unsigned int & width, unsigned int & height, bool & fullscreen )
{
Ogre::ConfigOptionMap::iterator opt = config.find( " Video Mode " );
if ( opt != config.end() )
{
Ogre::String val = opt -> second.currentValue;
Ogre::String::size_type pos = val.find( ' x ' );
if ( pos != Ogre::String::npos )
{
width = Ogre::StringConverter::parseUnsignedInt( val.substr( 0 , pos ) );
height = Ogre::StringConverter::parseUnsignedInt( val.substr( pos + 1 ) );
}
opt = config.find( " Full Screen " );
if ( opt != config.end() )
{
fullscreen = ( opt -> second.currentValue == " Yes " );
}
}
}
原理很简单。
#include < iostream >
#include < SDL / SDL.h >
#include < SDL / SDL_syswm.h >
#include < SDL / SDL_events.h >
using namespace std;
using namespace Ogre;
class AppListener : public FrameListener
{
public :
AppListener( RenderWindow * _win ) : win( _win )
{
}
public :
bool frameStarted( const FrameEvent & evt)
{
if ( ! FrameListener::frameStarted( evt ) )
return false ;
SDL_PollEvent( & event );
return true ;
}
bool frameEnded( const FrameEvent & evt)
{
if ( ! FrameListener::frameEnded( evt ) )
return false ;
SDL_PollEvent( & event );
if ( event .type == SDL_KEYDOWN )
{
if ( event .key.keysym.sym == SDLK_ESCAPE )
return false ;
}
return true ;
}
private :
RenderWindow * win;
SDL_Event event ;
};
void parseWindowGeometry( Ogre::ConfigOptionMap & config, unsigned int & width, unsigned int & height, bool & fullscreen );
int main()
{
Root * root = new Root( " plugins.cfg " );
RenderWindow * win;
if ( ! root -> showConfigDialog() )
return 0 ;
if ( SDL_WasInit( SDL_INIT_VIDEO ) == 0 )
{
unsigned int height = 300 , width = 400 ;
bool fullscreen;
parseWindowGeometry( root -> getRenderSystem() -> getConfigOptions(), width, height, fullscreen );
root -> initialise( false );
SDL_Init( SDL_INIT_VIDEO );
SDL_SetVideoMode( width, height / 2 , 0 , 0 );
SDL_WM_SetCaption( " OgreTest " , " ogretest " );
SDL_SysWMinfo info;
SDL_VERSION( & info.version);
SDL_GetWMInfo( & info);
std:: string dsp( & (DisplayString(info.info.x11.display)[ 1 ]));
std::vector < Ogre::String > tokens = Ogre::StringUtil::split(dsp, " . " );
Ogre::NameValuePairList misc;
std:: string s = Ogre::StringConverter::toString(( long )info.info.x11.display);
s += " : " + tokens[ 1 ] + " : " ;
s += Ogre::StringConverter::toString(( long )info.info.x11.window);
misc[ " parentWindowHandle " ] = s;
win = root -> createRenderWindow( " ogre " , width, height, fullscreen, & misc);
/// we need to set the window to be active by ourselves, since GLX by default sets it to false, but then activates it upon recieving some X event (which it will never recieve since we'll use SDL).
/// see OgreGLXWindow.cpp
win -> setActive( true );
win -> setAutoUpdated( true );
}
else
{
win = root -> initialise( true );
}
root -> addFrameListener( new AppListener( win ) );
root -> startRendering();
return 0 ;
}
void parseWindowGeometry( Ogre::ConfigOptionMap & config, unsigned int & width, unsigned int & height, bool & fullscreen )
{
Ogre::ConfigOptionMap::iterator opt = config.find( " Video Mode " );
if ( opt != config.end() )
{
Ogre::String val = opt -> second.currentValue;
Ogre::String::size_type pos = val.find( ' x ' );
if ( pos != Ogre::String::npos )
{
width = Ogre::StringConverter::parseUnsignedInt( val.substr( 0 , pos ) );
height = Ogre::StringConverter::parseUnsignedInt( val.substr( pos + 1 ) );
}
opt = config.find( " Full Screen " );
if ( opt != config.end() )
{
fullscreen = ( opt -> second.currentValue == " Yes " );
}
}
}
图: