source: trunk/examples/demo/qasteroids/toplevel.cpp@ 208

Last change on this file since 208 was 160, checked in by dmik, 19 years ago

Imported table and iconview modules and a bunch of dependent examples from the official release 3.3.1 from Trolltech.

  • Property svn:keywords set to Id
File size: 12.2 KB
Line 
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
23struct SLevel
24{
25 int nrocks;
26 double rockSpeed;
27};
28
29#define MAX_LEVELS 16
30
31SLevel 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
50const char *soundEvents[] =
51{
52 "ShipDestroyed",
53 "RockDestroyed",
54 0
55};
56
57const char *soundDefaults[] =
58{
59 "Explosion.wav",
60 "ploop.wav",
61 0
62};
63
64
65KAstTopLevel::KAstTopLevel( QWidget *parent, const char *name )
66 : QMainWindow( parent, name, 0 )
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
253KAstTopLevel::~KAstTopLevel()
254{
255}
256
257void KAstTopLevel::playSound( const char * )
258{
259}
260
261void 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
308void 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
384void KAstTopLevel::showEvent( QShowEvent *e )
385{
386 QMainWindow::showEvent( e );
387 view->pause( FALSE );
388 view->setFocus();
389}
390
391void KAstTopLevel::hideEvent( QHideEvent *e )
392{
393 QMainWindow::hideEvent( e );
394 view->pause( TRUE );
395}
396
397void KAstTopLevel::slotNewGame()
398{
399 score = 0;
400 shipsRemain = SB_SHIPS;
401 scoreLCD->display( 0 );
402 level = 0;
403 levelLCD->display( level+1 );
404 shipsLCD->display( shipsRemain-1 );
405 view->newGame();
406 view->setRockSpeed( levels[0].rockSpeed );
407 view->addRocks( levels[0].nrocks );
408// view->showText( tr( "Press L to launch." ), yellow );
409 view->newShip();
410 waitShip = FALSE;
411 view->hideText();
412 isPaused = FALSE;
413}
414
415void KAstTopLevel::slotShipKilled()
416{
417 shipsRemain--;
418 shipsLCD->display( shipsRemain-1 );
419
420 playSound( "ShipDestroyed" );
421
422 if ( shipsRemain )
423 {
424 waitShip = TRUE;
425 view->showText( tr( "Ship Destroyed. Press L to launch."), yellow );
426 }
427 else
428 {
429 view->showText( tr("Game Over!"), red );
430 view->endGame();
431 doStats();
432// highscore->addEntry( score, level, showHiscores );
433 }
434}
435
436void KAstTopLevel::slotRockHit( int size )
437{
438 switch ( size )
439 {
440 case 0:
441 score += 10;
442 break;
443
444 case 1:
445 score += 20;
446 break;
447
448 default:
449 score += 40;
450 }
451
452 playSound( "RockDestroyed" );
453
454 scoreLCD->display( score );
455}
456
457void KAstTopLevel::slotRocksRemoved()
458{
459 level++;
460
461 if ( level >= MAX_LEVELS )
462 level = MAX_LEVELS - 1;
463
464 view->setRockSpeed( levels[level-1].rockSpeed );
465 view->addRocks( levels[level-1].nrocks );
466
467 levelLCD->display( level+1 );
468}
469
470void KAstTopLevel::doStats()
471{
472 QString r( "0.00" );
473 if ( view->shots() )
474 r = QString::number( (double)view->hits() / view->shots() * 100.0,
475 'g', 2 );
476
477/* multi-line text broken in Qt 3
478 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" )
479 .arg(view->shots()).arg(view->hits())
480 .arg(view->shots() - view->hits())
481 .arg(r);
482*/
483
484 view->showText( "Game Over. Press N for a new game.", yellow, FALSE );
485}
486
487void KAstTopLevel::slotUpdateVitals()
488{
489 brakesLCD->display( view->brakeCount() );
490 shieldLCD->display( view->shieldCount() );
491 shootLCD->display( view->shootCount() );
492// teleportsLCD->display( view->teleportCount() );
493 powerMeter->setValue( view->power() );
494}
Note: See TracBrowser for help on using the repository browser.