00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "toplevel.h"
00027 #include "ledmeter.h"
00028
00029 #include <opie2/oresource.h>
00030
00031 #include <qpe/qpeapplication.h>
00032
00033 #include <qlabel.h>
00034 #include <qlayout.h>
00035 #include <qlcdnumber.h>
00036
00037 #include <sys/utsname.h>
00038
00039
00040 #define SB_SCORE 1
00041 #define SB_LEVEL 2
00042 #define SB_SHIPS 3
00043
00044 struct SLevel
00045 {
00046 int nrocks;
00047 double rockSpeed;
00048 };
00049
00050 #define MAX_LEVELS 16
00051
00052 SLevel levels[MAX_LEVELS] =
00053 {
00054 { 1, 0.4 },
00055 { 1, 0.6 },
00056 { 2, 0.5 },
00057 { 2, 0.7 },
00058 { 2, 0.8 },
00059 { 3, 0.6 },
00060 { 3, 0.7 },
00061 { 3, 0.8 },
00062 { 4, 0.6 },
00063 { 4, 0.7 },
00064 { 4, 0.8 },
00065 { 5, 0.7 },
00066 { 5, 0.8 },
00067 { 5, 0.9 },
00068 { 5, 1.0 }
00069 };
00070
00071 const char *soundEvents[] =
00072 {
00073 "ShipDestroyed",
00074 "RockDestroyed",
00075 0
00076 };
00077
00078 const char *soundDefaults[] =
00079 {
00080 "Explosion.wav",
00081 "ploop.wav",
00082 0
00083 };
00084
00085
00086 KAstTopLevel::KAstTopLevel( QWidget *parent, const char *_name, WFlags fl )
00087 : QMainWindow( parent, _name, fl )
00088 {
00089 setCaption( tr("Asteroids") );
00090
00091 QPEApplication::grabKeyboard();
00092
00093 QWidget *border = new QWidget( this );
00094 border->setBackgroundColor( black );
00095 setCentralWidget( border );
00096
00097 QVBoxLayout *borderLayout = new QVBoxLayout( border );
00098
00099 QWidget *mainWin = new QWidget( border );
00100 borderLayout->addWidget( mainWin, 2, AlignHCenter );
00101
00102 view = new KAsteroidsView( mainWin );
00103 connect( view, SIGNAL( shipKilled() ), SLOT( slotShipKilled() ) );
00104 connect( view, SIGNAL( rockHit(int) ), SLOT( slotRockHit(int) ) );
00105 connect( view, SIGNAL( rocksRemoved() ), SLOT( slotRocksRemoved() ) );
00106 connect( view, SIGNAL( updateVitals() ), SLOT( slotUpdateVitals() ) );
00107
00108 QVBoxLayout *vb = new QVBoxLayout( mainWin );
00109 QHBoxLayout *hb = new QHBoxLayout;
00110 QHBoxLayout *hbd = new QHBoxLayout;
00111 vb->addLayout( hb );
00112
00113 QFont labelFont( "helvetica", 12 );
00114 QColorGroup grp( darkGreen, black, QColor( 128, 128, 128 ),
00115 QColor( 64, 64, 64 ), black, darkGreen, black );
00116 QPalette pal( grp, grp, grp );
00117
00118 mainWin->setPalette( pal );
00119
00120 QLabel *label;
00121 label = new QLabel( tr("Score"), mainWin );
00122 label->setFont( labelFont );
00123 label->setPalette( pal );
00124
00125 hb->addWidget( label );
00126
00127 scoreLCD = new QLCDNumber( 5, mainWin );
00128 scoreLCD->setFrameStyle( QFrame::NoFrame );
00129 scoreLCD->setSegmentStyle( QLCDNumber::Flat );
00130 scoreLCD->setFixedHeight( 16 );
00131 scoreLCD->setPalette( pal );
00132 hb->addWidget( scoreLCD );
00133 hb->addStretch( 1 );
00134
00135 label = new QLabel( tr("Level"), mainWin );
00136 label->setFont( labelFont );
00137 label->setPalette( pal );
00138
00139 hb->addWidget( label );
00140
00141 levelLCD = new QLCDNumber( 2, mainWin );
00142 levelLCD->setFrameStyle( QFrame::NoFrame );
00143 levelLCD->setSegmentStyle( QLCDNumber::Flat );
00144 levelLCD->setFixedHeight( 16 );
00145 levelLCD->setPalette( pal );
00146 hb->addWidget( levelLCD );
00147 hb->addStretch( 1 );
00148
00149 label = new QLabel( tr("Ships"), mainWin );
00150 label->setFont( labelFont );
00151
00152 label->setPalette( pal );
00153 hb->addWidget( label );
00154
00155 shipsLCD = new QLCDNumber( 1, mainWin );
00156 shipsLCD->setFrameStyle( QFrame::NoFrame );
00157 shipsLCD->setSegmentStyle( QLCDNumber::Flat );
00158 shipsLCD->setFixedHeight( 16 );
00159 shipsLCD->setPalette( pal );
00160 hb->addWidget( shipsLCD );
00161
00162
00163
00164 vb->addWidget( view, 10 );
00165
00166
00167 vb->addLayout( hbd );
00168
00169 QFont smallFont( "helvetica", 12 );
00170 hbd->addSpacing( 5 );
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 label = new QLabel( mainWin );
00189 label->setPixmap( Opie::Core::OResource::loadPixmap("qasteroids/powerups/brake.png") );
00190 label->setFixedWidth( 16 );
00191 label->setPalette( pal );
00192 hbd->addWidget( label );
00193
00194 brakesLCD = new QLCDNumber( 1, mainWin );
00195 brakesLCD->setFrameStyle( QFrame::NoFrame );
00196 brakesLCD->setSegmentStyle( QLCDNumber::Flat );
00197 brakesLCD->setPalette( pal );
00198 brakesLCD->setFixedHeight( 16 );
00199 hbd->addWidget( brakesLCD );
00200
00201 hbd->addSpacing( 5 );
00202
00203 label = new QLabel( mainWin );
00204 label->setPixmap( Opie::Core::OResource::loadPixmap("qasteroids/powerups/shield.png") );
00205 label->setFixedWidth( 16 );
00206 label->setPalette( pal );
00207 hbd->addWidget( label );
00208
00209 shieldLCD = new QLCDNumber( 1, mainWin );
00210 shieldLCD->setFrameStyle( QFrame::NoFrame );
00211 shieldLCD->setSegmentStyle( QLCDNumber::Flat );
00212 shieldLCD->setPalette( pal );
00213 shieldLCD->setFixedHeight( 16 );
00214 hbd->addWidget( shieldLCD );
00215
00216 hbd->addSpacing( 5 );
00217
00218 label = new QLabel( mainWin );
00219 label->setPixmap( Opie::Core::OResource::loadPixmap("qasteroids/powerups/shoot.png") );
00220 label->setFixedWidth( 16 );
00221 label->setPalette( pal );
00222 hbd->addWidget( label );
00223
00224 shootLCD = new QLCDNumber( 1, mainWin );
00225 shootLCD->setFrameStyle( QFrame::NoFrame );
00226 shootLCD->setSegmentStyle( QLCDNumber::Flat );
00227 shootLCD->setPalette( pal );
00228 shootLCD->setFixedHeight( 16 );
00229 hbd->addWidget( shootLCD );
00230
00231 hbd->addStretch( 1 );
00232
00233 label = new QLabel( tr( "Fuel" ), mainWin );
00234 label->setFont( smallFont );
00235 label->setFixedWidth( label->sizeHint().width() + 5 );
00236 label->setPalette( pal );
00237 hbd->addWidget( label );
00238
00239 powerMeter = new KALedMeter( mainWin );
00240 powerMeter->setFrameStyle( QFrame::Box | QFrame::Plain );
00241 powerMeter->setRange( MAX_POWER_LEVEL );
00242 powerMeter->addColorRange( 10, darkRed );
00243 powerMeter->addColorRange( 20, QColor(160, 96, 0) );
00244 powerMeter->addColorRange( 70, darkGreen );
00245 powerMeter->setCount( 15 );
00246 powerMeter->setPalette( pal );
00247 powerMeter->setFixedSize( 60, 12 );
00248 hbd->addWidget( powerMeter );
00249
00250 shipsRemain = 3;
00251 showHiscores = FALSE;
00252
00253 actions.insert( Qt::Key_Up, Thrust );
00254 actions.insert( Qt::Key_Left, RotateLeft );
00255 actions.insert( Qt::Key_Right, RotateRight );
00256 actions.insert( Qt::Key_Enter, Shoot );
00257 actions.insert( Qt::Key_Z, Teleport );
00258 actions.insert( Qt::Key_Down, Brake );
00259 actions.insert( Qt::Key_P, Pause );
00260
00261
00262 struct utsname name;
00263
00264
00265 if (uname(&name) != -1) {
00266 QString release=name.release;
00267 if(release.find("embedix",0,TRUE) !=-1) {
00268 actions.insert( Key_F12, Launch );
00269 actions.insert( Key_F11, Shield );
00270 actions.insert( Key_F9, NewGame );
00271 } else {
00272
00273 actions.insert( Key_F12, Shoot );
00274 actions.insert( Key_F11, Shield );
00275 actions.insert( Key_F10, Launch );
00276 actions.insert( Key_F9, NewGame );
00277 }
00278 }
00279
00280
00281
00282
00283 actions.insert( Qt::Key_Space, Shoot );
00284
00285 view->showText( tr( "Press Calendar to start playing" ), yellow );
00286
00287 setFocusPolicy( StrongFocus );
00288
00289 slotNewGame();
00290 }
00291
00292 KAstTopLevel::~KAstTopLevel()
00293 {
00294 }
00295
00296 void KAstTopLevel::playSound( const char * )
00297 {
00298 }
00299
00300 void KAstTopLevel::keyPressEvent( QKeyEvent *event )
00301 {
00302 if ( event->isAutoRepeat() || !actions.contains( event->key() ) )
00303 {
00304 event->ignore();
00305 return;
00306 }
00307
00308 Action a = actions[ event->key() ];
00309
00310 switch ( a )
00311 {
00312 case RotateLeft:
00313 view->rotateLeft( TRUE );
00314 break;
00315
00316 case RotateRight:
00317 view->rotateRight( TRUE );
00318 break;
00319
00320 case Thrust:
00321 view->thrust( TRUE );
00322 break;
00323
00324 case Shoot:
00325 view->shoot( TRUE );
00326 break;
00327
00328 case Shield:
00329 view->setShield( TRUE );
00330 break;
00331
00332 case Teleport:
00333 view->teleport( TRUE );
00334 break;
00335
00336 case Brake:
00337 view->brake( TRUE );
00338 break;
00339
00340 default:
00341 event->ignore();
00342 return;
00343 }
00344 event->accept();
00345 }
00346
00347 void KAstTopLevel::keyReleaseEvent( QKeyEvent *event )
00348 {
00349 if ( event->isAutoRepeat() || !actions.contains( event->key() ) )
00350 {
00351 event->ignore();
00352 return;
00353 }
00354
00355 Action a = actions[ event->key() ];
00356
00357 switch ( a )
00358 {
00359 case RotateLeft:
00360 view->rotateLeft( FALSE );
00361 break;
00362
00363 case RotateRight:
00364 view->rotateRight( FALSE );
00365 break;
00366
00367 case Thrust:
00368 view->thrust( FALSE );
00369 break;
00370
00371 case Shoot:
00372 view->shoot( FALSE );
00373 break;
00374
00375 case Brake:
00376 view->brake( FALSE );
00377 break;
00378
00379 case Shield:
00380 view->setShield( FALSE );
00381 break;
00382
00383 case Teleport:
00384 view->teleport( FALSE );
00385 break;
00386
00387 case Launch:
00388 if ( waitShip )
00389 {
00390 view->newShip();
00391 waitShip = FALSE;
00392 view->hideText();
00393 }
00394 else
00395 {
00396 event->ignore();
00397 return;
00398 }
00399 break;
00400
00401 case NewGame:
00402 slotNewGame();
00403 break;
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415 default:
00416 event->ignore();
00417 return;
00418 }
00419
00420 event->accept();
00421 }
00422
00423 void KAstTopLevel::showEvent( QShowEvent *e )
00424 {
00425 QMainWindow::showEvent( e );
00426 view->pause( FALSE );
00427 setFocus();
00428 }
00429
00430 void KAstTopLevel::hideEvent( QHideEvent *e )
00431 {
00432 QMainWindow::hideEvent( e );
00433 view->pause( TRUE );
00434 }
00435
00436 void KAstTopLevel::focusInEvent( QFocusEvent * )
00437 {
00438 view->pause( FALSE );
00439 setFocus();
00440 }
00441
00442 void KAstTopLevel::focusOutEvent( QFocusEvent * )
00443 {
00444 view->pause( TRUE );
00445 }
00446
00447 void KAstTopLevel::slotNewGame()
00448 {
00449 shipsRemain = 3;
00450 score = 0;
00451 scoreLCD->display( 0 );
00452 level = 0;
00453 levelLCD->display( level+1 );
00454 shipsLCD->display( shipsRemain-1 );
00455 view->newGame();
00456 view->setRockSpeed( levels[0].rockSpeed );
00457 view->addRocks( levels[0].nrocks );
00458 view->newShip();
00459 waitShip = FALSE;
00460 view->hideText();
00461 isPaused = FALSE;
00462 }
00463
00464 void KAstTopLevel::slotShipKilled()
00465 {
00466 shipsRemain--;
00467 shipsLCD->display( shipsRemain-1 );
00468
00469 playSound( "ShipDestroyed" );
00470
00471 if ( shipsRemain > 0 )
00472 {
00473 waitShip = TRUE;
00474 view->showText( tr( "Ship Destroyed.\nPress Contacts/Home key."), yellow );
00475 }
00476 else
00477 {
00478 view->endGame();
00479 doStats();
00480 }
00481 }
00482
00483 void KAstTopLevel::slotRockHit( int size )
00484 {
00485 switch ( size )
00486 {
00487 case 0:
00488 score += 10;
00489 break;
00490
00491 case 1:
00492 score += 20;
00493 break;
00494
00495 default:
00496 score += 40;
00497 }
00498
00499 playSound( "RockDestroyed" );
00500
00501 scoreLCD->display( score );
00502 }
00503
00504 void KAstTopLevel::slotRocksRemoved()
00505 {
00506 level++;
00507
00508 if ( level >= MAX_LEVELS )
00509 level = MAX_LEVELS - 1;
00510
00511 view->setRockSpeed( levels[level-1].rockSpeed );
00512 view->addRocks( levels[level-1].nrocks );
00513
00514 levelLCD->display( level+1 );
00515 }
00516
00517 void KAstTopLevel::doStats()
00518 {
00519 QString r( "0.00" );
00520 if ( view->shots() )
00521 r = QString::number( (double)view->hits() / view->shots() * 100.0,
00522 'g', 2 );
00523
00524 view->showText( tr( "Game Over.\nPress Calendar for a new game." ), yellow, FALSE );
00525 }
00526
00527 void KAstTopLevel::slotUpdateVitals()
00528 {
00529 brakesLCD->display( view->brakeCount() );
00530 shieldLCD->display( view->shieldCount() );
00531 shootLCD->display( view->shootCount() );
00532
00533 powerMeter->setValue( view->power() );
00534 }