00001
00002 #include "menu.h"
00003 #include "cerberus.h"
00004
00005 cMenuScreen::cMenuScreen( IrrlichtDevice* device, cConfiguration* configuration, cAudioDevice* audioDevice ) :
00006 mDevice( device ), mConfiguration( configuration ), mAudioDevice( audioDevice )
00007 {
00008
00009 mDriver = mDevice->getVideoDriver();
00010 mSmgr = mDevice->getSceneManager();
00011 mEnv = mDevice->getGUIEnvironment();
00012 mLogger = mDevice->getLogger();
00013
00014
00015 mDriver->setTextureCreationFlag( video::ETCF_ALWAYS_32_BIT, true );
00016 tIrrlichtLogo = mDriver->getTexture( "media/irrlichtlogo2.png" );
00017
00018
00019 mEnv->addImage( tIrrlichtLogo, core::position2d<s32>(10, mConfiguration->height-92) );
00020
00021
00022 mDevice->getCursorControl()->setPosition( 0.5f, 0.5f );
00023 mDevice->getCursorControl()->setVisible( false );
00024
00025
00026 mWorld = new cWorld( mDevice, 1, 33, 15, 4, 0.9 );
00027 mWorld->create();
00028 if( mWorld->getNode() ) {
00029 mWorld->getNode()->setPosition( core::vector3df(0, 0, 0) );
00030 mWorld->getNode()->setRotation( core::vector3df(0, 0, 0) );
00031 }
00032
00033
00034 scene::ISceneNode* skynode=mSmgr->addSkyDomeSceneNode( mDriver->getTexture("media/alien_world.jpg"), 16, 16, 1.0, 2.0 );
00035 skynode->setRotation( core::vector3df(25, 100, 0) );
00036
00037
00038 mDevice->setEventReceiver( this );
00039
00040
00041 mWorld->showStartScreen();
00042
00043
00044 mMenuStatus=eMenuStart;
00045 }
00046
00047
00048 cMenuScreen::~cMenuScreen( void )
00049 {
00050
00051 if( mWorld )
00052 delete mWorld;
00053
00054
00055 mDevice->setEventReceiver( NULL );
00056
00057
00058 mSmgr->clear();
00059 }
00060
00061
00062
00063 bool cMenuScreen::OnEvent( const SEvent& event )
00064 {
00065 switch( mMenuStatus ) {
00066 case eMenuStart:
00067
00068 if( event.EventType == EET_KEY_INPUT_EVENT && !event.KeyInput.PressedDown ) {
00069 switch (event.KeyInput.Key) {
00070 case KEY_ESCAPE:
00071 mMenuStatus=eMenuQuit;
00072 return true;
00073 case KEY_KEY_S:
00074 mDriver->writeImageToFile( mDriver->createScreenShot(), "screenshot.png" );
00075 return true;
00076 default:
00077 mMenuStatus=eMenuEnterLandscape;
00078 return true;
00079 }
00080 }
00081 break;
00082 case eMenuEnterLandscape:
00083
00084 if( event.EventType == EET_KEY_INPUT_EVENT && !event.KeyInput.PressedDown ) {
00085 switch (event.KeyInput.Key) {
00086 case KEY_ESCAPE:
00087 mLandscapeNumber="";
00088 mLandscapeCode="";
00089 mMenuStatus=eMenuStart;
00090 return true;
00091 case KEY_KEY_S:
00092 mDriver->writeImageToFile( mDriver->createScreenShot(), "screenshot.png" );
00093 return true;
00094 case KEY_KEY_0: case KEY_KEY_1: case KEY_KEY_2: case KEY_KEY_3: case KEY_KEY_4:
00095 case KEY_KEY_5: case KEY_KEY_6: case KEY_KEY_7: case KEY_KEY_8: case KEY_KEY_9:
00096 if( mLandscapeNumber.size()<4 )
00097 mLandscapeNumber.append( (char)(event.KeyInput.Key-KEY_KEY_0)+'0' );
00098 return true;
00099 case KEY_BACK:
00100 if( mLandscapeNumber.size()>0 )
00101 mLandscapeNumber.erase( mLandscapeNumber.size()-1 );
00102 return true;
00103 case KEY_RETURN:
00104 if( atoi(mLandscapeNumber.c_str())==1 || mLandscapeNumber.size()==0 ) {
00105 mLandscapeNumber="1";
00106 mMenuStatus=eMenuProceed;
00107 } else if( atoi(mLandscapeNumber.c_str())!=0 )
00108 mMenuStatus=eMenuEnterCode;
00109 return true;
00110 default:
00111 return true;
00112 }
00113 }
00114 break;
00115 case eMenuEnterCode:
00116
00117 if( event.EventType == EET_KEY_INPUT_EVENT && !event.KeyInput.PressedDown ) {
00118 switch (event.KeyInput.Key) {
00119 case KEY_ESCAPE:
00120 mLandscapeNumber="";
00121 mLandscapeCode="";
00122 mMenuStatus=eMenuStart;
00123 return true;
00124 case KEY_KEY_S:
00125 mDriver->writeImageToFile( mDriver->createScreenShot(), "screenshot.png" );
00126 return true;
00127 case KEY_KEY_0: case KEY_KEY_1: case KEY_KEY_2: case KEY_KEY_3: case KEY_KEY_4:
00128 case KEY_KEY_5: case KEY_KEY_6: case KEY_KEY_7: case KEY_KEY_8: case KEY_KEY_9:
00129 if( mLandscapeCode.size()<8 )
00130 mLandscapeCode.append( (char)(event.KeyInput.Key-KEY_KEY_0)+'0' );
00131 return true;
00132 case KEY_BACK:
00133 if( mLandscapeCode.size()>0 )
00134 mLandscapeCode.erase( mLandscapeCode.size()-1 );
00135 return true;
00136 case KEY_RETURN:
00137 if( cWorld::checkLandscapeCode(atoi(mLandscapeNumber.c_str()), atoi(mLandscapeCode.c_str())) )
00138 mMenuStatus=eMenuProceed;
00139 else {
00140 mLandscapeNumber="";
00141 mLandscapeCode="";
00142 mMenuStatus=eMenuStart;
00143 }
00144 return true;
00145 default:
00146 return true;
00147 }
00148 }
00149 break;
00150 default:
00151 break;
00152 }
00153
00154 return false;
00155 }
00156
00160 bool cMenuScreen::run( unsigned int* level )
00161 {
00162 int lastFPS = -1, fps;
00163 double oldtime=0, period=0, timeset=0;
00164 core::stringw title = L"Cerberus [";
00165 title += mDriver->getName();
00166 title += "] FPS: ";
00167 core::stringw fulltitle;
00168
00169 gui::IGUIFont* menuFont=mEnv->getFont( "media/zeroes.xml" );
00170
00171 core::stringw anyKeyString=L"PRESS ANY KEY";
00172 core::stringw enterLandscapeString=L"ENTER LANDSCAPE";
00173 core::stringw enterCodeString=L"ENTER CODE";
00174
00175
00176 mLandscapeNumber="";
00177 mLandscapeCode="";
00178
00179 timeset=(double)(mDevice->getTimer()->getRealTime());
00180 while( mDevice->run() && mMenuStatus!=eMenuQuit && mMenuStatus!=eMenuProceed ) {
00181 if( mDevice->isWindowActive() ) {
00182
00183 period = mConfiguration->fps_period-((double)(mDevice->getTimer()->getRealTime())-oldtime);
00184 if( period>0 )
00185 mDevice->sleep( (u32)period, false );
00186 oldtime=(double)(mDevice->getTimer()->getRealTime());
00187
00188 switch( mMenuStatus ) {
00189 case( eMenuStart ):
00190 mDriver->beginScene( true, true, video::SColor(255, 0, 0, 0) );
00191 mSmgr->drawAll();
00192 menuFont->draw( anyKeyString.c_str(), core::rect<s32>(mConfiguration->width/2, mConfiguration->height-50,
00193 mConfiguration->width/2, mConfiguration->height-50),
00194 video::SColor(255,255,255,255), true, false, NULL );
00195 mDriver->endScene();
00196 break;
00197 case( eMenuEnterLandscape ):
00198
00199 mDriver->beginScene( true, true, video::SColor(255, 0, 0, 0) );
00200 mSmgr->drawAll();
00201 menuFont->draw( enterLandscapeString.c_str(), core::rect<s32>(mConfiguration->width/5, mConfiguration->height-100,
00202 mConfiguration->width/5, mConfiguration->height-100),
00203 video::SColor(255,255,255,255), false, false, NULL );
00204 menuFont->draw( core::stringw(mLandscapeNumber.c_str()).c_str(),
00205 core::rect<s32>(mConfiguration->width/5, mConfiguration->height-60,
00206 mConfiguration->width/5, mConfiguration->height-60),
00207 video::SColor(255,255,255,255), false, false, NULL );
00208 mDriver->endScene();
00209 break;
00210 case( eMenuEnterCode ):
00211
00212 mDriver->beginScene( true, true, video::SColor(255, 0, 0, 0) );
00213 mSmgr->drawAll();
00214 menuFont->draw( enterCodeString.c_str(), core::rect<s32>(mConfiguration->width/5, mConfiguration->height-100,
00215 mConfiguration->width/5, mConfiguration->height-100),
00216 video::SColor(255,255,255,255), false, false, NULL );
00217 menuFont->draw( core::stringw(mLandscapeCode.c_str()).c_str(),
00218 core::rect<s32>(mConfiguration->width/5, mConfiguration->height-60,
00219 mConfiguration->width/5, mConfiguration->height-60),
00220 video::SColor(255,255,255,255), false, false, NULL );
00221 mDriver->endScene();
00222 break;
00223 case( eMenuQuit ):
00224 case( eMenuProceed ):
00225
00226 break;
00227 }
00228
00229
00230 fps = mDriver->getFPS();
00231 if( lastFPS!=fps ) {
00232 fulltitle = title;
00233 fulltitle += fps;
00234
00235 mDevice->setWindowCaption( fulltitle.c_str() );
00236 lastFPS = fps;
00237 }
00238
00239 }
00240 }
00241
00242
00243 if( mMenuStatus==eMenuQuit )
00244 return false;
00245 else {
00246 *level=(unsigned int)atoi( mLandscapeNumber.c_str() );
00247 return true;
00248 }
00249 }