summaryrefslogtreecommitdiff
path: root/noncore/games/bounce/game.cpp
Unidiff
Diffstat (limited to 'noncore/games/bounce/game.cpp') (more/less context) (show whitespace changes)
-rw-r--r--noncore/games/bounce/game.cpp7
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
57void Arrow::update() 57void 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
65void Arrow::changeDirection() 65void Arrow::changeDirection()
66{ 66{
67 m_vertical = ! m_vertical; 67 m_vertical = ! m_vertical;
68 update(); 68 update();
69} 69}
70 70
71 71
72Ball::Ball(QCanvasPixmapArray* array, QCanvas* canvas) 72Ball::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
77void Ball::update() 77void 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
91void Ball::advance(int stage) 91void 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
125bool Ball::collide( double dx, double dy ) 125bool 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
141Wall::Wall( JezzField *field, int x, int y, Direction dir, int tile, QObject *parent, const char *name ) 141Wall::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
162void Wall::finish() 162void Wall::finish()
163{ 163{
164 m_active = false; 164 m_active = false;
165} 165}
166 166
167bool Wall::isFree( int x, int y ) 167bool 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
375void JezzGame::display( QString text, int size ) 375void 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
396void JezzGame::start() 396void JezzGame::start()
397{ 397{
398 m_running = true; 398 m_running = true;
399} 399}
400 400
401void JezzGame::stop() 401void JezzGame::stop()
402{ 402{
403 m_running = false; 403 m_running = false;
404} 404}
405 405
406 406
407void JezzGame::makeBlack() 407void 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
438int JezzGame::percent() 439int 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
451void JezzGame::fill( int x, int y ) 452void 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