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; }
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 ---------- */