linux使用Ogre+SDL进行游戏开发

linux使用Ogre+SDL进行游戏开发

我选择的是ubuntu8.04 + codeblocks8.02的开发环境。
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 "  );
        }
    }
}
原理很简单。
图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值