home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / qt3_emx.zip / examples / demo / qasteroids / toplevel.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2001-05-02  |  11.8 KB  |  504 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.     connect( view, SIGNAL( shipKilled() ), SLOT( slotShipKilled() ) );
  83.     connect( view, SIGNAL( rockHit(int) ), SLOT( slotRockHit(int) ) );
  84.     connect( view, SIGNAL( rocksRemoved() ), SLOT( slotRocksRemoved() ) );
  85.     connect( view, SIGNAL( updateVitals() ), SLOT( slotUpdateVitals() ) );
  86.  
  87.     QVBoxLayout *vb = new QVBoxLayout( mainWin );
  88.     QHBoxLayout *hb = new QHBoxLayout;
  89.     QHBoxLayout *hbd = new QHBoxLayout;
  90.     vb->addLayout( hb );
  91.  
  92.     QFont labelFont( "helvetica", 24 );
  93.     QColorGroup grp( darkGreen, black, QColor( 128, 128, 128 ),
  94.         QColor( 64, 64, 64 ), black, darkGreen, black );
  95.     QPalette pal( grp, grp, grp );
  96.  
  97.     mainWin->setPalette( pal );
  98.  
  99.     hb->addSpacing( 10 );
  100.  
  101.     QLabel *label;
  102.     label = new QLabel( tr("Score"), mainWin );
  103.     label->setFont( labelFont );
  104.     label->setPalette( pal );
  105.     label->setFixedWidth( label->sizeHint().width() );
  106.     hb->addWidget( label );
  107.  
  108.     scoreLCD = new QLCDNumber( 6, mainWin );
  109.     scoreLCD->setFrameStyle( QFrame::NoFrame );
  110.     scoreLCD->setSegmentStyle( QLCDNumber::Flat );
  111.     scoreLCD->setFixedWidth( 150 );
  112.     scoreLCD->setPalette( pal );
  113.     hb->addWidget( scoreLCD );
  114.     hb->addStretch( 10 );
  115.  
  116.     label = new QLabel( tr("Level"), mainWin );
  117.     label->setFont( labelFont );
  118.     label->setPalette( pal );
  119.     label->setFixedWidth( label->sizeHint().width() );
  120.     hb->addWidget( label );
  121.  
  122.     levelLCD = new QLCDNumber( 2, mainWin );
  123.     levelLCD->setFrameStyle( QFrame::NoFrame );
  124.     levelLCD->setSegmentStyle( QLCDNumber::Flat );
  125.     levelLCD->setFixedWidth( 70 );
  126.     levelLCD->setPalette( pal );
  127.     hb->addWidget( levelLCD );
  128.     hb->addStretch( 10 );
  129.  
  130.     label = new QLabel( tr("Ships"), mainWin );
  131.     label->setFont( labelFont );
  132.     label->setFixedWidth( label->sizeHint().width() );
  133.     label->setPalette( pal );
  134.     hb->addWidget( label );
  135.  
  136.     shipsLCD = new QLCDNumber( 1, mainWin );
  137.     shipsLCD->setFrameStyle( QFrame::NoFrame );
  138.     shipsLCD->setSegmentStyle( QLCDNumber::Flat );
  139.     shipsLCD->setFixedWidth( 40 );
  140.     shipsLCD->setPalette( pal );
  141.     hb->addWidget( shipsLCD );
  142.  
  143.     hb->addStrut( 30 );
  144.  
  145.     vb->addWidget( view, 10 );
  146.  
  147. // -- bottom layout:
  148.     vb->addLayout( hbd );
  149.  
  150.     QFont smallFont( "helvetica", 14 );
  151.     hbd->addSpacing( 10 );
  152.  
  153.     QString sprites_prefix = "qasteroids/sprites/";
  154. /*
  155.     label = new QLabel( tr( "T" ), mainWin );
  156.     label->setFont( smallFont );
  157.     label->setFixedWidth( label->sizeHint().width() );
  158.     label->setPalette( pal );
  159.     hbd->addWidget( label );
  160.  
  161.     teleportsLCD = new QLCDNumber( 1, mainWin );
  162.     teleportsLCD->setFrameStyle( QFrame::NoFrame );
  163.     teleportsLCD->setSegmentStyle( QLCDNumber::Flat );
  164.     teleportsLCD->setPalette( pal );
  165.     teleportsLCD->setFixedHeight( 20 );
  166.     hbd->addWidget( teleportsLCD );
  167.  
  168.     hbd->addSpacing( 10 );
  169. */
  170.     QPixmap pm( sprites_prefix + "powerups/brake.png" );
  171.     label = new QLabel( mainWin );
  172.     label->setPixmap( pm );
  173.     label->setFixedWidth( label->sizeHint().width() );
  174.     label->setPalette( pal );
  175.     hbd->addWidget( label );
  176.  
  177.     brakesLCD = new QLCDNumber( 1, mainWin );
  178.     brakesLCD->setFrameStyle( QFrame::NoFrame );
  179.     brakesLCD->setSegmentStyle( QLCDNumber::Flat );
  180.     brakesLCD->setPalette( pal );
  181.     brakesLCD->setFixedHeight( 20 );
  182.     hbd->addWidget( brakesLCD );
  183.  
  184.     hbd->addSpacing( 10 );
  185.  
  186.     pm.load( sprites_prefix + "powerups/shield.png" );
  187.     label = new QLabel( mainWin );
  188.     label->setPixmap( pm );
  189.     label->setFixedWidth( label->sizeHint().width() );
  190.     label->setPalette( pal );
  191.     hbd->addWidget( label );
  192.  
  193.     shieldLCD = new QLCDNumber( 1, mainWin );
  194.     shieldLCD->setFrameStyle( QFrame::NoFrame );
  195.     shieldLCD->setSegmentStyle( QLCDNumber::Flat );
  196.     shieldLCD->setPalette( pal );
  197.     shieldLCD->setFixedHeight( 20 );
  198.     hbd->addWidget( shieldLCD );
  199.  
  200.     hbd->addSpacing( 10 );
  201.  
  202.     pm.load( sprites_prefix + "powerups/shoot.png" );
  203.     label = new QLabel( mainWin );
  204.     label->setPixmap( pm );
  205.     label->setFixedWidth( label->sizeHint().width() );
  206.     label->setPalette( pal );
  207.     hbd->addWidget( label );
  208.  
  209.     shootLCD = new QLCDNumber( 1, mainWin );
  210.     shootLCD->setFrameStyle( QFrame::NoFrame );
  211.     shootLCD->setSegmentStyle( QLCDNumber::Flat );
  212.     shootLCD->setPalette( pal );
  213.     shootLCD->setFixedHeight( 20 );
  214.     hbd->addWidget( shootLCD );
  215.  
  216.     hbd->addStretch( 1 );
  217.  
  218.     label = new QLabel( tr( "Fuel" ), mainWin );
  219.     label->setFont( smallFont );
  220.     label->setFixedWidth( label->sizeHint().width() + 10 );
  221.     label->setPalette( pal );
  222.     hbd->addWidget( label );
  223.  
  224.     powerMeter = new KALedMeter( mainWin );
  225.     powerMeter->setFrameStyle( QFrame::Box | QFrame::Plain );
  226.     powerMeter->setRange( MAX_POWER_LEVEL );
  227.     powerMeter->addColorRange( 10, darkRed );
  228.     powerMeter->addColorRange( 20, QColor(160, 96, 0) );
  229.     powerMeter->addColorRange( 70, darkGreen );
  230.     powerMeter->setCount( 40 );
  231.     powerMeter->setPalette( pal );
  232.     powerMeter->setFixedSize( 200, 12 );
  233.     hbd->addWidget( powerMeter );
  234.  
  235.     shipsRemain = 3;
  236.     showHiscores = FALSE;
  237.  
  238.     actions.insert( Qt::Key_Up, Thrust );
  239.     actions.insert( Qt::Key_Left, RotateLeft );
  240.     actions.insert( Qt::Key_Right, RotateRight );
  241.     actions.insert( Qt::Key_Space, Shoot );
  242.     actions.insert( Qt::Key_Z, Teleport );
  243.     actions.insert( Qt::Key_X, Brake );
  244.     actions.insert( Qt::Key_S, Shield );
  245.     actions.insert( Qt::Key_P, Pause );
  246.     actions.insert( Qt::Key_L, Launch );
  247.     actions.insert( Qt::Key_N, NewGame );
  248.  
  249.     view->showText( tr( "Press N to start playing" ), yellow );
  250.  
  251.     setFocusPolicy( StrongFocus );
  252. }
  253.  
  254. KAstTopLevel::~KAstTopLevel()
  255. {
  256. }
  257.  
  258. void KAstTopLevel::playSound( const char * )
  259. {
  260. }
  261.  
  262. void KAstTopLevel::keyPressEvent( QKeyEvent *event )
  263. {
  264.     if ( event->isAutoRepeat() || !actions.contains( event->key() ) )
  265.     {
  266.         event->ignore();
  267.         return;
  268.     }
  269.  
  270.     Action a = actions[ event->key() ];
  271.  
  272.     switch ( a )
  273.     {
  274.         case RotateLeft:
  275.             view->rotateLeft( TRUE );
  276.             break;
  277.  
  278.         case RotateRight:
  279.             view->rotateRight( TRUE );
  280.             break;
  281.  
  282.         case Thrust:
  283.             view->thrust( TRUE );
  284.             break;
  285.  
  286.         case Shoot:
  287.             view->shoot( TRUE );
  288.             break;
  289.  
  290.         case Shield:
  291.             view->setShield( TRUE );
  292.             break;
  293.  
  294.         case Teleport:
  295.             view->teleport( TRUE );
  296.             break;
  297.  
  298.         case Brake:
  299.             view->brake( TRUE );
  300.             break;
  301.  
  302.         default:
  303.             event->ignore();
  304.             return;
  305.     }
  306.     event->accept();
  307. }
  308.  
  309. void KAstTopLevel::keyReleaseEvent( QKeyEvent *event )
  310. {
  311.     if ( event->isAutoRepeat() || !actions.contains( event->key() ) )
  312.     {
  313.         event->ignore();
  314.         return;
  315.     }
  316.  
  317.     Action a = actions[ event->key() ];
  318.  
  319.     switch ( a )
  320.     {
  321.         case RotateLeft:
  322.             view->rotateLeft( FALSE );
  323.             break;
  324.  
  325.         case RotateRight:
  326.             view->rotateRight( FALSE );
  327.             break;
  328.  
  329.         case Thrust:
  330.             view->thrust( FALSE );
  331.             break;
  332.  
  333.         case Shoot:
  334.             view->shoot( FALSE );
  335.             break;
  336.  
  337.         case Brake:
  338.             view->brake( FALSE );
  339.             break;
  340.  
  341.         case Shield:
  342.             view->setShield( FALSE );
  343.             break;
  344.  
  345.         case Teleport:
  346.             view->teleport( FALSE );
  347.             break;
  348.  
  349.         case Launch:
  350.             if ( waitShip )
  351.             {
  352.                 view->newShip();
  353.                 waitShip = FALSE;
  354.                 view->hideText();
  355.             }
  356.             else
  357.             {
  358.                 event->ignore();
  359.                 return;
  360.             }
  361.             break;
  362.     
  363.     case NewGame:
  364.         slotNewGame();
  365.         break;
  366. /*
  367.         case Pause:
  368.             {
  369.                 view->pause( TRUE );
  370.                 QMessageBox::information( this,
  371.                                           tr("KAsteroids is paused"),
  372.                                           tr("Paused") );
  373.                 view->pause( FALSE );
  374.             }
  375.             break;
  376. */
  377.         default:
  378.             event->ignore();
  379.             return;
  380.     }
  381.  
  382.     event->accept();
  383. }
  384.  
  385. void KAstTopLevel::showEvent( QShowEvent *e )
  386. {
  387.     QMainWindow::showEvent( e );
  388.     view->pause( FALSE );
  389.     setFocus();
  390. }
  391.  
  392. void KAstTopLevel::hideEvent( QHideEvent *e )
  393. {
  394.     QMainWindow::hideEvent( e );
  395.     view->pause( TRUE );
  396. }
  397.  
  398. void KAstTopLevel::focusInEvent( QFocusEvent * )
  399. {
  400.     setFocus();
  401. }
  402.  
  403. void KAstTopLevel::focusOutEvent( QFocusEvent * )
  404. {
  405. }
  406.  
  407. void KAstTopLevel::slotNewGame()
  408. {
  409.     score = 0;
  410.     scoreLCD->display( 0 );
  411.     level = 0;
  412.     levelLCD->display( level+1 );
  413.     shipsLCD->display( shipsRemain-1 );
  414.     view->newGame();
  415.     view->setRockSpeed( levels[0].rockSpeed );
  416.     view->addRocks( levels[0].nrocks );
  417. //    view->showText( tr( "Press L to launch." ), yellow );
  418.     view->newShip();
  419.     waitShip = FALSE;
  420.     view->hideText();
  421.     isPaused = FALSE;
  422. }
  423.  
  424. void KAstTopLevel::slotShipKilled()
  425. {
  426.     shipsRemain--;
  427.     shipsLCD->display( shipsRemain-1 );
  428.  
  429.     playSound( "ShipDestroyed" );
  430.  
  431.     if ( shipsRemain )
  432.     {
  433.         waitShip = TRUE;
  434.         view->showText( tr( "Ship Destroyed. Press L to launch."), yellow );
  435.     }
  436.     else
  437.     {
  438.         view->showText( tr("Game Over!"), red );
  439.         view->endGame();
  440.     doStats();
  441. //        highscore->addEntry( score, level, showHiscores );
  442.     }
  443. }
  444.  
  445. void KAstTopLevel::slotRockHit( int size )
  446. {
  447.     switch ( size )
  448.     {
  449.     case 0:
  450.         score += 10;
  451.          break;
  452.  
  453.     case 1:
  454.         score += 20;
  455.         break;
  456.  
  457.     default:
  458.         score += 40;
  459.       }
  460.  
  461.     playSound( "RockDestroyed" );
  462.  
  463.     scoreLCD->display( score );
  464. }
  465.  
  466. void KAstTopLevel::slotRocksRemoved()
  467. {
  468.     level++;
  469.  
  470.     if ( level >= MAX_LEVELS )
  471.     level = MAX_LEVELS - 1;
  472.  
  473.     view->setRockSpeed( levels[level-1].rockSpeed );
  474.     view->addRocks( levels[level-1].nrocks );
  475.  
  476.     levelLCD->display( level+1 );
  477. }
  478.  
  479. void KAstTopLevel::doStats()
  480. {
  481.     QString r( "0.00" );
  482.     if ( view->shots() )
  483.      r = QString::number( (double)view->hits() / view->shots() * 100.0,
  484.                  'g', 2 );
  485.  
  486. /* multi-line text broken in Qt 3
  487.     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" )
  488.       .arg(view->shots()).arg(view->hits())
  489.       .arg(view->shots() - view->hits())
  490.       .arg(r);
  491. */
  492.  
  493.     view->showText( "Game Over.   Press N for a new game.", yellow, FALSE );
  494. }
  495.  
  496. void KAstTopLevel::slotUpdateVitals()
  497. {
  498.     brakesLCD->display( view->brakeCount() );
  499.     shieldLCD->display( view->shieldCount() );
  500.     shootLCD->display( view->shootCount() );
  501. //    teleportsLCD->display( view->teleportCount() );
  502.     powerMeter->setValue( view->power() );
  503. }
  504.