Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

toplevel.cpp

Go to the documentation of this file.
00001 /**********************************************************************
00002 ** Copyright (C) 2000 Trolltech AS.  All rights reserved.
00003 **
00004 ** This file is part of Qtopia Environment.
00005 **
00006 ** This file may be distributed and/or modified under the terms of the
00007 ** GNU General Public License version 2 as published by the Free Software
00008 ** Foundation and appearing in the file LICENSE.GPL included in the
00009 ** packaging of this file.
00010 **
00011 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
00012 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00013 **
00014 ** See http://www.trolltech.com/gpl/ for GPL licensing information.
00015 **
00016 ** Contact info@trolltech.com if any conditions of this licensing are
00017 ** not clear to you.
00018 **
00019 **********************************************************************//*
00020  * KAsteroids - Copyright (c) Martin R. Jones 1997
00021  *
00022  * Part of the KDE project
00023  */
00024 //      --- toplevel.cpp ---
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 //    label->setFixedWidth( label->sizeHint().width() );
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 //    label->setFixedWidth( label->sizeHint().width() );
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 //    label->setFixedWidth( label->sizeHint().width() );
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 //    hb->addStrut( 14 );
00163 
00164     vb->addWidget( view, 10 );
00165 
00166 // -- bottom layout:
00167     vb->addLayout( hbd );
00168 
00169     QFont smallFont( "helvetica", 12 );
00170     hbd->addSpacing( 5 );
00171 
00172 /*
00173     label = new QLabel( tr( "T" ), mainWin );
00174     label->setFont( smallFont );
00175     label->setFixedWidth( label->sizeHint().width() );
00176     label->setPalette( pal );
00177     hbd->addWidget( label );
00178 
00179     teleportsLCD = new QLCDNumber( 1, mainWin );
00180     teleportsLCD->setFrameStyle( QFrame::NoFrame );
00181     teleportsLCD->setSegmentStyle( QLCDNumber::Flat );
00182     teleportsLCD->setPalette( pal );
00183     teleportsLCD->setFixedHeight( 18 );
00184     hbd->addWidget( teleportsLCD );
00185 
00186     hbd->addSpacing( 10 );
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; /* check for embedix kernel running on the zaurus, if
00263                             lineo change string, this break
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           // ipaq
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 //    actions.insert( Qt::Key_S, Shield );
00281 //    actions.insert( Qt::Key_X, Brake );
00282 //    actions.insert( Qt::Key_L, Launch );
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         case Pause:
00406             {
00407                 view->pause( TRUE );
00408                 QMessageBox::information( this,
00409                                           tr("KAsteroids is paused"),
00410                                           tr("Paused") );
00411                 view->pause( FALSE );
00412             }
00413             break;
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 //    teleportsLCD->display( view->teleportCount() );
00533     powerMeter->setValue( view->power() );
00534 }

Generated on Sat Nov 5 16:17:24 2005 for OPIE by  doxygen 1.4.2