-rw-r--r-- | noncore/games/sfcave/opie-sfcave.control | 8 | ||||
-rw-r--r-- | noncore/games/sfcave/sfcave.cpp | 421 | ||||
-rw-r--r-- | noncore/games/sfcave/sfcave.h | 76 | ||||
-rw-r--r-- | noncore/games/sfcave/sfcave.pro | 9 |
4 files changed, 514 insertions, 0 deletions
diff --git a/noncore/games/sfcave/opie-sfcave.control b/noncore/games/sfcave/opie-sfcave.control new file mode 100644 index 0000000..c97baad --- a/dev/null +++ b/noncore/games/sfcave/opie-sfcave.control @@ -0,0 +1,8 @@ +Files: bin/sfcavee apps/Games/sfcave.desktop pics/sfcave +Priority: optional +Section: opie/games +Maintainer: Andy Qua <andy.qua@blueyonder.co.uk> +Architecture: arm +Version: $QPE_VERSION-$SUB_VERSION +Depends: opie-base ($QPE_VERSION) +Description: SFCave for the Zaurus. Fly the dot though the cave avoiding the walls. diff --git a/noncore/games/sfcave/sfcave.cpp b/noncore/games/sfcave/sfcave.cpp new file mode 100644 index 0000000..931f393 --- a/dev/null +++ b/noncore/games/sfcave/sfcave.cpp @@ -0,0 +1,421 @@ +#include <stdio.h> +#include <stdlib.h> +#include <math.h> + +#ifdef QWS +#include <qpe/qpeapplication.h> +#else +#include <qapplication.h> +#endif + +#include "sfcave.h" + +#define CAPTION "SFCave 1.6 by AndyQ" +bool movel; + +int main( int argc, char *argv[] ) +{ + movel = true; + +#ifdef QWS + QPEApplication a( argc, argv ); +#else + QApplication a( argc, argv ); +#endif + + int speed = 3; + for ( int i = 0 ; i < argc ; ++i ) + { + if ( strcmp( argv[i], "-s" ) == 0 ) + { + if ( i+1 < argc ) + speed = atoi( argv[i+1] ); + } + } + + Main app( speed ); + a.setMainWidget( &app ); + app.show(); + app.start(); + a.exec(); +} + +Main :: Main( int spd, QWidget *w, char *name ) + : QMainWindow( w, name ) +{ +#ifdef QWS + showMaximized(); +#else + resize( 240, 284 ); +#endif + + sWidth = width(); + sHeight = height(); + segSize = sWidth/(MAPSIZE-1)+1; + +// printf( "width %d, height %d\n", sWidth, sHeight ); +// printf( "segSize = %d\n", segSize ); + + setCaption( CAPTION ); + + highestScore = 0; + speed = spd; // Change to 2 for PC + press = false; + + offscreen = new QPixmap( sWidth, sHeight ); + offscreen->fill( Qt::black ); + + setUp(); + crashLineLength = -1; + + gameTimer = new QTimer( this, "game timer" ); + connect( gameTimer, SIGNAL( timeout() ), + this, SLOT( run() ) ); +} + +Main :: ~Main() +{ +} + +void Main :: start() +{ + gameTimer->start( 10 ); + +} + +int Main :: nextInt( int range ) +{ + return rand() % range; +} + +void Main :: setUp() +{ + state = STATE_CRASHED; + prevState = STATE_CRASHED; + + score = 0; + offset = 0; + maxHeight = 50; + nrFrames = 0; + dir = 1; + thrust = 0; + crashLineLength = 0; + + user.setRect( 50, sWidth/2, 4, 4 ); + + blockWidth = 20; + blockHeight = 70; + + for ( int i = 0 ; i < TRAILSIZE ; ++i ) + { + trail[i].setX( -1 ); + trail[i].setY( 0 ); + } + + mapTop[0] = (int)(nextInt(50)) + 5; + for ( int i = 1 ; i < MAPSIZE ; ++i ) + setPoint( i ); + + for ( int i = 0 ; i < BLOCKSIZE ; ++i ) + blocks[i].setY( -1 ); +} + +void Main :: run() +{ + //running = true; + //setUp(); + switch ( state ) + { + case STATE_NEWGAME: + setUp(); + draw(); + state = STATE_RUNNING; + break; + case STATE_BOSS: + drawBoss(); + break; + + case STATE_CRASHED: + draw(); + break; + + case STATE_RUNNING: + { + if ( nrFrames % 5 == 0 ) + score ++; + if ( nrFrames % 2 == 0 ) + handleKeys(); + + if ( ++nrFrames % 500 == 0 ) + { + if ( maxHeight < sHeight - 100 ) + { + maxHeight += 10; + + // Reduce block height + if ( maxHeight > sHeight - 150 ) + blockHeight -= 5; + } + } + + if ( nrFrames % 100 == 0 ) + addBlock(); + + // if ( false ) + if ( checkCollision() ) + { + if ( score > highestScore ) + highestScore = score; + + state = STATE_CRASHED; + } + else + { + if ( movel ) + moveLandscape(); + //movel = false; + } + + draw(); + break; + } + } +} + +bool Main :: checkCollision() +{ + if ( (user.y() + user.width()) >= mapBottom[10] || user.y() <= mapTop[10] ) + return true; + + for ( int i = 0 ; i < BLOCKSIZE ; ++i ) + { + if ( blocks[i].y() != -1 ) + { + if ( blocks[i].intersects( user ) ) + return true; + } + } + return false; +} + +void Main :: moveLandscape() +{ + offset++; + + if ( offset >= segSize ) + { + offset = 0; + for ( int i = 0 ; i < MAPSIZE-speed ; ++i ) + { + mapTop[i] = mapTop[i+speed]; + mapBottom[i] = mapBottom[i+speed]; + } + + for ( int i = speed ; i > 0 ; --i ) + setPoint( MAPSIZE-i ); + } + + for ( int i = 0 ; i < BLOCKSIZE ; ++i ) + { + if ( blocks[i].y() != -1 ) + { + blocks[i].moveBy( -speed, 0 ); + if ( blocks[i].x() + blocks[i].width() < 0 ) + blocks[i].setY( -1 ); + } + } +} + +void Main :: addBlock() +{ + for ( int i = 0 ; i < BLOCKSIZE ; ++i ) + { + if ( blocks[i].y() == -1 ) + { + int x = sWidth; + + int y = mapTop[50] + (int)(nextInt(mapBottom[50] - mapTop[50] - blockHeight)); + + blocks[i].setRect( x, y, blockWidth, blockHeight ); +// printf( "Added block @ %d %d\n", x, y ); +// printf( "mapTop = %d, mapBottom = %d", mapTop[50], mapBottom[50] ); + + + break; + } + } +} + +void Main :: setPoint( int point ) +{ + if ( nextInt(100) >= 80 ) + dir *= -1; + + mapTop[point] = mapTop[point-1] + (dir * nextInt( 5 ) ); + if ( mapTop[point] < 0 ) + { + mapTop[point] = 0; + dir *= -1; + } + else if ( mapTop[point] >= maxHeight ) + { + mapTop[point] = maxHeight; + dir *= -1; + } + + mapBottom[point] = sHeight - (maxHeight - mapBottom[point]); + mapBottom[point] = sHeight - (maxHeight - mapTop[point]); +} + +void Main :: drawBoss() +{ + offscreen->fill( Qt::black ); + + bitBlt( this, 0, 0, offscreen, 0, 0, sWidth, sHeight, Qt::CopyROP, true ); +} + +void Main :: draw() +{ + //printf( "Paint\n" ); + offscreen->fill( Qt::black ); + + QPainter p( offscreen ); + p.setPen( Qt::white ); + + for ( int i = 0 ; i < MAPSIZE -3; ++i ) + { + p.drawLine( (i*segSize) - (offset*speed), mapTop[i], ((i+1)*segSize)-(offset*speed), mapTop[i+1] ); + p.drawLine( (i*segSize) - (offset*speed), mapBottom[i], ((i+1)*segSize)-(offset*speed), mapBottom[i+1] ); + } + + // Draw user + p.drawRect( user ); + + // Draw trails + for ( int i = 0 ; i < TRAILSIZE ; ++i ) + if ( trail[i].x() >= 0 ) + p.drawRect( trail[i].x(), trail[i].y(), 2, 2 ); + + // Draw blocks + for ( int i = 0 ; i < BLOCKSIZE ; ++i ) + if ( blocks[i].y() != -1 ) + { + p.fillRect( blocks[i], Qt::black ); + p.drawRect( blocks[i] ); + } + + // draw score + QString s; + s.sprintf( "score %06d high score %06d", score, highestScore ); + p.drawText( 5, 10, s ); + + + if ( state == STATE_CRASHED ) + { + // add next crash line + + if ( crashLineLength != -1 ) + { + for ( int i = 0 ; i < 36 ; ++i ) + { + int x = (int)(user.x() + (crashLineLength+nextInt(10)) * cos( (M_PI/180) * (10.0 * i) ) ); + int y = (int)(user.y() + (crashLineLength+nextInt(10)) * sin( (M_PI/180) * (10.0 * i) ) ); p.drawLine( user.x(), user.y(), x, y ); + } + } + + if ( crashLineLength >= 15 || crashLineLength == -1 ) + p.drawText( 70, 140, QString( "Press down to start" ) ); + else + crashLineLength ++; + } + + p.end(); + bitBlt( this, 0, 0, offscreen, 0, 0, sWidth, sHeight, Qt::CopyROP, true ); + //printf( "endpaint\n" ); +} + +void Main :: handleKeys() +{ + // Find enpty trail and move others + bool done = false; + for ( int i = 0 ; i < TRAILSIZE ; ++i ) + { + if ( trail[i].x() < 0 ) + { + if ( !done ) + { + trail[i].setX( user.x() - 5 ); + trail[i].setY( user.y() ); + done = true; + } + } + else + { + trail[i].setX( trail[i].x() - (2) ); + } + } + + if ( speed <= 3 ) + { + if ( press ) + thrust -= 0.6; + else + thrust += 0.8; + + if ( thrust > 4.0 ) + thrust = 4.0; + else if ( thrust < -3.5 ) + thrust = -3.5; + } + else + { + if ( press ) + thrust -= 0.5; + else + thrust += 0.8; + + if ( thrust > 5.0 ) + thrust = 5.0; + else if ( thrust < -3.5 ) + thrust = -3.5; + } + user.moveBy( 0, (int)thrust ); +} + +void Main :: keyPressEvent( QKeyEvent *e ) +{ + switch( e->key() ) + { + case Qt::Key_Up: + case Qt::Key_F9: + case Qt::Key_Space: + press = true; + break; + default: + e->ignore(); + break; + } +} + +void Main :: keyReleaseEvent( QKeyEvent *e ) +{ + switch( e->key() ) + { + case Qt::Key_Up: + case Qt::Key_F9: + case Qt::Key_Space: + press = false; + break; + case Qt::Key_R: + case Qt::Key_Down: + if ( state == STATE_CRASHED && crashLineLength >= 15 || crashLineLength == -1 ) + { + state = STATE_NEWGAME; + } + else + movel = true; + default: + e->ignore(); + break; + } +} diff --git a/noncore/games/sfcave/sfcave.h b/noncore/games/sfcave/sfcave.h new file mode 100644 index 0000000..18eeef9 --- a/dev/null +++ b/noncore/games/sfcave/sfcave.h @@ -0,0 +1,76 @@ +#include <qmainwindow.h> +#include <qpainter.h> +#include <qpixmap.h> +#include <qpoint.h> +#include <qrect.h> +#include <qtimer.h> + + + +#define MAPSIZE 52 +#define BLOCKSIZE 5 +#define TRAILSIZE 30 + +#define STATE_BOSS 0 +#define STATE_RUNNING 1 +#define STATE_CRASHED 2 +#define STATE_NEWGAME 3 + +class Main : public QMainWindow +{ +Q_OBJECT + +public: + int sWidth; + int sHeight; + int segSize; + + int blockWidth; + int blockHeight; + int state; + int prevState; + int speed; + int crashLineLength; + + QPixmap *offscreen; + QTimer *gameTimer; + + int score; + int highestScore; + + int mapTop[52]; + int mapBottom[52]; + QRect blocks[5]; + QRect user; + QPoint trail[30]; + + int offset; + int maxHeight; + int nrFrames; + int dir; + + bool bossMode; + + bool press; + double thrust; + bool running; + + Main( int speed = 3, QWidget *p = 0, char *name = 0 ); + ~Main(); + void start(); + int nextInt( int range ); + void setUp(); + bool checkCollision(); + void moveLandscape(); + void addBlock(); + void setPoint( int point ); + void drawBoss(); + void draw(); + void handleKeys(); + + void keyPressEvent( QKeyEvent *e ); + void keyReleaseEvent( QKeyEvent *e ); + +private slots: + void run(); +}; diff --git a/noncore/games/sfcave/sfcave.pro b/noncore/games/sfcave/sfcave.pro new file mode 100644 index 0000000..b1c96b6 --- a/dev/null +++ b/noncore/games/sfcave/sfcave.pro @@ -0,0 +1,9 @@ +TEMPLATE = app +CONFIG += qt warn_on release +DESTDIR = $(OPIEDIR)/bin +SOURCES = sfcave.cpp +HEADERS = sfcave.h +TARGET = sfcave +INCLUDEPATH += $(OPIEDIR)/include +DEPENDPATH += $(OPIEDIR)/include +LIBS += -lqpe |