示例#1
0
int main (void) {
  /* initialize the game. */
  setup_allegro (MODE, WIDTH, HEIGHT, 16);
  setup_bmps();
  setup_player();
  scrollx = 0;
  scrolly = 0;
  
  currentmap = (MAP*)malloc (sizeof (MAP));
  currentmap->initflag = 1;
  currentmap->idnumber = TCA_13;
    
  map_handler();

  while (!key[KEY_ESC]) {
    get_input();
    move_player();
    scroll_window();
    animate_player();
    map_event_handler();
    map_handler();
    draw_player();
    blit (scrollbmp, bufferbmp, scrollx, scrolly, 0, 0, WIDTH-1, HEIGHT-1);
    print_scroll_debug_messages();
    print_player_debug_messages();

    acquire_screen();
    blit (bufferbmp, screen, 0, 0, 0, 0, WIDTH-1, HEIGHT-1);
    release_screen();

    rest (20);
  }
  destroy_bmps();
  allegro_exit();
  return 0;
}
示例#2
0
int
main ( int argc, char *argv[] )
{
    struct player d;    
    bool quit = false;
    int player_x  = 0;
    int player_y  = 0;
    SDL_Rect tmp;
    SDL_Rect old_bak;
    bool is_jumping = false;
    int initial_jmp_vel = 100;
    int accel = 1;

    float start_tick = 0;
    float tick_diff = 0;

    if( init() == false )
        return EXIT_FAILURE;
    if( load_files() == false )
        return EXIT_FAILURE;
    
    
    
    d.w = sm_sprite_w;
    d.h = sm_sprite_h;
    d.c_d = RIGHT;
    d.c_sp_offset = 7;
    d.c_vel_x = 6;
    d.c_vel_y = 6;

    d.r_frames[0].x = sm_sprite_w * d.c_sp_offset;
    d.r_frames[0].y = sm_sprite_h * 0;

    d.r_frames[1].x = sm_sprite_w * (d.c_sp_offset + 1);
    d.r_frames[1].y = sm_sprite_h * 0;

    d.r_frames[2].x = sm_sprite_w * (d.c_sp_offset + 2);
    d.r_frames[2].y = sm_sprite_h * 0;

    d.r_frames[3].x = sm_sprite_w * (d.c_sp_offset + 3);
    d.r_frames[3].y = sm_sprite_h * 0;
    
    d.l_frames[0].x = sm_sprite_w * (d.c_sp_offset - 1);
    d.l_frames[0].y = sm_sprite_h * 0;

    d.l_frames[1].x = sm_sprite_w * (d.c_sp_offset - 2);
    d.l_frames[1].y = sm_sprite_h * 0;

    d.l_frames[2].x = sm_sprite_w * (d.c_sp_offset - 3);
    d.l_frames[2].y = sm_sprite_h * 0;

    d.l_frames[3].x = sm_sprite_w * (d.c_sp_offset - 4);
    d.l_frames[3].y = sm_sprite_h * 0;

    d.j_frames[0].x = sm_sprite_w * (d.c_sp_offset + 5);
    d.j_frames[0].y = sm_sprite_h * 0;

    d.j_frames[1].x = sm_sprite_w * (d.c_sp_offset - 6);
    d.j_frames[1].y = sm_sprite_h * 0;

    
    //-------------- Remove this --------------------------
    struct solid_object ob;
    /*
    SDL_Rect brick;

    brick.w = 17;
    brick.h = 17;
    brick.x = 17 * 5;
    brick.y = 0;
    */
    ob.w = 16 * 3;
    ob.h = 16;
    ob.screen_x = 100;
    ob.screen_y = 100;
    ob.image.w = 16;
    ob.image.h = 16;
    ob.image.x = 17 * 5;
    ob.image.y = 0;

    // Applying the background
    SDL_FillRect( background, NULL, SDL_MapRGB( screen->format, 0, 0, 0 ) );
    apply_surface( 0, 0, background, screen );
    
    // Applying the object sheet
    //apply_surface( 100, 100, object_sheet, screen, &brick );
    //apply_surface( 100 + brick.w, 100, object_sheet, screen, &brick );
    draw_solid_object( &ob, object_sheet, screen );

    player_x  = (screen->w / 2) - (d.w / 2);
    player_y  = (screen->h / 2) - (d.h / 2);

    // setting player screen coordinates

    d.screen_x = player_x;
    d.screen_y = player_y;

    d.current_bg.x = d.screen_x;
    d.current_bg.y = d.screen_y;
    d.current_bg.w = d.w;
    d.current_bg.h = d.h;

    tmp.x = d.r_frames[0].x;
    tmp.y = d.r_frames[0].y;
    tmp.w = d.w;
    tmp.h = d.h;

    load_level();

    apply_surface( player_x, player_y, state_image, screen, &tmp );

    if( SDL_Flip( screen ) == -1 ){
        return EXIT_FAILURE;
    }

    while( quit == false ){

        start_tick = SDL_GetTicks();

        quit = handle_events();

        //tick_diff = SDL_GetTicks() - last_tick;
        //last_tick = SDL_GetTicks();
        

        if( right_pressed && !is_jumping ){
            //animate( SDL_Surface *frames, int start_frame );
            if( d.c_d != RIGHT ){
                //tmp.x = d.r_frames[0].x;
                //tmp.y = d.r_frames[0].y;
                //tmp.w = d.w;
                //tmp.h = d.h;
                //apply_surface( d.screen_x, d.screen_y, background, screen, &d.current_bg );

                d.current_bg.x = d.screen_x;
                d.current_bg.y = d.screen_y;
                d.current_bg.w = d.w;
                d.current_bg.h = d.h;

                apply_surface( d.screen_x, d.screen_y, background, screen, &d.current_bg );

                tmp.x = d.r_frames[0].x;
                tmp.y = d.r_frames[0].y;
                tmp.w = d.w;
                tmp.h = d.h;

                d.c_d = RIGHT;

                apply_surface( d.screen_x, d.screen_y, state_image, screen, &tmp );
            }
            animate_player( &d, RIGHT, 0 );
        }

        if( left_pressed && !is_jumping ){
            //animate( SDL_Surface *frames, int start_frame );
            if( d.c_d != LEFT ){
                //tmp.x = d.r_frames[0].x;
                //tmp.y = d.r_frames[0].y;
                //tmp.w = d.w;
                //tmp.h = d.h;
                //apply_surface( d.screen_x, d.screen_y, background, screen, &d.current_bg );

                d.current_bg.x = d.screen_x;
                d.current_bg.y = d.screen_y;
                d.current_bg.w = d.w;
                d.current_bg.h = d.h;
                
                apply_surface( d.screen_x, d.screen_y, background, screen, &d.current_bg );

                tmp.x = d.l_frames[0].x;
                tmp.y = d.l_frames[0].y;
                tmp.w = d.w;
                tmp.h = d.h;

                d.c_d = LEFT;

                apply_surface( d.screen_x, d.screen_y, state_image, screen, &tmp );
            }
            animate_player( &d, LEFT, 0 );
        }

        if( up_pressed ){
                /*
                apply_surface( d.screen_x, d.screen_y, background, screen, &d.current_bg );

                d.current_bg.x = d.screen_x;
                d.current_bg.y = d.screen_y;
                d.current_bg.w = d.w;
                d.current_bg.h = d.h;

                tmp.x = d.j_frames[0].x;
                tmp.y = d.j_frames[0].y;
                tmp.w = d.w;
                tmp.h = d.h;

                d.screen_y -= 1;

                apply_surface( d.screen_x, d.screen_y, state_image, screen, &tmp );
                SDL_Delay(10);
            */
            //animate_player( &d, JUMP, 0 );
            //initial_jmp_vel = 10;
            if( is_jumping == false ){
                //initial_jmp_vel = player_can_jump( &d, &ob, 20 );
                initial_jmp_vel = 20;
                //printf( "jmp %d\n", initial_jmp_vel );
            }

            is_jumping = true;
            //accel = 6;
            //f_vel[Y] += GRAVITY * f_ticksDiff;

		    //i_pos[X] += (int)(f_vel[X] * f_ticksDiff);
		    //i_pos[Y] += (int)(f_vel[Y] * f_ticksDiff);
            

        }
        if( is_jumping ){
           //apply_surface( d.screen_x, d.screen_y, background, screen, &d.current_bg );

            d.current_bg.x = d.screen_x;
            d.current_bg.y = d.screen_y;
            d.current_bg.w = d.w;
            d.current_bg.h = d.h;

           apply_surface( d.screen_x, d.screen_y, background, screen, &d.current_bg );

            if( d.c_d == RIGHT ){
                tmp.x = d.j_frames[0].x;
                tmp.y = d.j_frames[0].y;
            }else{
                tmp.x = d.j_frames[1].x;
                tmp.y = d.j_frames[1].y;
            }
            tmp.w = d.w;
            tmp.h = d.h;

            initial_jmp_vel = initial_jmp_vel - accel;
            d.screen_y = d.screen_y - initial_jmp_vel;

            
            if( left_pressed )
                d.screen_x -= (d.c_vel_x - 2);
            if( right_pressed )
                d.screen_x = (d.screen_x + (d.c_vel_x - 2)) % SCREEN_WIDTH;

            d.screen_x = (d.screen_x <= 0) ? 0 : (d.screen_x >= (SCREEN_WIDTH - d.w)) ? (SCREEN_WIDTH - d.w) : d.screen_x;

            /*
            if( detect_collision( &ob, &d ) ){
                if( d.screen_y >= (ob.screen_y + ob.h) ){
                    d.screen_y = ob.screen_y - ob.h;
                    
                }else{
                    //ob.screen_y
                    d.screen_y = ob.screen_y - d.h;
                    player_y = d.screen_y;
                    
                }
                //is_jumping = false;
                initial_jmp_vel = -10;
            }
            */
            if( ob.screen_x <= d.screen_x && (ob.screen_x + ob.w) >= (d.screen_x) ){
                printf("collision %d\n", d.screen_y + d.h);
                // player is on top
                if( (d.screen_y + d.h) <= ob.screen_y ){
                    //ret = true;
                    printf("xxxxx");
                    d.screen_y = ob.screen_y - d.h;
                    is_jumping = false;
                }else if( d.screen_y <= (ob.screen_y + ob.h) ){
                    // player is on the bottom
                    //ret = true;
                    printf("Im here");
                    d.screen_y = ob.screen_y + ob.h;
                    initial_jmp_vel = -1;
                }
                //initial_jmp_vel = -10;
            }

            //printf("%d\n", d.screen_y);

            apply_surface( d.screen_x, d.screen_y, state_image, screen, &tmp );
            //SDL_Delay(20);
        }
        /*
        if( !up_pressed && is_jumping ){
                apply_surface( d.screen_x, d.screen_y, background, screen, &d.current_bg );

                d.current_bg.x = d.screen_x;
                d.current_bg.y = d.screen_y;
                d.current_bg.w = d.w;
                d.current_bg.h = d.h;

                if( d.c_d == RIGHT ){
                    tmp.x = d.r_frames[0].x;
                    tmp.y = d.r_frames[0].y;
                }else{
                    tmp.x = d.l_frames[0].x;
                    tmp.y = d.l_frames[0].y;
                }
                tmp.w = d.w;
                tmp.h = d.h;

                //initial_jmp_vel = initial_jmp_vel - accel;                
                //d.screen_y = d.screen_y - initial_jmp_vel;
                //initial_jmp_vel = (int)(initial_jmp_vel + 1) * tick_diff;
                //d.screen_y = d.screen_y + (int)(initial_jmp_vel * tick_diff);
                //d.screen_y -= (4 - accel);
                //accel -= 2;
                //initial_jmp_vel = initial_jmp_vel - accel;
                //d.screen_y -= initial_jmp_vel;
                //accel--;
                //d.screen_y = (accel-- > 0 ) ? (d.screen_y - accel) : (d.screen_y + accel);
                //initial_jmp_vel = initial_jmp_vel - accel;
                //d.screen_y = d.screen_y + initial_jmp_vel;
                //d.screen_y -= accel--;
                //accel = (accel <= 0) ? accel++: accel--;
                //accel = ( accel < 0 ) ? (accel + 1) : accel;
                d.screen_y = d.screen_y + initial_jmp_vel;
                initial_jmp_vel = initial_jmp_vel + accel;
                //d.screen_y += 1;
                //printf("%d\n", accel);

                apply_surface( d.screen_x, d.screen_y, state_image, screen, &tmp );
                SDL_Delay(20);
        }
        */
        
        

        if( d.screen_y >= player_y && is_jumping ){
            apply_surface( d.screen_x, d.screen_y, background, screen, &d.current_bg );

            d.current_bg.x = d.screen_x;
            d.current_bg.y = d.screen_y;
            d.current_bg.w = d.w;
            d.current_bg.h = d.h;

            if( d.c_d == RIGHT ){
                tmp.x = d.r_frames[0].x;
                tmp.y = d.r_frames[0].y;
            }else{
                tmp.x = d.l_frames[0].x;
                tmp.y = d.l_frames[0].y;
            }
            tmp.w = d.w;
            tmp.h = d.h;

            apply_surface( d.screen_x, d.screen_y, state_image, screen, &tmp );            
        
            is_jumping = false;
            initial_jmp_vel = 20;
            //accel = 10;
        }
        /*
        if( ob.screen_x <= d.screen_x && (ob.screen_x + ob.w) >= d.screen_x && ob.screen_y <= d.screen_y && (ob.screen_y + ob.h) >= d.screen_y ){
            printf("collision\n");

            if( d.screen_y >= (ob.screen_y + ob.h) ){
                d.screen_y = ob.screen_y + ob.h;
            }else{
                d.screen_y = ob.screen_y - d.h;
            }

            //is_jumping = false;
        }
        */

        if( SDL_Flip( screen ) == -1 )
        {
            return EXIT_FAILURE;
        }

        if( SDL_GetTicks() - start_tick <= frame_delay ){
            //printf("xxx");
            SDL_Delay( frame_delay - (SDL_GetTicks() - start_tick) );
        }
    }

    //SDL_Delay(5000);

    return EXIT_SUCCESS;
}/* ----------  end of function main  ---------- */