examples/graphicsview/portedasteroids/toplevel.cpp
changeset 0 1918ee327afb
child 3 41300fa6a67c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/graphicsview/portedasteroids/toplevel.cpp	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,543 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*
+ * KAsteroids - Copyright (c) Martin R. Jones 1997
+ *
+ * Part of the KDE project
+ */
+//	--- toplevel.cpp ---
+#include <q3accel.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlcdnumber.h>
+#include <qpushbutton.h>
+
+#include <qapplication.h>
+//Added by qt3to4:
+#include <Q3HBoxLayout>
+#include <QShowEvent>
+#include <Q3Frame>
+#include <QPixmap>
+#include <QHideEvent>
+#include <QKeyEvent>
+#include <Q3VBoxLayout>
+
+#include "toplevel.h"
+#include "ledmeter.h"
+
+
+#define SB_SCORE	1
+#define SB_LEVEL	2
+#define SB_SHIPS	3
+
+struct SLevel
+{
+    int    nrocks;
+    double rockSpeed;
+};
+
+#define MAX_LEVELS	16
+
+SLevel levels[MAX_LEVELS] =
+{
+    { 1, 0.4 },
+    { 1, 0.6 },
+    { 2, 0.5 },
+    { 2, 0.7 },
+    { 2, 0.8 },
+    { 3, 0.6 },
+    { 3, 0.7 },
+    { 3, 0.8 },
+    { 4, 0.6 },
+    { 4, 0.7 },
+    { 4, 0.8 },
+    { 5, 0.7 },
+    { 5, 0.8 },
+    { 5, 0.9 },
+    { 5, 1.0 }
+};
+
+const char *soundEvents[] =
+{
+    "ShipDestroyed",
+    "RockDestroyed",
+    0
+};
+
+const char *soundDefaults[] =
+{
+    "Explosion.wav",
+    "ploop.wav",
+    0
+};
+
+
+KAstTopLevel::KAstTopLevel( QWidget *parent, const char *name )
+    : Q3MainWindow( parent, name, 0 )
+{
+    QWidget *border = new QWidget( this );
+    border->setBackgroundColor( Qt::black );
+    setCentralWidget( border );
+
+    Q3VBoxLayout *borderLayout = new Q3VBoxLayout( border );
+    borderLayout->addStretch( 1 );
+
+    QWidget *mainWin = new QWidget( border );
+    mainWin->setFixedSize(640, 480);
+    borderLayout->addWidget( mainWin, 0, Qt::AlignHCenter );
+
+    borderLayout->addStretch( 1 );
+
+    view = new KAsteroidsView( mainWin );
+    view->setFocusPolicy( Qt::StrongFocus );
+    connect( view, SIGNAL( shipKilled() ), SLOT( slotShipKilled() ) );
+    connect( view, SIGNAL( rockHit(int) ), SLOT( slotRockHit(int) ) );
+    connect( view, SIGNAL( rocksRemoved() ), SLOT( slotRocksRemoved() ) );
+    connect( view, SIGNAL( updateVitals() ), SLOT( slotUpdateVitals() ) );
+
+    Q3VBoxLayout *vb = new Q3VBoxLayout( mainWin );
+    Q3HBoxLayout *hb = new Q3HBoxLayout;
+    Q3HBoxLayout *hbd = new Q3HBoxLayout;
+    vb->addLayout( hb );
+
+    QFont labelFont( "helvetica", 24 );
+    QColorGroup grp( Qt::darkGreen, Qt::black, QColor( 128, 128, 128 ),
+	    QColor( 64, 64, 64 ), Qt::black, Qt::darkGreen, Qt::black );
+    QPalette pal( grp, grp, grp );
+
+    mainWin->setPalette( pal );
+
+    hb->addSpacing( 10 );
+
+    QLabel *label;
+    label = new QLabel( tr("Score"), mainWin );
+    label->setFont( labelFont );
+    label->setPalette( pal );
+    label->setFixedWidth( label->sizeHint().width() );
+    hb->addWidget( label );
+
+    scoreLCD = new QLCDNumber( 6, mainWin );
+    scoreLCD->setFrameStyle( Q3Frame::NoFrame );
+    scoreLCD->setSegmentStyle( QLCDNumber::Flat );
+    scoreLCD->setFixedWidth( 150 );
+    scoreLCD->setPalette( pal );
+    hb->addWidget( scoreLCD );
+    hb->addStretch( 10 );
+
+    label = new QLabel( tr("Level"), mainWin );
+    label->setFont( labelFont );
+    label->setPalette( pal );
+    label->setFixedWidth( label->sizeHint().width() );
+    hb->addWidget( label );
+
+    levelLCD = new QLCDNumber( 2, mainWin );
+    levelLCD->setFrameStyle( Q3Frame::NoFrame );
+    levelLCD->setSegmentStyle( QLCDNumber::Flat );
+    levelLCD->setFixedWidth( 70 );
+    levelLCD->setPalette( pal );
+    hb->addWidget( levelLCD );
+    hb->addStretch( 10 );
+
+    label = new QLabel( tr("Ships"), mainWin );
+    label->setFont( labelFont );
+    label->setFixedWidth( label->sizeHint().width() );
+    label->setPalette( pal );
+    hb->addWidget( label );
+
+    shipsLCD = new QLCDNumber( 1, mainWin );
+    shipsLCD->setFrameStyle( Q3Frame::NoFrame );
+    shipsLCD->setSegmentStyle( QLCDNumber::Flat );
+    shipsLCD->setFixedWidth( 40 );
+    shipsLCD->setPalette( pal );
+    hb->addWidget( shipsLCD );
+
+    hb->addStrut( 30 );
+
+    vb->addWidget( view, 10 );
+
+// -- bottom layout:
+    vb->addLayout( hbd );
+
+    QFont smallFont( "helvetica", 14 );
+    hbd->addSpacing( 10 );
+
+    QString sprites_prefix = ":/trolltech/examples/graphicsview/portedasteroids/sprites/";
+/*
+    label = new QLabel( tr( "T" ), mainWin );
+    label->setFont( smallFont );
+    label->setFixedWidth( label->sizeHint().width() );
+    label->setPalette( pal );
+    hbd->addWidget( label );
+
+    teleportsLCD = new QLCDNumber( 1, mainWin );
+    teleportsLCD->setFrameStyle( QFrame::NoFrame );
+    teleportsLCD->setSegmentStyle( QLCDNumber::Flat );
+    teleportsLCD->setPalette( pal );
+    teleportsLCD->setFixedHeight( 20 );
+    hbd->addWidget( teleportsLCD );
+
+    hbd->addSpacing( 10 );
+*/
+    QPixmap pm( sprites_prefix + "powerups/brake.png" );
+    label = new QLabel( mainWin );
+    label->setPixmap( pm );
+    label->setFixedWidth( label->sizeHint().width() );
+    label->setPalette( pal );
+    hbd->addWidget( label );
+
+    brakesLCD = new QLCDNumber( 1, mainWin );
+    brakesLCD->setFrameStyle( Q3Frame::NoFrame );
+    brakesLCD->setSegmentStyle( QLCDNumber::Flat );
+    brakesLCD->setPalette( pal );
+    brakesLCD->setFixedHeight( 20 );
+    hbd->addWidget( brakesLCD );
+
+    hbd->addSpacing( 10 );
+
+    pm.load( sprites_prefix + "powerups/shield.png" );
+    label = new QLabel( mainWin );
+    label->setPixmap( pm );
+    label->setFixedWidth( label->sizeHint().width() );
+    label->setPalette( pal );
+    hbd->addWidget( label );
+
+    shieldLCD = new QLCDNumber( 1, mainWin );
+    shieldLCD->setFrameStyle( Q3Frame::NoFrame );
+    shieldLCD->setSegmentStyle( QLCDNumber::Flat );
+    shieldLCD->setPalette( pal );
+    shieldLCD->setFixedHeight( 20 );
+    hbd->addWidget( shieldLCD );
+
+    hbd->addSpacing( 10 );
+
+    pm.load( sprites_prefix + "powerups/shoot.png" );
+    label = new QLabel( mainWin );
+    label->setPixmap( pm );
+    label->setFixedWidth( label->sizeHint().width() );
+    label->setPalette( pal );
+    hbd->addWidget( label );
+
+    shootLCD = new QLCDNumber( 1, mainWin );
+    shootLCD->setFrameStyle( Q3Frame::NoFrame );
+    shootLCD->setSegmentStyle( QLCDNumber::Flat );
+    shootLCD->setPalette( pal );
+    shootLCD->setFixedHeight( 20 );
+    hbd->addWidget( shootLCD );
+
+    hbd->addStretch( 1 );
+
+    label = new QLabel( tr( "Fuel" ), mainWin );
+    label->setFont( smallFont );
+    label->setFixedWidth( label->sizeHint().width() + 10 );
+    label->setPalette( pal );
+    hbd->addWidget( label );
+
+    powerMeter = new KALedMeter( mainWin );
+    powerMeter->setFrameStyle( Q3Frame::Box | Q3Frame::Plain );
+    powerMeter->setRange( MAX_POWER_LEVEL );
+    powerMeter->addColorRange( 10, Qt::darkRed );
+    powerMeter->addColorRange( 20, QColor(160, 96, 0) );
+    powerMeter->addColorRange( 70, Qt::darkGreen );
+    powerMeter->setCount( 40 );
+    powerMeter->setPalette( pal );
+    powerMeter->setFixedSize( 200, 12 );
+    hbd->addWidget( powerMeter );
+
+    shipsRemain = 3;
+    showHiscores = FALSE;
+
+    actions.insert( Qt::Key_Up, Thrust );
+    actions.insert( Qt::Key_Left, RotateLeft );
+    actions.insert( Qt::Key_Right, RotateRight );
+    actions.insert( Qt::Key_Space, Shoot );
+    actions.insert( Qt::Key_Z, Teleport );
+    actions.insert( Qt::Key_X, Brake );
+    actions.insert( Qt::Key_S, Shield );
+    actions.insert( Qt::Key_P, Pause );
+    actions.insert( Qt::Key_L, Launch );
+    actions.insert( Qt::Key_N, NewGame );
+
+    view->showText( tr( "Press N to start playing" ), Qt::yellow );
+}
+
+KAstTopLevel::~KAstTopLevel()
+{
+}
+
+void KAstTopLevel::playSound( const char * )
+{
+}
+
+void KAstTopLevel::keyPressEvent( QKeyEvent *event )
+{
+    if ( event->isAutoRepeat() || !actions.contains( event->key() ) )
+    {
+        event->ignore();
+        return;
+    }
+
+    Action a = actions[ event->key() ];
+
+    switch ( a )
+    {
+        case RotateLeft:
+            view->rotateLeft( TRUE );
+            break;
+
+        case RotateRight:
+            view->rotateRight( TRUE );
+            break;
+
+        case Thrust:
+            view->thrust( TRUE );
+            break;
+
+        case Shoot:
+            view->shoot( TRUE );
+            break;
+
+        case Shield:
+            view->setShield( TRUE );
+            break;
+
+        case Teleport:
+            view->teleport( TRUE );
+            break;
+
+        case Brake:
+            view->brake( TRUE );
+            break;
+
+        default:
+            event->ignore();
+            return;
+    }
+    event->accept();
+}
+
+void KAstTopLevel::keyReleaseEvent( QKeyEvent *event )
+{
+    if ( event->isAutoRepeat() || !actions.contains( event->key() ) )
+    {
+        event->ignore();
+        return;
+    }
+
+    Action a = actions[ event->key() ];
+
+    switch ( a )
+    {
+        case RotateLeft:
+            view->rotateLeft( FALSE );
+            break;
+
+        case RotateRight:
+            view->rotateRight( FALSE );
+            break;
+
+        case Thrust:
+            view->thrust( FALSE );
+            break;
+
+        case Shoot:
+            view->shoot( FALSE );
+            break;
+
+        case Brake:
+            view->brake( FALSE );
+            break;
+
+        case Shield:
+            view->setShield( FALSE );
+            break;
+
+        case Teleport:
+            view->teleport( FALSE );
+            break;
+
+        case Launch:
+            if ( waitShip )
+            {
+                view->newShip();
+                waitShip = FALSE;
+                view->hideText();
+            }
+            else
+            {
+                event->ignore();
+                return;
+            }
+            break;
+
+	case NewGame:
+	    slotNewGame();
+	    break;
+/*
+        case Pause:
+            {
+                view->pause( TRUE );
+                QMessageBox::information( this,
+                                          tr("KAsteroids is paused"),
+                                          tr("Paused") );
+                view->pause( FALSE );
+            }
+            break;
+*/
+        default:
+            event->ignore();
+            return;
+    }
+
+    event->accept();
+}
+
+void KAstTopLevel::showEvent( QShowEvent *e )
+{
+    Q3MainWindow::showEvent( e );
+    view->pause( FALSE );
+    view->setFocus();
+}
+
+void KAstTopLevel::hideEvent( QHideEvent *e )
+{
+    Q3MainWindow::hideEvent( e );
+    view->pause( TRUE );
+}
+
+void KAstTopLevel::slotNewGame()
+{
+    score = 0;
+    shipsRemain = SB_SHIPS;
+    scoreLCD->display( 0 );
+    level = 0;
+    levelLCD->display( level+1 );
+    shipsLCD->display( shipsRemain-1 );
+    view->newGame();
+    view->setRockSpeed( levels[0].rockSpeed );
+    view->addRocks( levels[0].nrocks );
+//    view->showText( tr( "Press L to launch." ), yellow );
+    view->newShip();
+    waitShip = FALSE;
+    view->hideText();
+    isPaused = FALSE;
+}
+
+void KAstTopLevel::slotShipKilled()
+{
+    shipsRemain--;
+    shipsLCD->display( shipsRemain-1 );
+
+    playSound( "ShipDestroyed" );
+
+    if ( shipsRemain )
+    {
+        waitShip = TRUE;
+        view->showText( tr( "Ship Destroyed. Press L to launch."), Qt::yellow );
+    }
+    else
+    {
+        view->showText( tr("Game Over!"), Qt::red );
+        view->endGame();
+	doStats();
+//        highscore->addEntry( score, level, showHiscores );
+    }
+}
+
+void KAstTopLevel::slotRockHit( int size )
+{
+    switch ( size )
+    {
+	case 0:
+	    score += 10;
+	     break;
+
+	case 1:
+	    score += 20;
+	    break;
+
+	default:
+	    score += 40;
+      }
+
+    playSound( "RockDestroyed" );
+
+    scoreLCD->display( score );
+}
+
+void KAstTopLevel::slotRocksRemoved()
+{
+    level++;
+
+    if ( level >= MAX_LEVELS )
+	level = MAX_LEVELS - 1;
+
+    view->setRockSpeed( levels[level-1].rockSpeed );
+    view->addRocks( levels[level-1].nrocks );
+
+    levelLCD->display( level+1 );
+}
+
+void KAstTopLevel::doStats()
+{
+    QString r( "0.00" );
+    if ( view->shots() )
+	 r = QString::number( (double)view->hits() / view->shots() * 100.0,
+			     'g', 2 );
+
+/* multi-line text broken in Qt 3
+    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" )
+      .arg(view->shots()).arg(view->hits())
+      .arg(view->shots() - view->hits())
+      .arg(r);
+*/
+
+    view->showText( "Game Over.   Press N for a new game.", Qt::yellow, FALSE );
+}
+
+void KAstTopLevel::slotUpdateVitals()
+{
+    brakesLCD->display( view->brakeCount() );
+    shieldLCD->display( view->shieldCount() );
+    shootLCD->display( view->shootCount() );
+//    teleportsLCD->display( view->teleportCount() );
+    powerMeter->setValue( view->power() );
+}