home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 3.iso / dist / fw_qt3.idb / usr / freeware / Qt / examples / demo / qasteroids / toplevel.cpp.z / toplevel.cpp
Encoding:
C/C++ Source or Header  |  2002-04-08  |  11.6 KB  |  494 lines

  1. /*
  2.  * KAsteroids - Copyright (c) Martin R. Jones 1997
  3.  *
  4.  * Part of the KDE project
  5.  */
  6. //    --- toplevel.cpp ---
  7. #include <qaccel.h>
  8. #include <qlabel.h>
  9. #include <qlayout.h>
  10. #include <qlcdnumber.h>
  11. #include <qpushbutton.h>
  12.  
  13. #include <qapplication.h>
  14.  
  15. #include "toplevel.h"
  16. #include "ledmeter.h"
  17.  
  18.  
  19. #define SB_SCORE    1
  20. #define SB_LEVEL    2
  21. #define SB_SHIPS    3
  22.  
  23. struct SLevel
  24. {
  25.     int    nrocks;
  26.     double rockSpeed;
  27. };
  28.  
  29. #define MAX_LEVELS    16
  30.  
  31. SLevel levels[MAX_LEVELS] =
  32. {
  33.     { 1, 0.4 },
  34.     { 1, 0.6 },
  35.     { 2, 0.5 },
  36.     { 2, 0.7 },
  37.     { 2, 0.8 },
  38.     { 3, 0.6 },
  39.     { 3, 0.7 },
  40.     { 3, 0.8 },
  41.     { 4, 0.6 },
  42.     { 4, 0.7 },
  43.     { 4, 0.8 },
  44.     { 5, 0.7 },
  45.     { 5, 0.8 },
  46.     { 5, 0.9 },
  47.     { 5, 1.0 }
  48. };
  49.  
  50. const char *soundEvents[] =
  51. {
  52.     "ShipDestroyed",
  53.     "RockDestroyed",
  54.     0
  55. };
  56.  
  57. const char *soundDefaults[] =
  58. {
  59.     "Explosion.wav",
  60.     "ploop.wav",
  61.     0
  62. };
  63.  
  64.  
  65. KAstTopLevel::KAstTopLevel( QWidget *parent, const char *name )
  66.     : QMainWindow( parent, name )
  67. {
  68.     QWidget *border = new QWidget( this );
  69.     border->setBackgroundColor( black );
  70.     setCentralWidget( border );
  71.  
  72.     QVBoxLayout *borderLayout = new QVBoxLayout( border );
  73.     borderLayout->addStretch( 1 );
  74.  
  75.     QWidget *mainWin = new QWidget( border );
  76.     mainWin->setFixedSize(640, 480);
  77.     borderLayout->addWidget( mainWin, 0, AlignHCenter );
  78.  
  79.     borderLayout->addStretch( 1 );
  80.  
  81.     view = new KAsteroidsView( mainWin );
  82.     view->setFocusPolicy( StrongFocus );
  83.     connect( view, SIGNAL( shipKilled() ), SLOT( slotShipKilled() ) );
  84.     connect( view, SIGNAL( rockHit(int) ), SLOT( slotRockHit(int) ) );
  85.     connect( view, SIGNAL( rocksRemoved() ), SLOT( slotRocksRemoved() ) );
  86.     connect( view, SIGNAL( updateVitals() ), SLOT( slotUpdateVitals() ) );
  87.  
  88.     QVBoxLayout *vb = new QVBoxLayout( mainWin );
  89.     QHBoxLayout *hb = new QHBoxLayout;
  90.     QHBoxLayout *hbd = new QHBoxLayout;
  91.     vb->addLayout( hb );
  92.  
  93.     QFont labelFont( "helvetica", 24 );
  94.     QColorGroup grp( darkGreen, black, QColor( 128, 128, 128 ),
  95.         QColor( 64, 64, 64 ), black, darkGreen, black );
  96.     QPalette pal( grp, grp, grp );
  97.  
  98.     mainWin->setPalette( pal );
  99.  
  100.     hb->addSpacing( 10 );
  101.  
  102.     QLabel *label;
  103.     label = new QLabel( tr("Score"), mainWin );
  104.     label->setFont( labelFont );
  105.     label->setPalette( pal );
  106.     label->setFixedWidth( label->sizeHint().width() );
  107.     hb->addWidget( label );
  108.  
  109.     scoreLCD = new QLCDNumber( 6, mainWin );
  110.     scoreLCD->setFrameStyle( QFrame::NoFrame );
  111.     scoreLCD->setSegmentStyle( QLCDNumber::Flat );
  112.     scoreLCD->setFixedWidth( 150 );
  113.     scoreLCD->setPalette( pal );
  114.     hb->addWidget( scoreLCD );
  115.     hb->addStretch( 10 );
  116.  
  117.     label = new QLabel( tr("Level"), mainWin );
  118.     label->setFont( labelFont );
  119.     label->setPalette( pal );
  120.     label->setFixedWidth( label->sizeHint().width() );
  121.     hb->addWidget( label );
  122.  
  123.     levelLCD = new QLCDNumber( 2, mainWin );
  124.     levelLCD->setFrameStyle( QFrame::NoFrame );
  125.     levelLCD->setSegmentStyle( QLCDNumber::Flat );
  126.     levelLCD->setFixedWidth( 70 );
  127.     levelLCD->setPalette( pal );
  128.     hb->addWidget( levelLCD );
  129.     hb->addStretch( 10 );
  130.  
  131.     label = new QLabel( tr("Ships"), mainWin );
  132.     label->setFont( labelFont );
  133.     label->setFixedWidth( label->sizeHint().width() );
  134.     label->setPalette( pal );
  135.     hb->addWidget( label );
  136.  
  137.     shipsLCD = new QLCDNumber( 1, mainWin );
  138.     shipsLCD->setFrameStyle( QFrame::NoFrame );
  139.     shipsLCD->setSegmentStyle( QLCDNumber::Flat );
  140.     shipsLCD->setFixedWidth( 40 );
  141.     shipsLCD->setPalette( pal );
  142.     hb->addWidget( shipsLCD );
  143.  
  144.     hb->addStrut( 30 );
  145.  
  146.     vb->addWidget( view, 10 );
  147.  
  148. // -- bottom layout:
  149.     vb->addLayout( hbd );
  150.  
  151.     QFont smallFont( "helvetica", 14 );
  152.     hbd->addSpacing( 10 );
  153.  
  154.     QString sprites_prefix = "qasteroids/sprites/";
  155. /*
  156.     label = new QLabel( tr( "T" ), mainWin );
  157.     label->setFont( smallFont );
  158.     label->setFixedWidth( label->sizeHint().width() );
  159.     label->setPalette( pal );
  160.     hbd->addWidget( label );
  161.  
  162.     teleportsLCD = new QLCDNumber( 1, mainWin );
  163.     teleportsLCD->setFrameStyle( QFrame::NoFrame );
  164.     teleportsLCD->setSegmentStyle( QLCDNumber::Flat );
  165.     teleportsLCD->setPalette( pal );
  166.     teleportsLCD->setFixedHeight( 20 );
  167.     hbd->addWidget( teleportsLCD );
  168.  
  169.     hbd->addSpacing( 10 );
  170. */
  171.     QPixmap pm( sprites_prefix + "powerups/brake.png" );
  172.     label = new QLabel( mainWin );
  173.     label->setPixmap( pm );
  174.     label->setFixedWidth( label->sizeHint().width() );
  175.     label->setPalette( pal );
  176.     hbd->addWidget( label );
  177.  
  178.     brakesLCD = new QLCDNumber( 1, mainWin );
  179.     brakesLCD->setFrameStyle( QFrame::NoFrame );
  180.     brakesLCD->setSegmentStyle( QLCDNumber::Flat );
  181.     brakesLCD->setPalette( pal );
  182.     brakesLCD->setFixedHeight( 20 );
  183.     hbd->addWidget( brakesLCD );
  184.  
  185.     hbd->addSpacing( 10 );
  186.  
  187.     pm.load( sprites_prefix + "powerups/shield.png" );
  188.     label = new QLabel( mainWin );
  189.     label->setPixmap( pm );
  190.     label->setFixedWidth( label->sizeHint().width() );
  191.     label->setPalette( pal );
  192.     hbd->addWidget( label );
  193.  
  194.     shieldLCD = new QLCDNumber( 1, mainWin );
  195.     shieldLCD->setFrameStyle( QFrame::NoFrame );
  196.     shieldLCD->setSegmentStyle( QLCDNumber::Flat );
  197.     shieldLCD->setPalette( pal );
  198.     shieldLCD->setFixedHeight( 20 );
  199.     hbd->addWidget( shieldLCD );
  200.  
  201.     hbd->addSpacing( 10 );
  202.  
  203.     pm.load( sprites_prefix + "powerups/shoot.png" );
  204.     label = new QLabel( mainWin );
  205.     label->setPixmap( pm );
  206.     label->setFixedWidth( label->sizeHint().width() );
  207.     label->setPalette( pal );
  208.     hbd->addWidget( label );
  209.  
  210.     shootLCD = new QLCDNumber( 1, mainWin );
  211.     shootLCD->setFrameStyle( QFrame::NoFrame );
  212.     shootLCD->setSegmentStyle( QLCDNumber::Flat );
  213.     shootLCD->setPalette( pal );
  214.     shootLCD->setFixedHeight( 20 );
  215.     hbd->addWidget( shootLCD );
  216.  
  217.     hbd->addStretch( 1 );
  218.  
  219.     label = new QLabel( tr( "Fuel" ), mainWin );
  220.     label->setFont( smallFont );
  221.     label->setFixedWidth( label->sizeHint().width() + 10 );
  222.     label->setPalette( pal );
  223.     hbd->addWidget( label );
  224.  
  225.     powerMeter = new KALedMeter( mainWin );
  226.     powerMeter->setFrameStyle( QFrame::Box | QFrame::Plain );
  227.     powerMeter->setRange( MAX_POWER_LEVEL );
  228.     powerMeter->addColorRange( 10, darkRed );
  229.     powerMeter->addColorRange( 20, QColor(160, 96, 0) );
  230.     powerMeter->addColorRange( 70, darkGreen );
  231.     powerMeter->setCount( 40 );
  232.     powerMeter->setPalette( pal );
  233.     powerMeter->setFixedSize( 200, 12 );
  234.     hbd->addWidget( powerMeter );
  235.  
  236.     shipsRemain = 3;
  237.     showHiscores = FALSE;
  238.  
  239.     actions.insert( Qt::Key_Up, Thrust );
  240.     actions.insert( Qt::Key_Left, RotateLeft );
  241.     actions.insert( Qt::Key_Right, RotateRight );
  242.     actions.insert( Qt::Key_Space, Shoot );
  243.     actions.insert( Qt::Key_Z, Teleport );
  244.     actions.insert( Qt::Key_X, Brake );
  245.     actions.insert( Qt::Key_S, Shield );
  246.     actions.insert( Qt::Key_P, Pause );
  247.     actions.insert( Qt::Key_L, Launch );
  248.     actions.insert( Qt::Key_N, NewGame );
  249.  
  250.     view->showText( tr( "Press N to start playing" ), yellow );
  251. }
  252.  
  253. KAstTopLevel::~KAstTopLevel()
  254. {
  255. }
  256.  
  257. void KAstTopLevel::playSound( const char * )
  258. {
  259. }
  260.  
  261. void KAstTopLevel::keyPressEvent( QKeyEvent *event )
  262. {
  263.     if ( event->isAutoRepeat() || !actions.contains( event->key() ) )
  264.     {
  265.         event->ignore();
  266.         return;
  267.     }
  268.  
  269.     Action a = actions[ event->key() ];
  270.  
  271.     switch ( a )
  272.     {
  273.         case RotateLeft:
  274.             view->rotateLeft( TRUE );
  275.             break;
  276.  
  277.         case RotateRight:
  278.             view->rotateRight( TRUE );
  279.             break;
  280.  
  281.         case Thrust:
  282.             view->thrust( TRUE );
  283.             break;
  284.  
  285.         case Shoot:
  286.             view->shoot( TRUE );
  287.             break;
  288.  
  289.         case Shield:
  290.             view->setShield( TRUE );
  291.             break;
  292.  
  293.         case Teleport:
  294.             view->teleport( TRUE );
  295.             break;
  296.  
  297.         case Brake:
  298.             view->brake( TRUE );
  299.             break;
  300.  
  301.         default:
  302.             event->ignore();
  303.             return;
  304.     }
  305.     event->accept();
  306. }
  307.  
  308. void KAstTopLevel::keyReleaseEvent( QKeyEvent *event )
  309. {
  310.     if ( event->isAutoRepeat() || !actions.contains( event->key() ) )
  311.     {
  312.         event->ignore();
  313.         return;
  314.     }
  315.  
  316.     Action a = actions[ event->key() ];
  317.  
  318.     switch ( a )
  319.     {
  320.         case RotateLeft:
  321.             view->rotateLeft( FALSE );
  322.             break;
  323.  
  324.         case RotateRight:
  325.             view->rotateRight( FALSE );
  326.             break;
  327.  
  328.         case Thrust:
  329.             view->thrust( FALSE );
  330.             break;
  331.  
  332.         case Shoot:
  333.             view->shoot( FALSE );
  334.             break;
  335.  
  336.         case Brake:
  337.             view->brake( FALSE );
  338.             break;
  339.  
  340.         case Shield:
  341.             view->setShield( FALSE );
  342.             break;
  343.  
  344.         case Teleport:
  345.             view->teleport( FALSE );
  346.             break;
  347.  
  348.         case Launch:
  349.             if ( waitShip )
  350.             {
  351.                 view->newShip();
  352.                 waitShip = FALSE;
  353.                 view->hideText();
  354.             }
  355.             else
  356.             {
  357.                 event->ignore();
  358.                 return;
  359.             }
  360.             break;
  361.     
  362.     case NewGame:
  363.         slotNewGame();
  364.         break;
  365. /*
  366.         case Pause:
  367.             {
  368.                 view->pause( TRUE );
  369.                 QMessageBox::information( this,
  370.                                           tr("KAsteroids is paused"),
  371.                                           tr("Paused") );
  372.                 view->pause( FALSE );
  373.             }
  374.             break;
  375. */
  376.         default:
  377.             event->ignore();
  378.             return;
  379.     }
  380.  
  381.     event->accept();
  382. }
  383.  
  384. void KAstTopLevel::showEvent( QShowEvent *e )
  385. {
  386.     QMainWindow::showEvent( e );
  387.     view->pause( FALSE );
  388.     view->setFocus();
  389. }
  390.  
  391. void KAstTopLevel::hideEvent( QHideEvent *e )
  392. {
  393.     QMainWindow::hideEvent( e );
  394.     view->pause( TRUE );
  395. }
  396.  
  397. void KAstTopLevel::slotNewGame()
  398. {
  399.     score = 0;
  400.     scoreLCD->display( 0 );
  401.     level = 0;
  402.     levelLCD->display( level+1 );
  403.     shipsLCD->display( shipsRemain-1 );
  404.     view->newGame();
  405.     view->setRockSpeed( levels[0].rockSpeed );
  406.     view->addRocks( levels[0].nrocks );
  407. //    view->showText( tr( "Press L to launch." ), yellow );
  408.     view->newShip();
  409.     waitShip = FALSE;
  410.     view->hideText();
  411.     isPaused = FALSE;
  412. }
  413.  
  414. void KAstTopLevel::slotShipKilled()
  415. {
  416.     shipsRemain--;
  417.     shipsLCD->display( shipsRemain-1 );
  418.  
  419.     playSound( "ShipDestroyed" );
  420.  
  421.     if ( shipsRemain )
  422.     {
  423.         waitShip = TRUE;
  424.         view->showText( tr( "Ship Destroyed. Press L to launch."), yellow );
  425.     }
  426.     else
  427.     {
  428.         view->showText( tr("Game Over!"), red );
  429.         view->endGame();
  430.     doStats();
  431. //        highscore->addEntry( score, level, showHiscores );
  432.     }
  433. }
  434.  
  435. void KAstTopLevel::slotRockHit( int size )
  436. {
  437.     switch ( size )
  438.     {
  439.     case 0:
  440.         score += 10;
  441.          break;
  442.  
  443.     case 1:
  444.         score += 20;
  445.         break;
  446.  
  447.     default:
  448.         score += 40;
  449.       }
  450.  
  451.     playSound( "RockDestroyed" );
  452.  
  453.     scoreLCD->display( score );
  454. }
  455.  
  456. void KAstTopLevel::slotRocksRemoved()
  457. {
  458.     level++;
  459.  
  460.     if ( level >= MAX_LEVELS )
  461.     level = MAX_LEVELS - 1;
  462.  
  463.     view->setRockSpeed( levels[level-1].rockSpeed );
  464.     view->addRocks( levels[level-1].nrocks );
  465.  
  466.     levelLCD->display( level+1 );
  467. }
  468.  
  469. void KAstTopLevel::doStats()
  470. {
  471.     QString r( "0.00" );
  472.     if ( view->shots() )
  473.      r = QString::number( (double)view->hits() / view->shots() * 100.0,
  474.                  'g', 2 );
  475.  
  476. /* multi-line text broken in Qt 3
  477.     QString s = tr( "Game Over\n\nShots fired:\t%1\n  Hit:\t%2\n  Missed:\t%3\nHit ratio:\t%4 %\n\nPress N for a new game" )
  478.       .arg(view->shots()).arg(view->hits())
  479.       .arg(view->shots() - view->hits())
  480.       .arg(r);
  481. */
  482.  
  483.     view->showText( "Game Over.   Press N for a new game.", yellow, FALSE );
  484. }
  485.  
  486. void KAstTopLevel::slotUpdateVitals()
  487. {
  488.     brakesLCD->display( view->brakeCount() );
  489.     shieldLCD->display( view->shieldCount() );
  490.     shootLCD->display( view->shootCount() );
  491. //    teleportsLCD->display( view->teleportCount() );
  492.     powerMeter->setValue( view->power() );
  493. }
  494.