Diffstat (limited to 'noncore/games/bounce/game.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/games/bounce/game.cpp | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/noncore/games/bounce/game.cpp b/noncore/games/bounce/game.cpp index c07f453..1f1f8cd 100644 --- a/noncore/games/bounce/game.cpp +++ b/noncore/games/bounce/game.cpp @@ -228,199 +228,199 @@ void Wall::fill( bool black ) } /*************************************************************************/ JezzField::JezzField( QPixmap tiles, QObject* parent, const char* name ) : QCanvas( parent, name ), m_tiles( tiles ) { setPixmaps( tiles ); } void JezzField::setGameTile( int x, int y, bool black ) { setTile( x, y, black ? TILE_BORDER : TILE_FREE ); } void JezzField::setPixmaps( QPixmap tiles ) { // create new tiles QPixmap allTiles( TILE_SIZE*(FIELD_WIDTH-2), TILE_SIZE*(FIELD_HEIGHT-1) ); // handle default tiles bitBlt( &allTiles, 0, TILE_SIZE*(FIELD_HEIGHT-2), &tiles, 0, 0, tiles.width(), tiles.height() ); // load tiles into canvas setTiles( allTiles, FIELD_WIDTH, FIELD_HEIGHT, TILE_SIZE, TILE_SIZE ); } /*************************************************************************/ JezzView::JezzView(QCanvas* viewing, QWidget* parent, const char* name, WFlags f) : QCanvasView( viewing, parent, name, f ), m_vertical( false ) { setResizePolicy( AutoOne ); setHScrollBarMode( AlwaysOff ); setVScrollBarMode( AlwaysOff ); setCursor( sizeHorCursor ); } void JezzView::viewportMouseReleaseEvent( QMouseEvent *ev ) { if ( ev->button() & LeftButton ) { emit buildWall( ev->x()/TILE_SIZE, ev->y()/TILE_SIZE, m_vertical ); } } void JezzView::changeCursor() { m_vertical = !m_vertical; if ( m_vertical ) { setCursor( sizeVerCursor ); } else { setCursor( sizeHorCursor ); } } /*************************************************************************/ JezzGame::JezzGame( int ballNum, QWidget *parent, const char *name ) : QWidget( parent, name ), m_wall1( 0 ), m_wall2( 0 ), m_text( 0 ), m_running( false ), m_percent( 0 ), m_pictured( false ) { QString path = QPEApplication::qpeDir()+"pics/bounce/"; // load gfx m_ballPixmaps = new QCanvasPixmapArray( path + "ball%1.png", 25 ); for ( unsigned n=0; n < m_ballPixmaps->count(); n++ ) m_ballPixmaps->image(n)->setOffset( 0, 0 ); m_arrowPixmaps = new QCanvasPixmapArray( path + "arrow%1.png", 2 ); for ( unsigned n=0; n < m_arrowPixmaps->count(); n++ ) m_arrowPixmaps->image(n)->setOffset( 0, 0 ); QPixmap tiles( path + "tiles.png" ); // create field m_field = new JezzField( tiles, this, "m_field" ); m_field->resize( TILE_SIZE*FIELD_WIDTH, TILE_SIZE*FIELD_HEIGHT ); for ( int x=0; x<FIELD_WIDTH; x++ ) m_field->setTile( x, 0, TILE_BORDER ); for ( int y=1; y<FIELD_HEIGHT-1; y++ ) { m_field->setTile( 0, y, TILE_BORDER ); for ( int x=1; x<FIELD_WIDTH-1; x++ ) m_field->setTile( x, y, TILE_FREE ); m_field->setTile( FIELD_WIDTH-1, y, TILE_BORDER ); } for ( int x=0; x<FIELD_WIDTH; x++ ) m_field->setTile( x, FIELD_HEIGHT-1, TILE_BORDER ); - connect( m_field, SIGNAL(ballCollision(Ball *, int, int, int)), this, SLOT(ballCollision(Ball *, int, int, int)) ); + connect( m_field, SIGNAL(ballCollision(Ball*,int,int,int)), this, SLOT(ballCollision(Ball*,int,int,int)) ); // create view m_view = new JezzView( m_field, this, "m_view" ); m_view->move( 0, 0 ); m_view->adjustSize(); - connect( m_view, SIGNAL(buildWall(int, int, bool)), this, SLOT(buildWall(int, int, bool)) ); + connect( m_view, SIGNAL(buildWall(int,int,bool)), this, SLOT(buildWall(int,int,bool)) ); // create balls for ( int n=0; n<ballNum; n++ ) { Ball *ball = new Ball( m_ballPixmaps, m_field ); m_balls.append( ball ); ball->setVelocity( ((rand() & 1)*2-1)*2, ((rand() & 1)*2-1)*2 ); ball->setFrame( rand() % 25 ); ball->move( 4*TILE_SIZE + ( rand() - 50 ) % ( (FIELD_WIDTH-8)*TILE_SIZE ), 4*TILE_SIZE + rand() % ( (FIELD_HEIGHT-8)*TILE_SIZE ) ); ball->show(); } // create arrow arrow = new Arrow( m_arrowPixmaps, m_field ); arrow->show(); // create text label m_text = new QCanvasText( m_field ); // create game clock m_clock = new QTimer( this ); connect( m_clock, SIGNAL(timeout()), this, SLOT(tick()) ); m_clock->start( GAME_DELAY ); // setup geometry setFixedSize( m_view->size() ); } JezzGame::~JezzGame() { m_balls.clear(); delete m_view; delete m_field; delete m_ballPixmaps; } void JezzGame::display( QString text, int size ) { qDebug("This function \"display\" shouldn't be called!!!"); if ( !text.isEmpty() ) { QFont font( "Helvetica", size, QFont::Bold ); font.setStyleHint( QFont::Helvetica ); m_text->setFont( font ); m_text->setText( text ); QRect size = m_text->boundingRect(); m_text->move( ( FIELD_WIDTH*TILE_SIZE - size.width() ) / 2, ( FIELD_HEIGHT*TILE_SIZE - size.height() ) / 2 ); m_text->show(); } else { m_text->hide(); } } void JezzGame::start() { m_running = true; } void JezzGame::stop() { m_running = false; } void JezzGame::makeBlack() { // copy current field into buffer for ( int y=0; y<FIELD_HEIGHT; y++ ) for ( int x=0; x<FIELD_WIDTH; x++ ) m_buf[x][y] = m_field->tile( x, y ); // fill areas that contains a ball for ( Ball *ball=m_balls.first(); ball!=0; ball=m_balls.next() ) fill( ball->x()/TILE_SIZE, ball->y()/TILE_SIZE ); // areas still free can be blacked now for ( int y=0; y<FIELD_HEIGHT; y++ ) for ( int x=0; x<FIELD_WIDTH; x++ ) { if ( m_buf[x][y]==TILE_FREE ) m_field->setGameTile( x, y, true ); } m_field->update(); m_view->repaint(); // count percent value of occupied area int p = percent(); if ( p!=m_percent ) { m_percent = p; @@ -432,174 +432,174 @@ int JezzGame::percent() { int notFree = 0; for ( int y=1; y<FIELD_HEIGHT-1; y++ ) for ( int x=1; x<FIELD_WIDTH-1; x++ ) { if ( m_field->tile(x,y)!=TILE_FREE ) notFree++; } return 100 * notFree / ( (FIELD_WIDTH-1) * (FIELD_HEIGHT-1) ); } void JezzGame::fill( int x, int y ) { if ( m_buf[x][y]!=TILE_FREE) return; // go left int _x=x; for ( ; m_buf[_x][y]==TILE_FREE; _x-- ) m_buf[_x][y] = TILE_BORDER; int stopx = _x; // fill above for ( _x=x; _x>stopx; _x-- ) if ( m_buf[_x][y-1]==TILE_FREE ) fill( _x, y-1 ); // fill below for ( _x=x; _x>stopx; _x-- ) if ( m_buf[_x][y+1]==TILE_FREE ) fill( _x, y+1 ); // go right for ( _x=x+1; m_buf[_x][y]==TILE_FREE; _x++ ) m_buf[_x][y] = TILE_BORDER; stopx = _x; // fill above for ( _x=x+1; _x<stopx; _x++ ) if ( m_buf[_x][y-1]==TILE_FREE ) fill( _x, y-1 ); // fill below; for ( _x=x+1; _x<stopx; _x++ ) if ( m_buf[_x][y+1]==TILE_FREE ) fill( _x, y+1 ); } void JezzGame::ballCollision( Ball*, int, int, int tile ) { if ( tile!=TILE_BORDER && tile>TILE_FREE && tile!=TILE_WALLEND ) { // stop walls if ( (tile==TILE_WALLUP || tile==TILE_WALLLEFT) && m_wall1 ) { m_wall1->finish(); m_wall1->fill( false ); delete m_wall1; m_wall1 = 0; } if ( (tile==TILE_WALLDOWN || tile==TILE_WALLRIGHT) && m_wall2 ) { m_wall2->finish(); m_wall2->fill( false ); delete m_wall2; m_wall2 = 0; } // update view m_field->update(); m_view->repaint(); // send death msg emit died(); } } void JezzGame::buildWall( int x, int y, bool vertical ) { if ( !m_running ) return; if ( m_field->tile(x, y)==TILE_FREE ) { // check whether there is a ball at the moment QCanvasItemList cols = m_field->collisions( QRect(x*TILE_SIZE, y*TILE_SIZE, TILE_SIZE, TILE_SIZE) ); if ( cols.count()>0 ) { //kdDebug() << "Direct collision" << endl; emit ballCollision( (Ball*)cols.first(), x, y, TILE_WALLUP ); return; } // start walls if ( !m_wall1 ) { m_wall1 = new Wall( m_field, x, y, vertical? Wall::Up : Wall::Left, vertical? TILE_WALLUP : TILE_WALLLEFT, this, "m_wall1" ); - connect( m_wall1, SIGNAL(finished(Wall *, int)), - this, SLOT(wallFinished(Wall *, int)) ); } + connect( m_wall1, SIGNAL(finished(Wall*,int)), + this, SLOT(wallFinished(Wall*,int)) ); } if ( !m_wall2 ) { m_wall2 = new Wall( m_field, x, y, vertical? Wall::Down: Wall::Right, vertical? TILE_WALLDOWN : TILE_WALLRIGHT, this, "m_wall2" ); - connect( m_wall2, SIGNAL(finished(Wall *, int)), - this, SLOT(wallFinished(Wall *, int)) ); + connect( m_wall2, SIGNAL(finished(Wall*,int)), + this, SLOT(wallFinished(Wall*,int)) ); } } } void JezzGame::wallFinished( Wall *wall, int tile ) { if ( tile==TILE_WALLEND ) { if ( m_wall1 ) { m_wall1->fill( false ); delete m_wall1; m_wall1 = 0; } if ( m_wall2 ) { m_wall2->fill( false ); delete m_wall2; m_wall2 = 0; } } else { if ( m_wall1==wall && m_wall1 ) { m_wall1->fill( true ); delete m_wall1; m_wall1 = 0; } if ( m_wall2==wall && m_wall2 ) { m_wall2->fill( true ); delete m_wall2; m_wall2 = 0; } } m_field->update(); m_view->repaint(); makeBlack(); } void JezzGame::tick() { if ( m_running ) { if ( m_field ) m_field->advance(); if ( m_wall1 ) m_wall1->advance(); if ( m_wall2 ) m_wall2->advance(); } else { for ( Ball *ball=m_balls.first(); ball!=0; ball=m_balls.next() ) ball->update(); if ( m_field ) m_field->update(); if ( m_wall1 ) m_wall1->update(); if ( m_wall2 ) m_wall2->update(); } } void JezzGame::changeCursor() { arrow->changeDirection(); m_view->changeCursor(); } |