Annotation of talos/src/talos.c, revision 1.1

1.1     ! nick        1: /*
        !             2:  * Froggix 
        !             3:  *
        !             4:  * Nicholas DeClario 2009
        !             5:  * <nick@declario.com>
        !             6:  *
        !             7:  * This program is distributed under the GNU Public License
        !             8:  *   <Insert GNU license blurb here>
        !             9:  */
        !            10: 
        !            11: 
        !            12: /*
        !            13:  * Our pretty standard includes
        !            14:  */
        !            15: #include <stdio.h>
        !            16: #include <stdlib.h>
        !            17: #include <unistd.h>
        !            18: #include <time.h>
        !            19: 
        !            20: #include <SDL.h>
        !            21: #include <SDL_mixer.h>
        !            22: #include <SDL_image.h>
        !            23: #include <SDL_ttf.h>
        !            24: 
        !            25: /* 
        !            26:  * Set some basic definitions
        !            27:  */
        !            28: #define VER "$Id$";
        !            29: #define TITLE "Talos"
        !            30: #define SCREEN_WIDTH 640
        !            31: #define SCREEN_HEIGHT 480
        !            32: #define FALSE 0
        !            33: #define TRUE 1
        !            34: #define LIVES 3
        !            35: #define COLORKEY 255, 0, 255
        !            36: #define BGCOLOR 0, 0, 0
        !            37: #define TALOS_START_X 290
        !            38: #define TALOS_START_Y 425
        !            39: #define UP 1
        !            40: #define DOWN 2
        !            41: #define LEFT 3
        !            42: #define RIGHT 4
        !            43: #define X 0
        !            44: #define Y 1
        !            45: #define FRAME 24
        !            46: #define HFRAME 12
        !            47: 
        !            48: /* Point table */
        !            49: #define HIGH_SCORE 4630
        !            50: 
        !            51: /* baddies */
        !            52: #define VEHICLE 0
        !            53: #define LOG 1
        !            54: #define TURTLE 2
        !            55: #define GATOR 3
        !            56: #define SNAKE 4
        !            57: #define BEAVER 5
        !            58: 
        !            59: /* Turtles */
        !            60: #define DIVE_START_TIME 50
        !            61: #define DIVE_PHASE_TIME 20
        !            62: #define MAX_TURTLES 9
        !            63: #define TURTLE_ANIM_TIME 5
        !            64: 
        !            65: /* Vehicles */
        !            66: #define MAX_VEHICLES 40
        !            67: 
        !            68: 
        !            69: /*
        !            70:  * Froggers dstruct
        !            71:  */
        !            72: typedef struct {
        !            73:        int placement[2];
        !            74:        int oldPlacement[2];
        !            75:        int direction;
        !            76:        int location; 
        !            77:        int hopCount;
        !            78:        int currentRow;
        !            79:        int alive;
        !            80:        int riding;
        !            81:        int ridingIdx;
        !            82:        int ridingType;
        !            83:        int talos;      /* Are we talos or bonus talos */
        !            84:        int deathType;
        !            85:        int deathCount;
        !            86: 
        !            87:        SDL_Rect src;
        !            88:        SDL_Rect dst;
        !            89: 
        !            90:        Mix_Chunk *s_hop;
        !            91:        Mix_Chunk *s_squash;
        !            92:        Mix_Chunk *s_splash;
        !            93:        Mix_Chunk *s_extra;
        !            94: } talosObj;
        !            95: 
        !            96: /*
        !            97:  * Vehicles
        !            98:  */
        !            99: typedef struct {
        !           100:        int placement[2];
        !           101:        int oldPlacement[2];
        !           102:        int direction;  // LEFT or RIGHT
        !           103:        int row;        // row
        !           104:        int speed;      // How fast are we traveling
        !           105:        int level;      // Must be >= this level to display
        !           106:                
        !           107:        SDL_Rect src;
        !           108: } vehicleObj;
        !           109: 
        !           110: int keyEvents( SDL_Event event );
        !           111: int mySDLInit( void );
        !           112: void beginGame( void );
        !           113: int loadMedia( void );
        !           114: int heartbeat( void );
        !           115: int updateGameState( void );
        !           116: void checkFly( void );
        !           117: void checkGator( void );
        !           118: void configGameScreen( void );
        !           119: void drawGameScreen( void );
        !           120: void drawBackground( void );
        !           121: int getRowPixel ( int row );
        !           122: int collisionRow ( void );
        !           123: int freeFrog( int score );
        !           124: int collideFrogger ( int x, int y, int h, int w );
        !           125: void checkFroggerBorder( void );
        !           126: void levelUp( void );
        !           127: int checkGoals( void );
        !           128: void talosReset( void );
        !           129: void moveFrogger( void );
        !           130: void ridingFrogger( );
        !           131: void drawTitleScreen( void );
        !           132: void drawPauseScreen( void );
        !           133: void drawGameOver( void );
        !           134: int drawDeathSequence( int deathType );
        !           135: int checkTimer( void );
        !           136: void drawScore( int high, int score );
        !           137: void drawNumbers( int num, int x, int y );
        !           138: void drawGoals( void );
        !           139: void drawTimer( int length );
        !           140: void drawLives( int lives );
        !           141: void drawLevel( int level );
        !           142: void drawWood( void );
        !           143: void drawTurtles( void );
        !           144: void drawVehicles( void );
        !           145: void drawImage(SDL_Surface *srcimg, int sx, int sy, int sw, int sh, SDL_Surface *dstimg, int dx, int dy, int alpha );
        !           146: void playSound( Mix_Chunk *sound );
        !           147: void setFullScreenMode( void );
        !           148: 
        !           149: int flyTimer = 0;
        !           150: int gatorTimer = 0;
        !           151: int level = 0;
        !           152: int playing = 0;
        !           153: int lives = 0;
        !           154: int players = 0;
        !           155: int score = 0;
        !           156: int givenFreeFrog = 0;
        !           157: int hScore = HIGH_SCORE;
        !           158: int redraw_all = 0;
        !           159: int fullscreen = 0;
        !           160: int drawBG = 0;
        !           161: int goDelay;
        !           162: float timeLeft;
        !           163: talosObj talos;
        !           164: 
        !           165: Mix_Chunk  *s_freeFrog;
        !           166: SDL_Surface *gfx;
        !           167: SDL_Surface *background; // This is the talos back drop
        !           168: SDL_Rect backgroundRect;
        !           169: SDL_Surface *titleSurface; // Title 'Froggix' image
        !           170: SDL_Surface *screen; //This pointer will reference the backbuffer 
        !           171: SDL_Rect leftBorderRect;
        !           172: SDL_Rect rightBorderRect;
        !           173: TTF_Font *font;
        !           174: 
        !           175: int debugBorder = 0;
        !           176: 
        !           177: /*
        !           178:  * int mySDLInit(void);
        !           179:  *
        !           180:  * This starts the basic SDL initialization for everything we'll need
        !           181:  *     
        !           182:  */
        !           183: int mySDLInit( void ) {
        !           184:        int result = 1;
        !           185: 
        !           186:        if( SDL_Init( SDL_INIT_VIDEO ) != 0 ) {
        !           187:                fprintf( stderr, "Warning: Unable to initialize video: %s\n", SDL_GetError( ) );
        !           188:                result--;
        !           189:        }
        !           190: 
        !           191:        if( TTF_Init( ) == -1 ) {
        !           192:                fprintf( stderr, "Warning: Unable to initialize font engine: %s\n", TTF_GetError( ) );
        !           193:                result--;
        !           194:        }
        !           195: 
        !           196:        if( SDL_Init( SDL_INIT_AUDIO ) != 0 ) {
        !           197:                fprintf( stderr, "Warning: Unable to initialize audio: %s\n", SDL_GetError( ) );
        !           198:                result--;
        !           199:        }
        !           200:        
        !           201:        if( Mix_OpenAudio( 11025, AUDIO_S16, 2, 512 ) < 0 ) {
        !           202:                fprintf( stderr, "Warning: Audio set failed: %s\n", SDL_GetError( ) );
        !           203:                result--;
        !           204:        }
        !           205: 
        !           206:        screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, 16, SDL_HWSURFACE );
        !           207: 
        !           208:        if ( screen == NULL ) {
        !           209:                fprintf( stderr, "Error: Unable to set video mode: %s\n", SDL_GetError( ) );
        !           210:                result--;
        !           211:        }
        !           212: 
        !           213:        SDL_WM_SetCaption( TITLE, NULL );
        !           214: 
        !           215:        return result;
        !           216: }
        !           217: 
        !           218: /*
        !           219:  * void beginGame( void );
        !           220:  *
        !           221:  * Main game routine
        !           222:  */
        !           223: void beginGame( void ) {
        !           224:        float   next_heartbeat = 0;
        !           225:        SDL_Event event;
        !           226:        int     done = 0;
        !           227: 
        !           228:        printf ( "D: Starting main game loop\n" );
        !           229: 
        !           230:        if ( loadMedia( ) <= 0 ) {
        !           231:                fprintf( stderr, "Error: Failed to load graphics and audio!\n" );
        !           232:                return;
        !           233:        }
        !           234: 
        !           235:        drawBackground( );
        !           236: 
        !           237:        while( ! done ) {
        !           238:                while( SDL_PollEvent( &event ) ) {
        !           239:                        done = keyEvents( event );
        !           240:                }
        !           241: 
        !           242:                /* Check the heartbeat to see if we're ready */
        !           243:                if ( SDL_GetTicks( ) >= next_heartbeat ) {
        !           244:                        next_heartbeat = SDL_GetTicks( ) + heartbeat( );
        !           245:                }
        !           246:                SDL_Delay( 30 );
        !           247:        }
        !           248: 
        !           249:        SDL_FreeSurface( gfx );
        !           250: }
        !           251: 
        !           252: int loadMedia( void ) {
        !           253:        int result = 1;
        !           254: 
        !           255:        /*
        !           256:         * Load talos's textures and sounds
        !           257:         */
        !           258:        gfx = IMG_Load( "images/talos.png" );
        !           259:        if ( gfx == NULL ) {
        !           260:                fprintf( stderr, "Error: 'images/talos.bmp' could not be open: %s\n", SDL_GetError( ) );
        !           261:                result--;
        !           262:        }
        !           263: 
        !           264:        if ( SDL_SetColorKey( gfx, SDL_SRCCOLORKEY | SDL_RLEACCEL, SDL_MapRGB( gfx->format, COLORKEY ) ) == -1 ) 
        !           265:                fprintf( stderr, "Warning: colorkey will not be used, reason: %s\n", SDL_GetError( ) );
        !           266: 
        !           267:        background = IMG_Load( "images/gameboard.png" );
        !           268: 
        !           269:        if ( gfx == NULL ) {
        !           270:                fprintf( stderr, "Error: 'images/gameboard.png' could not be open: %s\n", SDL_GetError( ) );
        !           271:                result--;
        !           272:        }
        !           273: 
        !           274:        titleSurface = IMG_Load( "images/talos-title.png" );
        !           275:        if ( titleSurface == NULL ) {
        !           276:                fprintf( stderr, "Error: 'images/talos-title.png' could not be open: %s\n", SDL_GetError( ) );
        !           277:                result--;
        !           278:        }
        !           279: 
        !           280:        font = TTF_OpenFont( "fonts/CourierNew-Bold.ttf", 22 );
        !           281:        if ( font == NULL ) {
        !           282:                printf( "TTF_OpenFont: %s\n", TTF_GetError( ) );
        !           283:                result--;
        !           284:        }
        !           285: 
        !           286:        talos.s_hop = Mix_LoadWAV( "sounds/talos-hop.wav" );
        !           287: 
        !           288:        if ( talos.s_hop == NULL ) 
        !           289:                fprintf( stderr, "Warning: dp_talos_hop.wav could not be opened: %s\n", SDL_GetError( ) );
        !           290: 
        !           291:        talos.s_squash = Mix_LoadWAV( "sounds/dp_talos_squash.wav" );
        !           292:        if ( talos.s_squash == NULL )
        !           293:                fprintf( stderr, "Warning: dp_talos_plunk could not be opened %s\n", SDL_GetError( ));
        !           294: 
        !           295:        talos.s_splash = Mix_LoadWAV( "sounds/dp_talos_plunk.wav" );
        !           296:        if ( talos.s_splash == NULL )
        !           297:                fprintf( stderr, "Warning: dp_talos_splash could not be opened %s\n", SDL_GetError( ));
        !           298: 
        !           299:        s_freeFrog = Mix_LoadWAV( "sounds/dp_talos_extra.wav" );
        !           300:        if ( s_freeFrog == NULL )
        !           301:                fprintf( stderr, "Warning: dp_talos_extra could not be opened %s\n", SDL_GetError( ));
        !           302: 
        !           303:        return result;
        !           304: }
        !           305: 
        !           306: /*
        !           307:  * void keyEvents( void );
        !           308:  *
        !           309:  * Process the incoming keyboard and mouse events
        !           310:  *
        !           311:  */
        !           312: int keyEvents( SDL_Event event ) {
        !           313:        int done = 0;
        !           314: 
        !           315:        /* Always check for shutdown */
        !           316:        switch( event.type ) {
        !           317:                case SDL_QUIT:
        !           318:                        done = 1;
        !           319:                        break;
        !           320:                case SDL_KEYDOWN:
        !           321:                        /* printf( "Found key: %i\n", event.key.keysym.sym );*/
        !           322:                        switch( event.key.keysym.sym ) {
        !           323:                                case SDLK_ESCAPE:
        !           324:                                        done = 1;
        !           325:                                        break;
        !           326:                                case 102:
        !           327:                                        setFullScreenMode( );
        !           328:                                        break;
        !           329:                                default: 
        !           330:                                        break;
        !           331:                        }
        !           332:                        break;
        !           333:                default:        
        !           334:                        break;
        !           335:        }
        !           336:        /* We are playing the game */
        !           337:        if ( level ) {
        !           338:                /* Main game playing input */
        !           339:                if ( playing ) {
        !           340:                        if ( event.type == SDL_KEYDOWN && talos.alive ) {
        !           341:                                switch( event.key.keysym.sym ) {
        !           342:                                        case SDLK_UP:
        !           343:                                                if ( ! talos.direction ) {
        !           344:                                                        talos.hopCount = 0;
        !           345:                                                        talos.direction = UP;
        !           346:                                                        talos.currentRow++;
        !           347:                                                        playSound( talos.s_hop );
        !           348:                                                }
        !           349:                                                break;
        !           350:                                        case SDLK_DOWN:
        !           351:                                                if ( ! talos.direction ) {
        !           352:                                                        talos.hopCount = 0;
        !           353:                                                        talos.direction = DOWN;
        !           354:                                                        talos.currentRow--;
        !           355:                                                        playSound( talos.s_hop );
        !           356:                                                }
        !           357:                                                break;
        !           358:                                        case SDLK_LEFT:
        !           359:                                                if ( ! talos.direction ) {
        !           360:                                                        talos.hopCount = 0;
        !           361:                                                        talos.direction = LEFT;
        !           362:                                                        playSound( talos.s_hop );
        !           363:                                                }
        !           364:                                                break;
        !           365:                                        case SDLK_RIGHT:
        !           366:                                                if ( ! talos.direction ) {
        !           367:                                                        talos.hopCount = 0;
        !           368:                                                        talos.direction = RIGHT;
        !           369:                                                        playSound( talos.s_hop );
        !           370:                                                }
        !           371:                                                break;
        !           372:                                        case 108:
        !           373:                                                levelUp( );
        !           374:                                                fprintf( stderr, "Increase level to %i.\n", level );
        !           375:                                                break;
        !           376:                                        default:
        !           377:                                                break;
        !           378:                                }
        !           379: /* Uncomment for positioning debug information
        !           380:                                printf( "x,y,d => %i,%i,%i,%i\n", talos.placement[X],
        !           381:                                                               talos.placement[Y],
        !           382:                                                               talos.direction,
        !           383:                                                               talos.currentRow );
        !           384: */
        !           385:                        }
        !           386:                        /* Game over man, game over! */
        !           387:                        if ( ! lives ) {
        !           388:                
        !           389:                        }
        !           390:                }
        !           391:                /* we're at the pause screen */
        !           392:                else {
        !           393: 
        !           394:                }
        !           395:        }
        !           396:        /* Main intro screen input */
        !           397:        else {
        !           398:                if ( event.type == SDL_KEYUP ) {
        !           399:                        switch( event.key.keysym.sym ) {
        !           400:                                case SDLK_ESCAPE:
        !           401:                                        done = 1;
        !           402:                                        break;
        !           403:                                case SDLK_1:
        !           404:                                        printf( "D: Starting single player game\n" );
        !           405:                                        level = 1;
        !           406:                                        lives = LIVES;
        !           407:                                        playing = TRUE;
        !           408:                                        score = 0;
        !           409:                                        players = 1;
        !           410:                                        redraw_all = 1;
        !           411:                                        break;
        !           412:                                default:
        !           413:                                        break;
        !           414:                        }
        !           415:                }
        !           416:        }
        !           417: 
        !           418:        return done;
        !           419: }
        !           420: 
        !           421: int updateGameState( void ) {
        !           422: 
        !           423:        if ( ! drawBG ) configGameScreen( );
        !           424: 
        !           425:        if ( lives <= 0 ) {
        !           426:                goDelay++;
        !           427:                drawGameOver( );
        !           428:                /* Display game over screen for 50 ticks before returning
        !           429:                 * to the main screen */
        !           430:                if ( goDelay > 7 ) {
        !           431:                        playing = 0;
        !           432:                        lives   = 0;
        !           433:                        level   = 0;
        !           434:                        score   = 0;
        !           435:                        givenFreeFrog = 0;
        !           436:                        drawBG  = 0;
        !           437:                        
        !           438:                }
        !           439:                return 500;
        !           440:        }
        !           441: 
        !           442:        drawGameScreen( );
        !           443: 
        !           444:        return 50;
        !           445: }
        !           446: 
        !           447: void configGameScreen( void ) {
        !           448:        drawBG = 1;
        !           449: 
        !           450:        /*
        !           451:         * Draw background map
        !           452:         */
        !           453:        //drawBackground( );
        !           454:        drawImage( background, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, screen, 0, 0, 255 );
        !           455: 
        !           456:        /* Cars drive on rows 1 - 5
        !           457:         * Logs are on rows 8, 9 and 11, 8 = short, 9 long, 11 medium
        !           458:         * Turtles are on rows 7, 10
        !           459:         * Frogger starts on Row 0, 
        !           460:         * Sidewalk is row 6
        !           461:         * and the goal is row 12
        !           462:         */
        !           463: 
        !           464:        /* I MUST figure out a better way to handle the logs, turtles and cars */
        !           465: 
        !           466:        /* 
        !           467:         * Draw talos in starting position 
        !           468:         */
        !           469:        talosReset( );
        !           470: }
        !           471: 
        !           472: void drawGameScreen( void ) {
        !           473:        /* 
        !           474:         * Update talos
        !           475:         */
        !           476:        if ( talos.direction ) moveFrogger( );
        !           477:        if ( talos.riding ) ridingFrogger( );
        !           478: 
        !           479:        /*
        !           480:         * Update and draw everthing else
        !           481:         */
        !           482:        checkFly( );
        !           483:        checkGator( );
        !           484:        drawImage( background, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, screen, 0, 0, 255 );
        !           485:        drawScore( 0, score );
        !           486:        drawScore( 1, hScore );
        !           487:        drawGoals( );
        !           488:        drawLives( lives );
        !           489:        drawLevel( level );
        !           490:        drawWood( );
        !           491:        drawTurtles( );
        !           492:        drawVehicles( );
        !           493: 
        !           494:        if ( talos.alive == FALSE ) {
        !           495:                talos.riding = FALSE;
        !           496:                if ( ! drawDeathSequence( talos.deathType ) ) {
        !           497:                        lives--;
        !           498:                        if ( lives < 0 ) { drawGameOver( ); }
        !           499:                        else { talosReset( ); } 
        !           500:                }
        !           501:        }
        !           502: 
        !           503:        if ( talos.alive )  {
        !           504:                talos.alive = checkTimer( );
        !           505:                drawImage( gfx, talos.src.x, talos.src.y, talos.src.w,
        !           506:                           talos.src.h, screen, talos.dst.x, talos.dst.y, 255 );
        !           507:        }
        !           508:        if ( ! debugBorder ) {
        !           509:                SDL_FillRect( screen, &leftBorderRect,  SDL_MapRGB( screen->format, BGCOLOR ) );
        !           510:                SDL_FillRect( screen, &rightBorderRect, SDL_MapRGB( screen->format, BGCOLOR ) );
        !           511:        }
        !           512: 
        !           513:        SDL_Flip( screen );
        !           514: }
        !           515: 
        !           516: void drawBackground( void ) {
        !           517:         /*
        !           518:          * Draw background map
        !           519:          */
        !           520:         backgroundRect.x = 0;
        !           521:         backgroundRect.y = 0;
        !           522:         SDL_BlitSurface( background, NULL, screen, &backgroundRect );
        !           523:        SDL_UpdateRect( screen, 0, 0, 0, 0 );
        !           524: }
        !           525: 
        !           526: /*
        !           527:  * This calculates the pixel top of the requested row 
        !           528:  */
        !           529: int getRowPixel ( int row ) {
        !           530:        return 0;//ROW_BASE - ( row * HOP_DISTANCE );
        !           531: }
        !           532: 
        !           533: /*
        !           534:  * Check our fly timers to determine if we need to display or
        !           535:  * remove a fly from the goal area
        !           536:  */
        !           537: void checkFly ( void ) {
        !           538: }
        !           539: 
        !           540: /*
        !           541:  * Check our gator timers.  Similiar to fly timers above, however, the gator
        !           542:  * has an extra stage as it enters in to the goal area.
        !           543:  */
        !           544: void checkGator ( void ) {
        !           545: }
        !           546: 
        !           547: /*
        !           548:  * This does collision detection based on the row talos
        !           549:  * is in to help reduce overhead 
        !           550:  */
        !           551: int collisionRow ( void ) {
        !           552:        return 0;
        !           553: }
        !           554: 
        !           555: /* If the player gets enough points, award them a free talos */
        !           556: int freeFrog ( int score ) {
        !           557:        return 0;
        !           558: }
        !           559: 
        !           560: /* Check what talos is colliding with */
        !           561: int collideFrogger ( int x, int y, int h, int w ) {
        !           562:        h++; w++;
        !           563:        
        !           564:         if ( ( talos.placement[Y] >= ( y + h ) ) ||
        !           565:              ( talos.placement[X] >= ( x + w ) ) ||
        !           566:              ( y >= ( talos.placement[Y] + FRAME ) ) ||
        !           567:              ( x >= ( talos.placement[X] + FRAME ) ) ) {
        !           568:                 return( 0 );
        !           569:         }
        !           570:         return( 1 );
        !           571: }
        !           572: 
        !           573: /* Check left and right borders */
        !           574: void checkFroggerBorder( void ) {
        !           575: 
        !           576: }
        !           577: 
        !           578: void levelUp ( void ) {
        !           579: }
        !           580: 
        !           581: int checkGoals ( void ) {
        !           582:        return 0;
        !           583: }
        !           584: 
        !           585: void talosReset ( void ) {
        !           586: }
        !           587: 
        !           588: /*
        !           589:  * This actually moves talos...  I need to come up with a better
        !           590:  * algorithm for calculating the distance and time
        !           591:  */
        !           592: void moveFrogger( void ) {
        !           593:        int x = 0;
        !           594:        int y = 0;
        !           595:        int h = FRAME;
        !           596:        int w = FRAME;
        !           597:        
        !           598:        talos.oldPlacement[Y] = talos.placement[Y];
        !           599:        talos.oldPlacement[X] = talos.placement[X];
        !           600: 
        !           601:        switch( talos.direction ) {
        !           602:                case UP:
        !           603:                        x = FRAME;
        !           604:                        // talos.placement[Y] -= ( HOP_DISTANCE / HOP_SPEED );
        !           605:                        break;
        !           606:                case DOWN:
        !           607:                        x = ( 5 * FRAME );
        !           608:                        // talos.placement[Y] += ( HOP_DISTANCE / HOP_SPEED );
        !           609:                        break;
        !           610:                case LEFT:
        !           611:                        x = ( 7 * FRAME );
        !           612:                        // talos.placement[X] -= ( HOP_DISTANCE / HOP_SPEED );
        !           613:                        break;
        !           614:                case RIGHT:
        !           615:                        x = ( 3 * FRAME );
        !           616:                        //talos.placement[X] += ( HOP_DISTANCE / HOP_SPEED );
        !           617:                        break;  
        !           618:        }
        !           619: 
        !           620:        checkFroggerBorder( );
        !           621: 
        !           622:        /* select the frame to display */
        !           623:        talos.src.y = y;
        !           624:        talos.src.x = x;
        !           625:        talos.src.w = w;
        !           626:        talos.src.h = h;
        !           627: 
        !           628:        /* Set the old place to be erased */
        !           629:        talos.dst.y = talos.oldPlacement[Y];
        !           630:        talos.dst.x = talos.oldPlacement[X];
        !           631: 
        !           632:        SDL_FillRect( screen, NULL, SDL_MapRGB( screen->format, BGCOLOR ) );
        !           633: 
        !           634:        /* Place the new position */
        !           635:        talos.dst.y = talos.placement[Y];
        !           636:        talos.dst.x = talos.placement[X];
        !           637: 
        !           638:        talos.hopCount++;
        !           639: 
        !           640: }
        !           641: 
        !           642: void ridingFrogger( void ) {
        !           643: }
        !           644: 
        !           645: void drawTitleScreen( void ) {
        !           646:        SDL_Surface *introText;
        !           647:        SDL_Color fontColor = { 123, 158, 53, 255 };
        !           648:        int center = ( SCREEN_WIDTH / 2 ) - ( titleSurface->w / 2 );
        !           649:        int i;
        !           650:        char *txt[] = { "Press 1 for single player game",
        !           651:                        "Press 2 for two player games",
        !           652:                        "Press F for full screen mode",
        !           653:                        "Press ESC to quit" };
        !           654: 
        !           655:        // drawBackground( );
        !           656: 
        !           657:        drawImage( titleSurface, 0, 0, titleSurface->w, 
        !           658:                   titleSurface->h, screen, center, 100, 255 );
        !           659: 
        !           660:        for( i = 0; i <= 3; i++ ) {
        !           661:                introText = TTF_RenderText_Solid( font, txt[i], fontColor );
        !           662:                drawImage( introText, 0, 0, introText->w, introText->h, screen, 
        !           663:                           140, 300 + ( i * introText->h ), 255 );
        !           664:        }
        !           665: 
        !           666:        SDL_Flip( screen );
        !           667: }
        !           668: 
        !           669: void drawPauseScreen( void ) {
        !           670:        printf( "D: Draw Pause Screen\n" );
        !           671: 
        !           672: }
        !           673: 
        !           674: void drawGameOver( void ) {
        !           675:        printf( "D: Game Over\n" );
        !           676: }
        !           677: 
        !           678: void playSound( Mix_Chunk *sound ) {
        !           679:        Mix_PlayChannel( -1, sound, 0 );
        !           680: }
        !           681: 
        !           682: void setFullScreenMode( void ) {
        !           683:        /* Lets give fullscreen mode a try */
        !           684:        if ( ! fullscreen ) {
        !           685:                screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, 16, SDL_HWSURFACE | SDL_FULLSCREEN );
        !           686:                fullscreen = TRUE;
        !           687:        }
        !           688:        /* Switch back to window mode */
        !           689:        else {
        !           690:                screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, 16, SDL_HWSURFACE );
        !           691:                fullscreen = FALSE;
        !           692:        }
        !           693: 
        !           694:        printf( "D: Fullscreen : %i\n", fullscreen );
        !           695: }
        !           696: 
        !           697: int drawDeathSequence( int deathType ) {
        !           698:        return 1;
        !           699: }
        !           700: 
        !           701: /* draw green timer and return 0 if out of time */
        !           702: int checkTimer( void ) {
        !           703:        return 1;
        !           704: }
        !           705: 
        !           706: void drawScore( int high, int score ) {
        !           707:        int x = 169;
        !           708:        int y = 14;
        !           709: 
        !           710:        if ( score > hScore ) hScore = score;   
        !           711:        if ( high ) x = 260;
        !           712:                
        !           713:        drawNumbers( score, x, y );             
        !           714: }
        !           715: 
        !           716: void drawNumbers( int num, int x, int y ) {
        !           717:        char numStr[6] = "00000";
        !           718:        int i;
        !           719: 
        !           720:        /* Assume anything less than 50 pixels location is a score and
        !           721:          * pad with '0'.
        !           722:          */
        !           723:        if ( y <= 15 ) sprintf( numStr, "%05i", num );
        !           724:        else           sprintf( numStr, "%i", num );
        !           725: 
        !           726:        for ( i = 0; i <= 4; i++ ) {
        !           727:                char c = numStr[i];
        !           728:                int n = atoi( &c );
        !           729: 
        !           730:                drawImage( gfx, n * HFRAME, FRAME * 3 , HFRAME, FRAME, 
        !           731:                           screen, x + ( i * HFRAME ) + 2, y, 255 );
        !           732:        }
        !           733: }
        !           734: 
        !           735: /* Normally this functions manages and draws the flys, gators and saved taloss
        !           736:  * but if drawDebugRect below is turned on it will draw the rectangle
        !           737:  * used for collision detectiong for debuggin purposes in timer green
        !           738:  */
        !           739: void drawGoals( void ) {
        !           740: 
        !           741: }
        !           742: 
        !           743: void drawTimer( int length ) {
        !           744: }
        !           745: 
        !           746: void drawLives( int lives ) {
        !           747: }
        !           748: 
        !           749: void drawLevel( int level ) {
        !           750: }
        !           751: 
        !           752: void drawWood ( void ) {
        !           753: }
        !           754: 
        !           755: void drawTurtles ( void ) {
        !           756: }
        !           757: 
        !           758: void drawVehicles ( void ) {
        !           759: 
        !           760: }
        !           761: 
        !           762: void drawImage( SDL_Surface *srcimg, int sx, int sy, int sw, int sh, 
        !           763:                SDL_Surface *dstimg, int dx, int dy, int alpha ) {
        !           764:   if ((!srcimg) || (alpha == 0)) return; 
        !           765:   SDL_Rect src, dst;        
        !           766: 
        !           767:   src.x = sx;  src.y = sy;  src.w = sw;     src.h = sh;
        !           768:   dst.x = dx;  dst.y = dy;  dst.w = src.w;  dst.h = src.h;
        !           769: 
        !           770:   if (alpha != 255) SDL_SetAlpha(srcimg, SDL_SRCALPHA, alpha); 
        !           771:   SDL_BlitSurface(srcimg, &src, dstimg, &dst);                
        !           772: }
        !           773: 
        !           774: int heartbeat ( void ) {
        !           775:        int ticks;
        !           776:        if ( level ) {
        !           777:                if ( playing ) {
        !           778:                        ticks = updateGameState( );
        !           779:                        if ( ticks <= 0 ) ticks = 50;
        !           780:                        return ticks;           
        !           781:                }
        !           782:                else {
        !           783:                        drawPauseScreen( );
        !           784:                        return 500;
        !           785:                }
        !           786:        }
        !           787:        else {
        !           788:                drawTitleScreen( );
        !           789:                return 500;
        !           790:        }
        !           791: 
        !           792:        return 50;
        !           793: }
        !           794: 
        !           795: /*
        !           796:  * Main program starts here.  We'll init the video and audio
        !           797:  * and then begin our main program loop here
        !           798:  *
        !           799:  */
        !           800: int main ( int argc, char **argv ) {
        !           801:        if ( mySDLInit( ) <= 0 ) {
        !           802:                fprintf( stderr, "Failure to start %s\n", TITLE );
        !           803:                return 255;
        !           804:        }
        !           805: 
        !           806:        beginGame( );
        !           807: 
        !           808:        SDL_Quit( );
        !           809:        
        !           810:        return 0;
        !           811: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>