version 1.2, 2009/04/03 02:48:21
|
version 1.6, 2009/04/22 03:54:22
|
Line 25
|
Line 25
|
/* |
/* |
* Set some basic definitions |
* Set some basic definitions |
*/ |
*/ |
#define VERSION "$Id$" |
#define VER "$Id$" |
#define TITLE "Froggix" |
#define TITLE "Froggix" |
#define SCREEN_WIDTH 640 |
#define SCREEN_WIDTH 640 |
#define SCREEN_HEIGHT 480 |
#define SCREEN_HEIGHT 480 |
Line 60
|
Line 60
|
#define SCORE_PINK 200 |
#define SCORE_PINK 200 |
#define SCORE_SECONDS 10 |
#define SCORE_SECONDS 10 |
#define HIGH_SCORE 4630 |
#define HIGH_SCORE 4630 |
#define SCORE_FREE_FROG 200 |
#define SCORE_FREE_FROG 2000 |
|
|
/* The green game timer */ |
/* The green game timer */ |
#define MAX_TIMER 350 |
#define MAX_TIMER 350 |
#define TIMER_SIZE 150 |
#define TIMER_SIZE 150 |
#define TIMER_COLOR 32, 211, 0 |
#define TIMER_COLOR 32, 211, 0 |
#define TIMER_LOW_COLOR 255, 0, 0 |
#define TIMER_LOW_COLOR 255, 0, 0 |
|
#define FLY_MAX_TIME 50 |
|
#define GATOR_MAX_TIME 70 |
|
|
/* baddies */ |
/* baddies */ |
#define VEHICLE 0 |
#define VEHICLE 0 |
Line 156 typedef struct {
|
Line 158 typedef struct {
|
int type; /* SHORT, MEDIUM, or LONG */ |
int type; /* SHORT, MEDIUM, or LONG */ |
int speed; /* What speed does the log move at */ |
int speed; /* What speed does the log move at */ |
int hasPink; // Is bonus frog riding |
int hasPink; // Is bonus frog riding |
|
int isGator; /* Are we a gator? if > 1 we have an open mouth */ |
|
|
SDL_Rect src; |
SDL_Rect src; |
} logObj; |
} logObj; |
Line 184 void beginGame( void );
|
Line 187 void beginGame( void );
|
int loadMedia( void ); |
int loadMedia( void ); |
int heartbeat( void ); |
int heartbeat( void ); |
int updateGameState( void ); |
int updateGameState( void ); |
|
void checkFly( void ); |
|
void checkGator( void ); |
void configGameScreen( void ); |
void configGameScreen( void ); |
void drawGameScreen( void ); |
void drawGameScreen( void ); |
void drawBackground( void ); |
void drawBackground( void ); |
Line 219 void drawImage(SDL_Surface *srcimg, int
|
Line 224 void drawImage(SDL_Surface *srcimg, int
|
void playSound( Mix_Chunk *sound ); |
void playSound( Mix_Chunk *sound ); |
void setFullScreenMode( void ); |
void setFullScreenMode( void ); |
|
|
|
int flyTimer = 0; |
|
int gatorTimer = 0; |
int level = 0; |
int level = 0; |
int playing = 0; |
int playing = 0; |
int lives = 0; |
int lives = 0; |
Line 331 int loadMedia( void ) {
|
Line 338 int loadMedia( void ) {
|
* Load frogger's textures and sounds |
* Load frogger's textures and sounds |
*/ |
*/ |
gfx = IMG_Load( "images/frogger.png" ); |
gfx = IMG_Load( "images/frogger.png" ); |
frogger.riding = FALSE; |
|
|
|
if ( gfx == NULL ) { |
if ( gfx == NULL ) { |
fprintf( stderr, "Error: 'images/frogger.bmp' could not be open: %s\n", SDL_GetError( ) ); |
fprintf( stderr, "Error: 'images/frogger.bmp' could not be open: %s\n", SDL_GetError( ) ); |
result--; |
result--; |
Line 453 int keyEvents( SDL_Event event ) {
|
Line 458 int keyEvents( SDL_Event event ) {
|
default: |
default: |
break; |
break; |
} |
} |
|
/* Uncomment for positioning debug information |
printf( "x,y,d => %i,%i,%i,%i\n", frogger.placement[X], |
printf( "x,y,d => %i,%i,%i,%i\n", frogger.placement[X], |
frogger.placement[Y], |
frogger.placement[Y], |
frogger.direction, |
frogger.direction, |
frogger.currentRow ); |
frogger.currentRow ); |
|
*/ |
} |
} |
/* Game over man, game over! */ |
/* Game over man, game over! */ |
if ( ! lives ) { |
if ( ! lives ) { |
Line 549 logObj setWood( int type, int speed, int
|
Line 556 logObj setWood( int type, int speed, int
|
tempWood.src.x = imgPixelSrc; |
tempWood.src.x = imgPixelSrc; |
tempWood.src.w = FRAME * tempWood.type; |
tempWood.src.w = FRAME * tempWood.type; |
tempWood.src.h = FRAME; |
tempWood.src.h = FRAME; |
|
tempWood.isGator = 0; |
|
|
return tempWood; |
return tempWood; |
} |
} |
Line 704 void configGameScreen( void ) {
|
Line 712 void configGameScreen( void ) {
|
rightBorderRect.w = SCREEN_WIDTH - RIGHT_SIDE; |
rightBorderRect.w = SCREEN_WIDTH - RIGHT_SIDE; |
rightBorderRect.h = SCREEN_HEIGHT; |
rightBorderRect.h = SCREEN_HEIGHT; |
|
|
|
/* |
|
* We reset the flyTimer since this may not be the first game played |
|
*/ |
|
flyTimer = 0; |
|
|
/* |
/* |
* Draw frogger in starting position |
* Draw frogger in starting position |
Line 747 void drawGameScreen( void ) {
|
Line 759 void drawGameScreen( void ) {
|
/* |
/* |
* Update and draw everthing else |
* Update and draw everthing else |
*/ |
*/ |
|
checkFly( ); |
|
checkGator( ); |
drawImage( background, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, screen, 0, 0, 255 ); |
drawImage( background, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, screen, 0, 0, 255 ); |
drawScore( 0, score ); |
drawScore( 0, score ); |
drawScore( 1, hScore ); |
drawScore( 1, hScore ); |
Line 797 int getRowPixel ( int row ) {
|
Line 811 int getRowPixel ( int row ) {
|
} |
} |
|
|
/* |
/* |
|
* Check our fly timers to determine if we need to display or |
|
* remove a fly from the goal area |
|
*/ |
|
void checkFly ( void ) { |
|
int i; |
|
|
|
for ( i = 0; i < MAX_GOALS; i++ ) { |
|
if ( goals[i].fly ) { |
|
goals[i].fly++; |
|
if ( goals[i].fly > FLY_MAX_TIME ) { |
|
goals[i].fly = 0; |
|
flyTimer = 0; |
|
} |
|
|
|
return; |
|
} |
|
} |
|
|
|
flyTimer++; |
|
|
|
if ( flyTimer > ( FLY_MAX_TIME ) ) { |
|
int randGoal = ( ( int ) timeLeft % 10 ); |
|
if ( ( goals[randGoal].gator == 0 ) && |
|
( goals[randGoal].occupied == 0 ) ) { |
|
printf( "Displaying fly in goal %i\n", randGoal ); |
|
goals[randGoal].fly = 1; |
|
} |
|
} |
|
|
|
return; |
|
} |
|
|
|
/* |
|
* Check our gator timers. Similiar to fly timers above, however, the gator |
|
* has an extra stage as it enters in to the goal area. |
|
*/ |
|
void checkGator ( void ) { |
|
int i; |
|
|
|
for( i = 0; i < MAX_GOALS; i++ ) { |
|
if ( goals[i].gator ) { |
|
goals[i].gator++; |
|
if ( goals[i].gator > GATOR_MAX_TIME ) { |
|
goals[i].gator = 0; |
|
gatorTimer = 0; |
|
} |
|
|
|
return; |
|
} |
|
} |
|
|
|
gatorTimer++; |
|
|
|
if ( gatorTimer > GATOR_MAX_TIME ) { |
|
int randGoal = ( ( int ) ( timeLeft * 2 ) % 10 ); |
|
if ( ( goals[randGoal].fly == 0 ) && |
|
( goals[randGoal].occupied == 0 ) ) { |
|
printf( "Displaying gator in goal %i\n", randGoal ); |
|
goals[randGoal].gator = 1; |
|
} |
|
} |
|
|
|
return; |
|
} |
|
|
|
/* |
* This does collision detection based on the row frogger |
* This does collision detection based on the row frogger |
* is in to help reduce overhead |
* is in to help reduce overhead |
*/ |
*/ |
Line 853 int collisionRow ( void ) {
|
Line 933 int collisionRow ( void ) {
|
if ( collideFrogger( goals[i].x, goals[i].y, goals[i].w, goals[i].h ) ) { |
if ( collideFrogger( goals[i].x, goals[i].y, goals[i].w, goals[i].h ) ) { |
if ( goals[i].occupied ) return 1; |
if ( goals[i].occupied ) return 1; |
goals[i].occupied++; |
goals[i].occupied++; |
|
if ( goals[i].fly ) { |
|
goals[i].fly = 0; |
|
flyTimer = 0; |
|
score += SCORE_FLY; |
|
} |
/* playSound( s_goal ); */ |
/* playSound( s_goal ); */ |
score += SCORE_GOAL; |
score += SCORE_GOAL; |
score += ( ( int ) ( timeLeft / 10 ) ) * 10; |
score += ( ( int ) ( timeLeft / 10 ) ) * 10; |
Line 978 void froggerReset ( void ) {
|
Line 1063 void froggerReset ( void ) {
|
* algorithm for calculating the distance and time |
* algorithm for calculating the distance and time |
*/ |
*/ |
void moveFrogger( void ) { |
void moveFrogger( void ) { |
int currentFrame = 0; |
|
int x = 0; |
int x = 0; |
int y = 0; |
int y = 0; |
int h = FRAME; |
int h = FRAME; |
int w = FRAME; |
int w = FRAME; |
int frameLow = HOP_SPEED / 3; |
|
int frameHigh = frameLow * 2; |
|
|
|
/* Determine which frame of frogger to display */ |
|
if ( ( frogger.hopCount >= frameLow ) && ( frogger.hopCount <= frameHigh ) ) |
|
currentFrame = FRAME; |
|
|
|
frogger.oldPlacement[Y] = frogger.placement[Y]; |
frogger.oldPlacement[Y] = frogger.placement[Y]; |
frogger.oldPlacement[X] = frogger.placement[X]; |
frogger.oldPlacement[X] = frogger.placement[X]; |
|
|
switch( frogger.direction ) { |
switch( frogger.direction ) { |
case UP: |
case UP: |
x = currentFrame; |
x = FRAME; |
frogger.placement[Y] -= ( HOP_DISTANCE / HOP_SPEED ); |
frogger.placement[Y] -= ( HOP_DISTANCE / HOP_SPEED ); |
break; |
break; |
case DOWN: |
case DOWN: |
x = currentFrame + ( 4 * FRAME ); |
x = ( 5 * FRAME ); |
frogger.placement[Y] += ( HOP_DISTANCE / HOP_SPEED ); |
frogger.placement[Y] += ( HOP_DISTANCE / HOP_SPEED ); |
break; |
break; |
case LEFT: |
case LEFT: |
x = currentFrame + ( 6 * FRAME ); |
x = ( 7 * FRAME ); |
frogger.placement[X] -= ( HOP_DISTANCE / HOP_SPEED ); |
frogger.placement[X] -= ( HOP_DISTANCE / HOP_SPEED ); |
break; |
break; |
case RIGHT: |
case RIGHT: |
x = currentFrame + ( 2 * FRAME ); |
x = ( 3 * FRAME ); |
frogger.placement[X] += ( HOP_DISTANCE / HOP_SPEED ); |
frogger.placement[X] += ( HOP_DISTANCE / HOP_SPEED ); |
break; |
break; |
} |
} |
Line 1037 void moveFrogger( void ) {
|
Line 1115 void moveFrogger( void ) {
|
frogger.direction = FALSE; |
frogger.direction = FALSE; |
score += SCORE_HOP; |
score += SCORE_HOP; |
lives += freeFrog( score ); |
lives += freeFrog( score ); |
|
frogger.src.x -= FRAME; |
} |
} |
} |
} |
|
|
Line 1192 void drawNumbers( int num, int x, int y
|
Line 1271 void drawNumbers( int num, int x, int y
|
void drawGoals( void ) { |
void drawGoals( void ) { |
int drawDebugRect = 0; |
int drawDebugRect = 0; |
int i; |
int i; |
|
|
for ( i = 0; i < MAX_GOALS; i++ ) { |
for ( i = 0; i < MAX_GOALS; i++ ) { |
if ( drawDebugRect ) { |
if ( drawDebugRect ) { |
SDL_Rect d; |
SDL_Rect d; |
Line 1207 void drawGoals( void ) {
|
Line 1286 void drawGoals( void ) {
|
if ( goals[i].occupied ) |
if ( goals[i].occupied ) |
drawImage( gfx, FRAME * 15, 0, FRAME, FRAME, |
drawImage( gfx, FRAME * 15, 0, FRAME, FRAME, |
screen, goals[i].x + 13, goals[i].y + 5, 255 ); |
screen, goals[i].x + 13, goals[i].y + 5, 255 ); |
|
if( goals[i].fly ) { |
|
drawImage( gfx, FRAME * 17, 0, FRAME, FRAME, |
|
screen, goals[i].x + 13, goals[i].y + 5, 255 ); |
|
} |
|
if( goals[i].gator ) { |
|
int frame = 18; |
|
int diff = 10; |
|
|
|
if ( goals[i].gator > ( ( int ) GATOR_MAX_TIME / 2 ) ) |
|
diff = 0; |
|
|
|
drawImage( gfx, FRAME * frame + diff, 0, FRAME, FRAME, |
|
screen, goals[i].x + 13, goals[i].y + 5, 255 ); |
|
} |
} |
} |
} |
} |
|
|