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