Diffstat (limited to 'noncore/games/qasteroids/toplevel.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/games/qasteroids/toplevel.cpp | 514 |
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 | |||
43 | struct SLevel | ||
44 | { | ||
45 | int nrocks; | ||
46 | double rockSpeed; | ||
47 | }; | ||
48 | |||
49 | #define MAX_LEVELS16 | ||
50 | |||
51 | SLevel 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 | |||
70 | const char *soundEvents[] = | ||
71 | { | ||
72 | "ShipDestroyed", | ||
73 | "RockDestroyed", | ||
74 | 0 | ||
75 | }; | ||
76 | |||
77 | const char *soundDefaults[] = | ||
78 | { | ||
79 | "Explosion.wav", | ||
80 | "ploop.wav", | ||
81 | 0 | ||
82 | }; | ||
83 | |||
84 | |||
85 | KAstTopLevel::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 | |||
272 | KAstTopLevel::~KAstTopLevel() | ||
273 | { | ||
274 | } | ||
275 | |||
276 | void KAstTopLevel::playSound( const char * ) | ||
277 | { | ||
278 | } | ||
279 | |||
280 | void 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 | |||
327 | void 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 | |||
403 | void KAstTopLevel::showEvent( QShowEvent *e ) | ||
404 | { | ||
405 | QMainWindow::showEvent( e ); | ||
406 | view->pause( FALSE ); | ||
407 | setFocus(); | ||
408 | } | ||
409 | |||
410 | void KAstTopLevel::hideEvent( QHideEvent *e ) | ||
411 | { | ||
412 | QMainWindow::hideEvent( e ); | ||
413 | view->pause( TRUE ); | ||
414 | } | ||
415 | |||
416 | void KAstTopLevel::focusInEvent( QFocusEvent * ) | ||
417 | { | ||
418 | view->pause( FALSE ); | ||
419 | setFocus(); | ||
420 | } | ||
421 | |||
422 | void KAstTopLevel::focusOutEvent( QFocusEvent * ) | ||
423 | { | ||
424 | view->pause( TRUE ); | ||
425 | } | ||
426 | |||
427 | void 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 | |||
444 | void 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 | |||
463 | void 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 | |||
484 | void 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 | |||
497 | void 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 | |||
507 | void 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 | } | ||