-rw-r--r-- | noncore/games/bounce/game.cpp | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/noncore/games/bounce/game.cpp b/noncore/games/bounce/game.cpp index bbd3d0b..5ef9f15 100644 --- a/noncore/games/bounce/game.cpp +++ b/noncore/games/bounce/game.cpp | |||
@@ -55,122 +55,122 @@ Arrow::Arrow(QCanvasPixmapArray* array, QCanvas* canvas) | |||
55 | } | 55 | } |
56 | 56 | ||
57 | void Arrow::update() | 57 | void Arrow::update() |
58 | { | 58 | { |
59 | if ( m_vertical ) | 59 | if ( m_vertical ) |
60 | setFrame( 0 ); | 60 | setFrame( 0 ); |
61 | else | 61 | else |
62 | setFrame( 1 ); | 62 | setFrame( 1 ); |
63 | } | 63 | } |
64 | 64 | ||
65 | void Arrow::changeDirection() | 65 | void Arrow::changeDirection() |
66 | { | 66 | { |
67 | m_vertical = ! m_vertical; | 67 | m_vertical = ! m_vertical; |
68 | update(); | 68 | update(); |
69 | } | 69 | } |
70 | 70 | ||
71 | 71 | ||
72 | Ball::Ball(QCanvasPixmapArray* array, QCanvas* canvas) | 72 | Ball::Ball(QCanvasPixmapArray* array, QCanvas* canvas) |
73 | : QCanvasSprite( array, canvas ), m_animDelay( 0 ), m_soundDelay( MS2TICKS(BALL_ANIM_DELAY)/2 ) | 73 | : QCanvasSprite( array, canvas ), m_animDelay( 0 ), m_soundDelay( MS2TICKS(BALL_ANIM_DELAY)/2 ) |
74 | { | 74 | { |
75 | } | 75 | } |
76 | 76 | ||
77 | void Ball::update() | 77 | void Ball::update() |
78 | { | 78 | { |
79 | m_animDelay--; | 79 | m_animDelay--; |
80 | if ( m_animDelay<=0 ) | 80 | if ( m_animDelay<=0 ) |
81 | { | 81 | { |
82 | m_animDelay = MS2TICKS(BALL_ANIM_DELAY); | 82 | m_animDelay = MS2TICKS(BALL_ANIM_DELAY); |
83 | int frameNum = frame(); | 83 | int frameNum = frame(); |
84 | frameNum++; | 84 | frameNum++; |
85 | if ( frameNum>=frameCount() ) | 85 | if ( frameNum>=frameCount() ) |
86 | frameNum = 0; | 86 | frameNum = 0; |
87 | setFrame( frameNum ); | 87 | setFrame( frameNum ); |
88 | } | 88 | } |
89 | } | 89 | } |
90 | 90 | ||
91 | void Ball::advance(int stage) | 91 | void Ball::advance(int stage) |
92 | { | 92 | { |
93 | bool reflectX = false; | 93 | bool reflectX = false; |
94 | bool reflectY = false; | 94 | bool reflectY = false; |
95 | 95 | ||
96 | // check for collisions | 96 | // check for collisions |
97 | if ( collide(xVelocity(), 0) ) reflectX = true; | 97 | if ( collide(xVelocity(), 0) ) reflectX = true; |
98 | if ( collide(0, yVelocity()) ) reflectY = true; | 98 | if ( collide(0, yVelocity()) ) reflectY = true; |
99 | if ( !reflectX && !reflectY && collide(xVelocity(), yVelocity()) ) reflectX = reflectY = true; | 99 | if ( !reflectX && !reflectY && collide(xVelocity(), yVelocity()) ) reflectX = reflectY = true; |
100 | 100 | ||
101 | // emit collision | 101 | // emit collision |
102 | QRect r = boundingRect(); | 102 | QRect r = boundingRect(); |
103 | r.moveBy( xVelocity(), yVelocity() ); | 103 | r.moveBy( static_cast<int>(xVelocity()), static_cast<int>( yVelocity() ) ); |
104 | JezzField* field = (JezzField *)canvas(); | 104 | JezzField* field = (JezzField *)canvas(); |
105 | 105 | ||
106 | int ul = field->tile( r.left() / TILE_SIZE, r.top() / TILE_SIZE ); | 106 | int ul = field->tile( r.left() / TILE_SIZE, r.top() / TILE_SIZE ); |
107 | int ur = field->tile( r.right() / TILE_SIZE, r.top() / TILE_SIZE ); | 107 | int ur = field->tile( r.right() / TILE_SIZE, r.top() / TILE_SIZE ); |
108 | int bl = field->tile( r.left() / TILE_SIZE, r.bottom() / TILE_SIZE ); | 108 | int bl = field->tile( r.left() / TILE_SIZE, r.bottom() / TILE_SIZE ); |
109 | int br = field->tile( r.right() / TILE_SIZE, r.bottom() / TILE_SIZE ); | 109 | int br = field->tile( r.right() / TILE_SIZE, r.bottom() / TILE_SIZE ); |
110 | 110 | ||
111 | if ( ul!=TILE_FREE ) field->emitBallCollisiton( this, r.left() / TILE_SIZE, r.top() / TILE_SIZE, ul ); else | 111 | if ( ul!=TILE_FREE ) field->emitBallCollisiton( this, r.left() / TILE_SIZE, r.top() / TILE_SIZE, ul ); else |
112 | if ( ur!=TILE_FREE ) field->emitBallCollisiton( this, r.right() / TILE_SIZE, r.top() / TILE_SIZE, ur ); else | 112 | if ( ur!=TILE_FREE ) field->emitBallCollisiton( this, r.right() / TILE_SIZE, r.top() / TILE_SIZE, ur ); else |
113 | if ( bl!=TILE_FREE ) field->emitBallCollisiton( this, r.left() / TILE_SIZE, r.bottom() / TILE_SIZE, bl ); else | 113 | if ( bl!=TILE_FREE ) field->emitBallCollisiton( this, r.left() / TILE_SIZE, r.bottom() / TILE_SIZE, bl ); else |
114 | if ( br!=TILE_FREE ) field->emitBallCollisiton( this, r.right() / TILE_SIZE, r.bottom() / TILE_SIZE, br ); | 114 | if ( br!=TILE_FREE ) field->emitBallCollisiton( this, r.right() / TILE_SIZE, r.bottom() / TILE_SIZE, br ); |
115 | 115 | ||
116 | // apply reflection | 116 | // apply reflection |
117 | if ( reflectX ) setXVelocity( -xVelocity() ); | 117 | if ( reflectX ) setXVelocity( -xVelocity() ); |
118 | if ( reflectY ) setYVelocity( -yVelocity() ); | 118 | if ( reflectY ) setYVelocity( -yVelocity() ); |
119 | 119 | ||
120 | // update field | 120 | // update field |
121 | update(); | 121 | update(); |
122 | QCanvasSprite::advance( stage ); | 122 | QCanvasSprite::advance( stage ); |
123 | } | 123 | } |
124 | 124 | ||
125 | bool Ball::collide( double dx, double dy ) | 125 | bool Ball::collide( double dx, double dy ) |
126 | { | 126 | { |
127 | QRect r = boundingRect(); | 127 | QRect r = boundingRect(); |
128 | r.moveBy( dx, dy ); | 128 | r.moveBy( static_cast<int>( dx ), static_cast<int>( dy ) ); |
129 | JezzField* field = (JezzField *)canvas(); | 129 | JezzField* field = (JezzField *)canvas(); |
130 | 130 | ||
131 | int ul = field->tile( r.left() / TILE_SIZE, r.top() / TILE_SIZE ); | 131 | int ul = field->tile( r.left() / TILE_SIZE, r.top() / TILE_SIZE ); |
132 | int ur = field->tile( r.right() / TILE_SIZE, r.top() / TILE_SIZE ); | 132 | int ur = field->tile( r.right() / TILE_SIZE, r.top() / TILE_SIZE ); |
133 | int bl = field->tile( r.left() / TILE_SIZE, r.bottom() / TILE_SIZE ); | 133 | int bl = field->tile( r.left() / TILE_SIZE, r.bottom() / TILE_SIZE ); |
134 | int br = field->tile( r.right() / TILE_SIZE, r.bottom() / TILE_SIZE ); | 134 | int br = field->tile( r.right() / TILE_SIZE, r.bottom() / TILE_SIZE ); |
135 | 135 | ||
136 | return ( ul!=TILE_FREE || ur!=TILE_FREE || bl!=TILE_FREE || br!=TILE_FREE ); | 136 | return ( ul!=TILE_FREE || ur!=TILE_FREE || bl!=TILE_FREE || br!=TILE_FREE ); |
137 | } | 137 | } |
138 | 138 | ||
139 | /*************************************************************************/ | 139 | /*************************************************************************/ |
140 | 140 | ||
141 | Wall::Wall( JezzField *field, int x, int y, Direction dir, int tile, QObject *parent, const char *name ) | 141 | Wall::Wall( JezzField *field, int x, int y, Direction dir, int tile, QObject *parent, const char *name ) |
142 | : QObject( parent, name ), m_dir( dir ), m_field( field ), m_startX( x ), m_startY( y ), | 142 | : QObject( parent, name ), m_dir( dir ), m_field( field ), m_startX( x ), m_startY( y ), |
143 | m_tile( tile ), m_delay( MS2TICKS(WALL_DELAY)/2 ), m_active( true ) | 143 | m_tile( tile ), m_delay( MS2TICKS(WALL_DELAY)/2 ), m_active( true ) |
144 | { | 144 | { |
145 | // setup position and direction | 145 | // setup position and direction |
146 | m_dx = 0; | 146 | m_dx = 0; |
147 | m_dy = 0; | 147 | m_dy = 0; |
148 | switch ( m_dir ) | 148 | switch ( m_dir ) |
149 | { | 149 | { |
150 | case Up: m_dy = -1; break; | 150 | case Up: m_dy = -1; break; |
151 | case Down: m_dy = 1; break; | 151 | case Down: m_dy = 1; break; |
152 | case Left: m_dx = -1; break; | 152 | case Left: m_dx = -1; break; |
153 | case Right: m_dx = 1; break; | 153 | case Right: m_dx = 1; break; |
154 | } | 154 | } |
155 | 155 | ||
156 | m_x = m_startX; | 156 | m_x = m_startX; |
157 | m_y = m_startY; | 157 | m_y = m_startY; |
158 | 158 | ||
159 | m_field->setTile( m_x, m_y, m_tile ); | 159 | m_field->setTile( m_x, m_y, m_tile ); |
160 | } | 160 | } |
161 | 161 | ||
162 | void Wall::finish() | 162 | void Wall::finish() |
163 | { | 163 | { |
164 | m_active = false; | 164 | m_active = false; |
165 | } | 165 | } |
166 | 166 | ||
167 | bool Wall::isFree( int x, int y ) | 167 | bool Wall::isFree( int x, int y ) |
168 | { | 168 | { |
169 | if ( m_field->tile(x, y)==TILE_FREE ) | 169 | if ( m_field->tile(x, y)==TILE_FREE ) |
170 | { | 170 | { |
171 | // check whether there is a ball at the moment | 171 | // check whether there is a ball at the moment |
172 | QCanvasItemList cols = m_field->collisions( QRect(x*TILE_SIZE, y*TILE_SIZE, | 172 | QCanvasItemList cols = m_field->collisions( QRect(x*TILE_SIZE, y*TILE_SIZE, |
173 | TILE_SIZE, TILE_SIZE) ); | 173 | TILE_SIZE, TILE_SIZE) ); |
174 | if ( cols.count()==0 ) | 174 | if ( cols.count()==0 ) |
175 | return true; | 175 | return true; |
176 | } | 176 | } |
@@ -368,97 +368,98 @@ JezzGame::~JezzGame() | |||
368 | { | 368 | { |
369 | m_balls.clear(); | 369 | m_balls.clear(); |
370 | delete m_view; | 370 | delete m_view; |
371 | delete m_field; | 371 | delete m_field; |
372 | delete m_ballPixmaps; | 372 | delete m_ballPixmaps; |
373 | } | 373 | } |
374 | 374 | ||
375 | void JezzGame::display( QString text, int size ) | 375 | void JezzGame::display( QString text, int size ) |
376 | { | 376 | { |
377 | odebug << "This function \"display\" shouldn't be called!!!" << oendl; | 377 | odebug << "This function \"display\" shouldn't be called!!!" << oendl; |
378 | if ( !text.isEmpty() ) | 378 | if ( !text.isEmpty() ) |
379 | { | 379 | { |
380 | QFont font( "Helvetica", size, QFont::Bold ); | 380 | QFont font( "Helvetica", size, QFont::Bold ); |
381 | font.setStyleHint( QFont::Helvetica ); | 381 | font.setStyleHint( QFont::Helvetica ); |
382 | m_text->setFont( font ); | 382 | m_text->setFont( font ); |
383 | m_text->setText( text ); | 383 | m_text->setText( text ); |
384 | 384 | ||
385 | QRect size = m_text->boundingRect(); | 385 | QRect size = m_text->boundingRect(); |
386 | m_text->move( ( FIELD_WIDTH*TILE_SIZE - size.width() ) / 2, | 386 | m_text->move( ( FIELD_WIDTH*TILE_SIZE - size.width() ) / 2, |
387 | ( FIELD_HEIGHT*TILE_SIZE - size.height() ) / 2 ); | 387 | ( FIELD_HEIGHT*TILE_SIZE - size.height() ) / 2 ); |
388 | 388 | ||
389 | m_text->show(); | 389 | m_text->show(); |
390 | } else | 390 | } else |
391 | { | 391 | { |
392 | m_text->hide(); | 392 | m_text->hide(); |
393 | } | 393 | } |
394 | } | 394 | } |
395 | 395 | ||
396 | void JezzGame::start() | 396 | void JezzGame::start() |
397 | { | 397 | { |
398 | m_running = true; | 398 | m_running = true; |
399 | } | 399 | } |
400 | 400 | ||
401 | void JezzGame::stop() | 401 | void JezzGame::stop() |
402 | { | 402 | { |
403 | m_running = false; | 403 | m_running = false; |
404 | } | 404 | } |
405 | 405 | ||
406 | 406 | ||
407 | void JezzGame::makeBlack() | 407 | void JezzGame::makeBlack() |
408 | { | 408 | { |
409 | // copy current field into buffer | 409 | // copy current field into buffer |
410 | for ( int y=0; y<FIELD_HEIGHT; y++ ) | 410 | for ( int y=0; y<FIELD_HEIGHT; y++ ) |
411 | for ( int x=0; x<FIELD_WIDTH; x++ ) | 411 | for ( int x=0; x<FIELD_WIDTH; x++ ) |
412 | m_buf[x][y] = m_field->tile( x, y ); | 412 | m_buf[x][y] = m_field->tile( x, y ); |
413 | 413 | ||
414 | // fill areas that contains a ball | 414 | // fill areas that contains a ball |
415 | for ( Ball *ball=m_balls.first(); ball!=0; ball=m_balls.next() ) | 415 | for ( Ball *ball=m_balls.first(); ball!=0; ball=m_balls.next() ) |
416 | fill( ball->x()/TILE_SIZE, ball->y()/TILE_SIZE ); | 416 | fill( static_cast<int>( ball->x()/TILE_SIZE ), |
417 | static_cast<int>( ball->y()/TILE_SIZE ) ); | ||
417 | 418 | ||
418 | // areas still free can be blacked now | 419 | // areas still free can be blacked now |
419 | for ( int y=0; y<FIELD_HEIGHT; y++ ) | 420 | for ( int y=0; y<FIELD_HEIGHT; y++ ) |
420 | for ( int x=0; x<FIELD_WIDTH; x++ ) | 421 | for ( int x=0; x<FIELD_WIDTH; x++ ) |
421 | { | 422 | { |
422 | if ( m_buf[x][y]==TILE_FREE ) | 423 | if ( m_buf[x][y]==TILE_FREE ) |
423 | m_field->setGameTile( x, y, true ); | 424 | m_field->setGameTile( x, y, true ); |
424 | } | 425 | } |
425 | 426 | ||
426 | m_field->update(); | 427 | m_field->update(); |
427 | m_view->repaint(); | 428 | m_view->repaint(); |
428 | 429 | ||
429 | // count percent value of occupied area | 430 | // count percent value of occupied area |
430 | int p = percent(); | 431 | int p = percent(); |
431 | if ( p!=m_percent ) | 432 | if ( p!=m_percent ) |
432 | { | 433 | { |
433 | m_percent = p; | 434 | m_percent = p; |
434 | emit newPercent( m_percent ); | 435 | emit newPercent( m_percent ); |
435 | } | 436 | } |
436 | } | 437 | } |
437 | 438 | ||
438 | int JezzGame::percent() | 439 | int JezzGame::percent() |
439 | { | 440 | { |
440 | int notFree = 0; | 441 | int notFree = 0; |
441 | for ( int y=1; y<FIELD_HEIGHT-1; y++ ) | 442 | for ( int y=1; y<FIELD_HEIGHT-1; y++ ) |
442 | for ( int x=1; x<FIELD_WIDTH-1; x++ ) | 443 | for ( int x=1; x<FIELD_WIDTH-1; x++ ) |
443 | { | 444 | { |
444 | if ( m_field->tile(x,y)!=TILE_FREE ) | 445 | if ( m_field->tile(x,y)!=TILE_FREE ) |
445 | notFree++; | 446 | notFree++; |
446 | } | 447 | } |
447 | 448 | ||
448 | return 100 * notFree / ( (FIELD_WIDTH-1) * (FIELD_HEIGHT-1) ); | 449 | return 100 * notFree / ( (FIELD_WIDTH-1) * (FIELD_HEIGHT-1) ); |
449 | } | 450 | } |
450 | 451 | ||
451 | void JezzGame::fill( int x, int y ) | 452 | void JezzGame::fill( int x, int y ) |
452 | { | 453 | { |
453 | if ( m_buf[x][y]!=TILE_FREE) return; | 454 | if ( m_buf[x][y]!=TILE_FREE) return; |
454 | 455 | ||
455 | // go left | 456 | // go left |
456 | int _x=x; | 457 | int _x=x; |
457 | for ( ; m_buf[_x][y]==TILE_FREE; _x-- ) | 458 | for ( ; m_buf[_x][y]==TILE_FREE; _x-- ) |
458 | m_buf[_x][y] = TILE_BORDER; | 459 | m_buf[_x][y] = TILE_BORDER; |
459 | int stopx = _x; | 460 | int stopx = _x; |
460 | 461 | ||
461 | // fill above | 462 | // fill above |
462 | for ( _x=x; _x>stopx; _x-- ) | 463 | for ( _x=x; _x>stopx; _x-- ) |
463 | if ( m_buf[_x][y-1]==TILE_FREE ) fill( _x, y-1 ); | 464 | if ( m_buf[_x][y-1]==TILE_FREE ) fill( _x, y-1 ); |
464 | 465 | ||