[Super-tux-commit] supertux/src badguy.cpp,1.18,1.19 badguy.h,1.19,1.20 button.cpp,1.9,1.10 button.h
Brought to you by:
wkendrick
From: Tobias Gl??er <to...@us...> - 2004-04-04 00:44:36
|
Update of /cvsroot/super-tux/supertux/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12921/src Modified Files: badguy.cpp badguy.h button.cpp button.h collision.cpp collision.h gameloop.cpp leveleditor.cpp physic.cpp physic.h player.cpp player.h scene.cpp tile.cpp tile.h timer.cpp title.cpp Log Message: - Physic C++ rewrite (Matze Braun) - Added new badguys (Matze Braun) - Fixed minor bugs (Matze Braun) Index: tile.h =================================================================== RCS file: /cvsroot/super-tux/supertux/src/tile.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- tile.h 3 Apr 2004 13:31:14 -0000 1.8 +++ tile.h 4 Apr 2004 00:32:10 -0000 1.9 @@ -40,6 +40,9 @@ /** FIXME: ? */ bool ice; + /** water */ + bool water; + /** Bonusbox, content is stored in \a data */ bool fullbox; Index: scene.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/scene.cpp,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- scene.cpp 29 Mar 2004 13:24:42 -0000 1.10 +++ scene.cpp 4 Apr 2004 00:32:10 -0000 1.11 @@ -121,9 +121,10 @@ void add_bad_guy(float x, float y, BadGuyKind kind) { - BadGuy new_bad_guy; + bad_guys.push_back(BadGuy()); + BadGuy& new_bad_guy = bad_guys.back(); + new_bad_guy.init(x,y,kind); - bad_guys.push_back(new_bad_guy); } void add_upgrade(float x, float y, int dir, int kind) Index: player.h =================================================================== RCS file: /cvsroot/super-tux/supertux/src/player.h,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- player.h 3 Apr 2004 13:31:14 -0000 1.19 +++ player.h 4 Apr 2004 00:32:10 -0000 1.20 @@ -107,8 +107,7 @@ timer_type skidding_timer; timer_type safe_timer; timer_type frame_timer; - physic_type vphysic; - physic_type hphysic; + Physic physic; public: void init(); Index: leveleditor.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/leveleditor.cpp,v retrieving revision 1.27 retrieving revision 1.28 diff -u -d -r1.27 -r1.28 --- leveleditor.cpp 3 Apr 2004 13:31:14 -0000 1.27 +++ leveleditor.cpp 4 Apr 2004 00:32:10 -0000 1.28 @@ -861,20 +861,6 @@ } else if(event.button.button == SDL_BUTTON_RIGHT) { - switch(active_tm) - { - case TM_BG: - active_tm = TM_IA; - break; - case TM_IA: - active_tm = TM_FG; - break; - case TM_FG: - active_tm = TM_BG; - break; - default: - break; - } le_mouse_pressed[RIGHT] = true; } break; @@ -1066,7 +1052,7 @@ } else if(le_move_left_bt->get_state() == BUTTON_HOVER) { - pos_x -= 96; + pos_x -= 64; } if(le_move_right_bt->get_state() == BUTTON_PRESSED) @@ -1075,7 +1061,7 @@ } else if(le_move_right_bt->get_state() == BUTTON_HOVER) { - pos_x += 96; + pos_x += 64; } } @@ -1247,7 +1233,7 @@ text_drawf(&blue_text, "- Help -", 0, 30, A_HMIDDLE, A_TOP, 2); for(i = 0; i < sizeof(text)/sizeof(char *); i++) - text_draw(&white_small_text, text[i], 5, 80+(i*12), 1); + text_draw(&white_text, text[i], 5, 80+(i*18), 1); text_drawf(&gold_text, "Press Any Key to Continue", 0, 440, A_HMIDDLE, A_TOP, 1); @@ -1257,16 +1243,7 @@ while(done == 0) { - while(SDL_PollEvent(&event)) - switch(event.type) - { - case SDL_MOUSEBUTTONDOWN: // mouse pressed - case SDL_KEYDOWN: // key pressed - done = 1; - break; - default: - break; - } + done = wait_for_event(event); SDL_Delay(50); } } Index: gameloop.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/gameloop.cpp,v retrieving revision 1.40 retrieving revision 1.41 diff -u -d -r1.40 -r1.41 --- gameloop.cpp 3 Apr 2004 13:31:14 -0000 1.40 +++ gameloop.cpp 4 Apr 2004 00:32:10 -0000 1.41 @@ -469,9 +469,7 @@ int y,x; /* Draw screen: */ - if (tux.dying && (global_frame_counter % 4) == 0) - clearscreen(255, 255, 255); - else if(timer_check(&super_bkgd_timer)) + if(timer_check(&super_bkgd_timer)) texture_draw(&img_super_bkgd, 0, 0); else { @@ -611,6 +609,7 @@ } level_load_gfx(¤t_level); + loadshared(); activate_bad_guys(¤t_level); activate_particle_systems(); level_load_song(¤t_level); @@ -620,8 +619,6 @@ if(st_gl_mode != ST_GL_TEST) load_hs(); - loadshared(); - if(st_gl_mode == ST_GL_PLAY || st_gl_mode == ST_GL_LOAD_LEVEL_FILE) levelintro(); @@ -640,6 +637,7 @@ game_pause = 0; timer_init(&fps_timer,true); timer_init(&frame_timer,true); + last_update_time = st_get_ticks(); fps_cnt = 0; /* Clear screen: */ @@ -1177,65 +1175,6 @@ } } } - - /* - if (c == 'X' || c == 'x') - texture_draw(&img_brick[0], x, y); - else if (c == 'Y' || c == 'y') - texture_draw(&img_brick[1], x, y); - else if (c == 'A' || c =='B' || c == '!') - texture_draw(&img_box_full, x, y); - else if (c == 'a') - texture_draw(&img_box_empty, x, y); - else if (c >= 'C' && c <= 'F') - texture_draw(&img_cloud[0][c - 'C'], x, y); - else if (c >= 'c' && c <= 'f') - texture_draw(&img_cloud[1][c - 'c'], x, y); - else if (c >= 'G' && c <= 'J') - texture_draw(&img_bkgd_tile[0][c - 'G'], x, y); - else if (c >= 'g' && c <= 'j') - texture_draw(&img_bkgd_tile[1][c - 'g'], x, y); - else if (c == '#') - texture_draw(&img_solid[0], x, y); - else if (c == '[') - texture_draw(&img_solid[1], x, y); - else if (c == '=') - texture_draw(&img_solid[2], x, y); - else if (c == ']') - texture_draw(&img_solid[3], x, y); - else if (c == '$') - { - z = (global_frame_counter / 2) % 6; - - if (z < 4) - texture_draw(&img_distro[z], x, y); - else if (z == 4) - texture_draw(&img_distro[2], x, y); - else if (z == 5) - texture_draw(&img_distro[1], x, y); - } - else if (c == '^') - { - z = (global_frame_counter / 3) % 3; - - texture_draw(&img_waves[z], x, y); - } - else if (c == '*') - texture_draw(&img_poletop, x, y); - else if (c == '|') - { - texture_draw(&img_pole, x, y); - - } - else if (c == '\\') - { - z = (global_frame_counter / 3) % 2; - - texture_draw(&img_flag[z], x + 16, y); - } - else if (c == '&') - texture_draw(&img_water, x, y);*/ - } @@ -1657,8 +1596,6 @@ timer_fread(&tux.frame_timer,fi); timer_fread(&time_left,fi); fread(&ui,sizeof(int),1,fi); - tux.hphysic.start_time += st_get_ticks() - ui; - tux.vphysic.start_time += st_get_ticks() - ui; fclose(fi); } Index: button.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/button.cpp,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- button.cpp 3 Apr 2004 13:31:14 -0000 1.9 +++ button.cpp 4 Apr 2004 00:32:10 -0000 1.10 @@ -17,8 +17,12 @@ #include "globals.h" #include "button.h" +timer_type Button::popup_timer; + Button::Button(std::string icon_file, std::string ninfo, SDLKey nshortcut, int x, int y, int mw, int mh) { + timer_init(&popup_timer,false); + char filename[1024]; if(!icon_file.empty()) @@ -85,6 +89,10 @@ void Button::draw() { + if(state == BUTTON_HOVER) + if(!timer_check(&popup_timer)) + show_info = true; + fillrect(rect.x,rect.y,rect.w,rect.h,75,75,75,200); fillrect(rect.x+1,rect.y+1,rect.w-2,rect.h-2,175,175,175,200); if(bkgd != NULL) @@ -152,7 +160,7 @@ mouse_cursor->set_state(MC_LINK); } } - else if(event.type != SDL_KEYDOWN && event.type != SDL_KEYUP) + else if((event.type != SDL_KEYDOWN && event.type != SDL_KEYUP) || event.type == SDL_MOUSEMOTION) { state = BUTTON_NONE; if(show_info) @@ -173,12 +181,14 @@ } else if(event.type == SDL_MOUSEMOTION) { - + timer_start(&popup_timer, 1500); + if(show_info) { show_info = false; } } + } int Button::get_state() @@ -214,7 +224,7 @@ for(std::vector<Button*>::iterator it = item.begin(); it != item.end(); ++it) { (*it)->event(event); - if((*it)->state != -1) + if((*it)->state != BUTTON_NONE) return (*it); } return NULL; @@ -236,6 +246,7 @@ void ButtonPanel::draw() { + if(hidden == false) { fillrect(rect.x,rect.y,rect.w,rect.h,100,100,100,200); Index: collision.h =================================================================== RCS file: /cvsroot/super-tux/supertux/src/collision.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- collision.h 26 Mar 2004 23:53:31 -0000 1.5 +++ collision.h 4 Apr 2004 00:32:10 -0000 1.6 @@ -25,7 +25,7 @@ enum CollisionType { COLLISION_NORMAL, COLLISION_BUMP, - COLLISION_SQUICH + COLLISION_SQUISH }; bool rectcollision(base_type* one, base_type* two); Index: physic.h =================================================================== RCS file: /cvsroot/super-tux/supertux/src/physic.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- physic.h 23 Mar 2004 17:25:15 -0000 1.6 +++ physic.h 4 Apr 2004 00:32:10 -0000 1.7 @@ -13,37 +13,48 @@ #ifndef SUPERTUX_PHYSIC_H #define SUPERTUX_PHYSIC_H -#include "timer.h" +/** This is a very simplistic physics engine handling accelerated and constant + * movement along with gravity. + */ +class Physic +{ +public: + Physic(); + ~Physic(); -enum { - PH_VT, /* Vertical throw.*/ - PH_HA /* Horizontal acceleration. */ -}; + /** resets all velocities and accelerations to 0 */ + void reset(); -/* Physic type: */ + /** sets velocity to a fixed value */ + void set_velocity(float vx, float vy); -struct physic_type - { - int state; - float start_vy; - float start_vx; - float acceleration; - unsigned int start_time; + float get_velocity_x(); + float get_velocity_y(); + + /** sets acceleration applied to the object. (Note that gravity is + * eventually added to the vertical acceleration) + */ + void set_acceleration(float ax, float ay); + + float get_acceleration_x(); + float get_acceleration_y(); + + /** enables or disables handling of gravity */ + void enable_gravity(bool gravity_enabled); + + /** applies the physical simulation to given x and y coordinates */ + void apply(float &x, float &y); + +private: + /// horizontal and vertical acceleration + float ax, ay; + /// horizontal and vertical velocity + float vx, vy; + /// should we respect gravity in out calculations? + bool gravity_enabled; }; /* global variables. */ extern float gravity; -void physic_init(physic_type* pphysic); -int physic_get_state(physic_type* pphysic); -void physic_set_state(physic_type* pphysic, int nstate); -void physic_set_start_vy(physic_type* pphysic, float start_vy); -void physic_set_start_vx(physic_type* pphysic, float start_vx); -void physic_set_acceleration(physic_type* pphysic, float acceleration); -int physic_is_set(physic_type* pphysic); -float physic_get_velocity(physic_type* pphysic); -float physic_get_max_distance(physic_type* pphysic); -unsigned int physic_get_max_time(physic_type* pphysic); -unsigned int physic_get_time_gone(physic_type* pphysic); - #endif /*SUPERTUX_PHYSIC_H*/ Index: physic.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/physic.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- physic.cpp 22 Mar 2004 15:47:31 -0000 1.3 +++ physic.cpp 4 Apr 2004 00:32:10 -0000 1.4 @@ -9,75 +9,86 @@ // Copyright: See COPYING file that comes with this distribution // // - #include <stdio.h> + +#include "scene.h" #include "defines.h" #include "physic.h" +#include "timer.h" float gravity; -void physic_init(physic_type* pphysic) +Physic::Physic() + : ax(0), ay(0), vx(0), vy(0), gravity_enabled(true) { - pphysic->state = -1; - pphysic->start_time = 0; - pphysic->start_vy = 0; } -int physic_get_state(physic_type* pphysic) +Physic::~Physic() { - return pphysic->state; } -void physic_set_state(physic_type* pphysic, int nstate) +void +Physic::reset() { - pphysic->state = nstate; - pphysic->start_time = st_get_ticks(); + ax = ay = vx = vy = 0; + gravity_enabled = true; } -void physic_set_start_vy(physic_type* pphysic, float start_vy) +void +Physic::set_velocity(float nvx, float nvy) { - pphysic->start_vy = start_vy; + vx = nvx; + vy = -nvy; } -void physic_set_start_vx(physic_type* pphysic, float start_vx) +float +Physic::get_velocity_x() { - pphysic->start_vx = start_vx; + return vx; } -void physic_set_acceleration(physic_type* pphysic, float acceleration) +float +Physic::get_velocity_y() { - pphysic->acceleration = acceleration; + return -vy; } - -int physic_is_set(physic_type* pphysic) +void +Physic::set_acceleration(float nax, float nay) { - return (pphysic->state != -1); + ax = nax; + ay = -nay; } -float physic_get_velocity(physic_type* pphysic) +float +Physic::get_acceleration_x() { - if(pphysic->state == PH_VT) - return - (pphysic->start_vy - gravity* ((float)(st_get_ticks() - pphysic->start_time))/1000.); - else if(pphysic->state == PH_HA) - return - (pphysic->start_vx - pphysic->acceleration * ((float)(st_get_ticks() - pphysic->start_time))/1000.); - else - return 0; + return ax; } -float physic_get_max_distance(physic_type* pphysic) +float +Physic::get_acceleration_y() { - return (pphysic->start_vy * pphysic->start_vy / 2.*gravity); + return -ay; } -unsigned int physic_get_max_time(physic_type* pphysic) +void +Physic::enable_gravity(bool enable_gravity) { - return (unsigned int)((pphysic->start_vy / gravity) * 1000); + gravity_enabled = enable_gravity; } -unsigned int physic_get_time_gone(physic_type* pphysic) +void +Physic::apply(float &x, float &y) { - return st_get_ticks() - pphysic->start_time; -} - + float grav; + if(gravity_enabled) + grav = gravity / 100.0; + else + grav = 0; + x += vx * frame_ratio + ax * frame_ratio * frame_ratio; + y += vy * frame_ratio + (ay + grav) * frame_ratio * frame_ratio; + vx += ax * frame_ratio; + vy += (ay + grav) * frame_ratio; +} Index: collision.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/collision.cpp,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- collision.cpp 28 Mar 2004 21:42:04 -0000 1.9 +++ collision.cpp 4 Apr 2004 00:32:10 -0000 1.10 @@ -244,6 +244,8 @@ } } + if(tux.dying != DYING_NOT) return; + // CO_BADGUY & CO_PLAYER check for(unsigned int i = 0; i < bad_guys.size(); ++i) { @@ -257,7 +259,7 @@ if (tux.previous_base.y < tux.base.y && tux.previous_base.y + tux.previous_base.height < bad_guys[i].base.y + bad_guys[i].base.height/2) { - bad_guys[i].collision(&tux, CO_PLAYER, COLLISION_SQUICH); + bad_guys[i].collision(&tux, CO_PLAYER, COLLISION_SQUISH); } else { Index: badguy.h =================================================================== RCS file: /cvsroot/super-tux/supertux/src/badguy.h,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- badguy.h 29 Mar 2004 13:24:41 -0000 1.19 +++ badguy.h 4 Apr 2004 00:32:10 -0000 1.20 @@ -39,7 +39,12 @@ BOMB_EXPLODE, STALACTITE_SHAKING, - STALACTITE_FALL + STALACTITE_FALL, + + FISH_WAIT, + + FLY_UP, + FLY_DOWN }; /* Bad guy kinds: */ @@ -50,7 +55,12 @@ BAD_MRBOMB, BAD_BOMB, BAD_STALACTITE, - BAD_FLAME + BAD_FLAME, + BAD_FISH, + BAD_BOUNCINGSNOWBALL, + BAD_FLYINGSNOWBALL, + BAD_SPIKY, + BAD_SNOWBALL }; BadGuyKind badguykind_from_string(const std::string& str); @@ -76,18 +86,26 @@ /* Badguy type: */ class BadGuy { - public: - int mode; +public: DyingType dying; + base_type base; BadGuyKind kind; - bool seen; + int mode; int dir; - base_type base; + +private: + bool seen; base_type old_base; timer_type timer; - physic_type physic; + Physic physic; - public: + texture_type* texture_left; + texture_type* texture_right; + int animation_offset; + size_t animation_length; + float animation_speed; + +public: void init(float x, float y, BadGuyKind kind); void action(); @@ -95,36 +113,49 @@ void collision(void* p_c_object, int c_object, CollisionType type = COLLISION_NORMAL); - - private: - void fall(bool dojump=false); - void remove_me(); + /** this functions tries to kill the badguy and lets him fall off the + * screen. Some badguys like the flame might ignore this. + */ + void kill_me(); + +private: void action_bsod(); - void draw_bsod(); - void action_laptop(); - void draw_laptop(); - void action_money(); - void draw_money(); - void action_bomb(); - void draw_bomb(); - void action_mrbomb(); - void draw_mrbomb(); - void action_stalactite(); - void draw_stalactite(); - void action_flame(); - void draw_flame(); + void action_fish(); + void action_bouncingsnowball(); + void action_flyingsnowball(); + void action_spiky(); + void action_snowball(); + /** handles falling down. disables gravity calculation when we're back on + * ground */ + void fall(); + /** remove ourself from the list of badguys. WARNING! This function will + * invalidate all members. So don't do anything else with member after calling + * this. + */ + void remove_me(); + /** let the player jump a bit (used when you hit a badguy) */ void make_player_jump(Player* player); + /** check if we're running left or right in a wall and eventually change + * direction + */ void check_horizontal_bump(bool checkcliff = false); + /** called when we're bumped from below with a block */ void bump(); - void squich(Player* player); + /** called when a player jumped on the badguy from above */ + void squish(Player* player); + /** squish ourself, give player score and set dying to DYING_SQICHED */ + void squish_me(Player* player); + /** set image of the badguy */ + void set_texture(texture_type* left, texture_type* right, + int animlength = 1, float animspeed = 1); }; #endif /*SUPERTUX_BADGUY_H*/ Index: timer.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/timer.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- timer.cpp 24 Mar 2004 21:43:56 -0000 1.5 +++ timer.cpp 4 Apr 2004 00:32:10 -0000 1.6 @@ -19,7 +19,7 @@ unsigned int st_get_ticks(void) { if(st_pause_count != 0) - return SDL_GetTicks() - st_pause_ticks - SDL_GetTicks() + st_pause_count; + return /*SDL_GetTicks()*/ - st_pause_ticks /*- SDL_GetTicks()*/ + st_pause_count; else return SDL_GetTicks() - st_pause_ticks; } @@ -37,6 +37,9 @@ void st_pause_ticks_stop(void) { +if(st_pause_count == 0) +return; + st_pause_ticks += SDL_GetTicks() - st_pause_count; st_pause_count = 0; } Index: player.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/player.cpp,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- player.cpp 3 Apr 2004 13:31:14 -0000 1.18 +++ player.cpp 4 Apr 2004 00:32:10 -0000 1.19 @@ -9,6 +9,7 @@ // Copyright: See COPYING file that comes with this distribution // // +#include <math.h> #include "gameloop.h" #include "globals.h" @@ -66,7 +67,6 @@ // FIXME: Make the start position configurable via the levelfile base.x = 100; base.y = 240; - base.xm = 0; base.ym = 0; old_base = base; @@ -94,8 +94,7 @@ timer_init(&skidding_timer,true); timer_init(&safe_timer,true); timer_init(&frame_timer,true); - physic_init(&hphysic); - physic_init(&vphysic); + physic.reset(); } int @@ -138,6 +137,9 @@ base.xm = 0; base.ym = 0; old_base = base; + previous_base = base; + + dying = DYING_NOT; player_input_init(&input); @@ -145,8 +147,7 @@ timer_init(&skidding_timer,true); timer_init(&safe_timer,true); timer_init(&frame_timer,true); - physic_init(&hphysic); - physic_init(&vphysic); + physic.reset(); } void @@ -160,12 +161,9 @@ handle_input(); /* Move tux: */ - previous_base = base; - base.x += base.xm * frame_ratio; - base.y += base.ym * frame_ratio; - + physic.apply(base.x, base.y); if (!dying) { @@ -178,36 +176,25 @@ if( !on_ground()) { + physic.enable_gravity(true); if(under_solid()) { - physic_set_state(&vphysic,PH_VT); - physic_set_start_vy(&vphysic,0); + // fall down + physic.set_velocity(physic.get_velocity_x(), 0); jumped_in_solid = true; } - else - { - if(!physic_is_set(&vphysic)) - { - physic_set_state(&vphysic,PH_VT); - physic_set_start_vy(&vphysic,0); - } - } - base.ym = physic_get_velocity(&vphysic); } else { /* Land: */ - - if (base.ym > 0) + if (physic.get_velocity_y() < 0) { base.y = (int)(((int)base.y / 32) * 32); - base.ym = 0; + physic.set_velocity(physic.get_velocity_x(), 0); } - physic_init(&vphysic); - + physic.enable_gravity(false); /* Reset score multiplier (for multi-hits): */ - score_multiplier = 1; } @@ -253,8 +240,6 @@ } } - else - base.ym = physic_get_velocity(&vphysic); timer_check(&safe_timer); @@ -292,7 +277,7 @@ /* Handle skidding: */ - timer_check(&skidding_timer); + // timer_check(&skidding_timer); // disabled /* End of level? */ @@ -322,80 +307,105 @@ void Player::handle_horizontal_input(int newdir) { - if ((newdir ? (base.xm < -SKID_XM) : (base.xm > SKID_XM)) && !timer_started(&skidding_timer) && - dir == !newdir && on_ground()) + if(duck) + return; + + float vx = physic.get_velocity_x(); + float vy = physic.get_velocity_y(); + dir = newdir; + + // skid if we're too fast + if(dir != newdir && on_ground() && fabs(physic.get_velocity_x()) > SKID_XM + && !timer_started(&skidding_timer)) { timer_start(&skidding_timer, SKID_TIME); - play_sound(sounds[SND_SKID], SOUND_CENTER_SPEAKER); - + return; } - dir = newdir; - - if ((newdir ? (base.xm < 0) : (base.xm > 0)) && !isice(base.x, base.y + base.height) && + if ((newdir ? (vx < 0) : (vx > 0)) && !isice(base.x, base.y + base.height) && !timer_started(&skidding_timer)) { - base.xm = 0; + //vx = 0; } - if (!duck) + /* Facing the direction we're jumping? Go full-speed: */ + if (input.fire == UP) { - if (dir == newdir) - { - /* Facing the direction we're jumping? Go full-speed: */ - - if (input.fire == UP) - { - base.xm = base.xm + ( newdir ? WALK_SPEED : -WALK_SPEED) * frame_ratio; - - if(newdir) - { - if (base.xm > MAX_WALK_XM) - base.xm = MAX_WALK_XM; - } - else - { - if (base.xm < -MAX_WALK_XM) - base.xm = -MAX_WALK_XM; - } - } - else if ( input.fire == DOWN) - { - base.xm = base.xm + ( newdir ? RUN_SPEED : -RUN_SPEED) * frame_ratio; + if(vx >= MAX_WALK_XM) { + vx = MAX_WALK_XM; + physic.set_acceleration(0, 0); // enough speedup + } else if(vx <= -MAX_WALK_XM) { + vx = -MAX_WALK_XM; + physic.set_acceleration(0, 0); + } + physic.set_acceleration(newdir ? 0.02 : -0.02, 0); + if(fabs(vx) < 1) // set some basic run speed + vx = newdir ? 1 : -1; +#if 0 + vx += ( newdir ? WALK_SPEED : -WALK_SPEED) * frame_ratio; - if(newdir) - { - if (base.xm > MAX_RUN_XM) - base.xm = MAX_RUN_XM; - } - else - { - if (base.xm < -MAX_RUN_XM) - base.xm = -MAX_RUN_XM; - } - } - else - { - /* Not facing the direction we're jumping? - Go half-speed: */ + if(newdir) + { + if (vx > MAX_WALK_XM) + vx = MAX_WALK_XM; + } + else + { + if (vx < -MAX_WALK_XM) + vx = -MAX_WALK_XM; + } +#endif + } + else if ( input.fire == DOWN) + { + if(vx >= MAX_RUN_XM) { + vx = MAX_RUN_XM; + physic.set_acceleration(0, 0); // enough speedup + } else if(vx <= -MAX_RUN_XM) { + vx = -MAX_RUN_XM; + physic.set_acceleration(0, 0); + } + physic.set_acceleration(newdir ? 0.03 : -0.03, 0); + if(fabs(vx) < 1) // set some basic run speed + vx = newdir ? 1 : -1; - base.xm = base.xm + ( newdir ? (WALK_SPEED / 2) : -(WALK_SPEED / 2)) * frame_ratio; +#if 0 + vx = vx + ( newdir ? RUN_SPEED : -RUN_SPEED) * frame_ratio; - if(newdir) - { - if (base.xm > MAX_WALK_XM / 2) - base.xm = MAX_WALK_XM / 2; - } - else - { - if (base.xm < -MAX_WALK_XM / 2) - base.xm = -MAX_WALK_XM / 2; - } - } + if(newdir) + { + if (vx > MAX_RUN_XM) + vx = MAX_RUN_XM; + } + else + { + if (vx < -MAX_RUN_XM) + vx = -MAX_RUN_XM; } +#endif + } + else + { +#if 0 + /* Not facing the direction we're jumping? + Go half-speed: */ + vx = vx + ( newdir ? (WALK_SPEED / 2) : -(WALK_SPEED / 2)) * frame_ratio; + if(newdir) + { + if (vx > MAX_WALK_XM / 2) + vx = MAX_WALK_XM / 2; + } + else + { + if (vx < -MAX_WALK_XM / 2) + vx = -MAX_WALK_XM / 2; + } +#endif } + + physic.set_velocity(vx, vy); } void @@ -405,45 +415,22 @@ { if (on_ground()) { - if(!physic_is_set(&vphysic)) - { - physic_set_state(&vphysic,PH_VT); - physic_set_start_vy(&vphysic,5.5); - --base.y; - jumping = true; - if (size == SMALL) - play_sound(sounds[SND_JUMP], SOUND_CENTER_SPEAKER); - else - play_sound(sounds[SND_BIGJUMP], SOUND_CENTER_SPEAKER); - } + // jump + physic.set_velocity(physic.get_velocity_x(), 5.5); + --base.y; + jumping = true; + if (size == SMALL) + play_sound(sounds[SND_JUMP], SOUND_CENTER_SPEAKER); + else + play_sound(sounds[SND_BIGJUMP], SOUND_CENTER_SPEAKER); } } else if(input.up == UP && jumping) { - if (on_ground()) - { - physic_init(&vphysic); - jumping = false; - } - else - { - jumping = false; - if(physic_is_set(&vphysic)) - { - if(physic_get_velocity(&vphysic) < 0.) - { - physic_set_state(&vphysic,PH_VT); - physic_set_start_vy(&vphysic,0); - } - } - else - { - if(!physic_is_set(&vphysic)) - { - physic_set_state(&vphysic,PH_VT); - } - } - } + jumping = false; + if(physic.get_velocity_y() > 0) { + physic.set_velocity(physic.get_velocity_x(), 0); + } } } @@ -463,18 +450,15 @@ } else { - if(base.xm > 0) - { - base.xm = (int)(base.xm - frame_ratio); - if(base.xm < 0) - base.xm = 0; - } - else if(base.xm < 0) - { - base.xm = (int)(base.xm + frame_ratio); - if(base.xm > 0) - base.xm = 0; - } + float vx = physic.get_velocity_x(); + if(fabs(vx) < 0.01) { + physic.set_velocity(0, physic.get_velocity_y()); + physic.set_acceleration(0, 0); + } else if(vx < 0) { + physic.set_acceleration(0.1, 0); + } else { + physic.set_acceleration(-0.1, 0); + } } } @@ -489,7 +473,7 @@ if (input.fire == DOWN && input.old_fire == UP && got_coffee) { - add_bullet(base.x, base.y, base.xm, dir); + add_bullet(base.x, base.y, physic.get_velocity_x(), dir); } @@ -659,7 +643,7 @@ { if (!timer_started(&skidding_timer)) { - if (!jumping || base.ym > 0) + if (!jumping || physic.get_velocity_y() > 0) { if (dir == RIGHT) { @@ -720,7 +704,7 @@ { if (!timer_started(&skidding_timer)) { - if (!jumping || base.ym > 0) + if (!jumping || physic.get_velocity_y() > 0) { if (dir == RIGHT) { @@ -775,6 +759,7 @@ } } } + if(dying) text_drawf(&gold_text,"Penguins can fly !:",0,0,A_HMIDDLE,A_VMIDDLE,1); } @@ -794,60 +779,34 @@ !timer_started(&safe_timer) && pbad_c->mode != HELD) { - if (pbad_c->mode == FLAT && input.fire != DOWN) - { - /* Kick: */ - - pbad_c->mode = KICK; - play_sound(sounds[SND_KICK], SOUND_CENTER_SPEAKER); - - if (base.x < pbad_c->base.x + (pbad_c->base.width/2)) - { - pbad_c->dir = RIGHT; - pbad_c->base.x = pbad_c->base.x + 16; - } - else - { - pbad_c->dir = LEFT; - pbad_c->base.x = pbad_c->base.x - 32; - } - - timer_start(&pbad_c->timer,5000); - } - else if (pbad_c->mode == FLAT && input.fire == DOWN) + if (pbad_c->mode == FLAT && input.fire == DOWN) { pbad_c->mode = HELD; pbad_c->base.y-=8; } else if (pbad_c->mode == KICK) { - if (base.y < pbad_c->base.y - 16 && - timer_started(&pbad_c->timer)) + if (base.y < pbad_c->base.y - 16) { /* Step on (stop being kicked) */ pbad_c->mode = FLAT; play_sound(sounds[SND_STOMP], SOUND_CENTER_SPEAKER); - timer_start(&pbad_c->timer, 10000); } else { /* Hurt if you get hit by kicked laptop: */ - - if (timer_started(&pbad_c->timer)) + if (!timer_started(&invincible_timer)) { - if (!timer_started(&invincible_timer)) - { - kill(SHRINK); - } - else - { - pbad_c->dying = DYING_FALLING; - play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER); - add_score(pbad_c->base.x - scroll_x, - pbad_c->base.y, - 25 * score_multiplier); - } + kill(SHRINK); + } + else + { + pbad_c->dying = DYING_FALLING; + play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER); + add_score(pbad_c->base.x - scroll_x, + pbad_c->base.y, + 25 * score_multiplier); } } } @@ -859,11 +818,7 @@ } else { - pbad_c->dying = DYING_FALLING; - play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER); - add_score(pbad_c->base.x - scroll_x, - pbad_c->base.y, - 25 * score_multiplier); + pbad_c->kill_me(); } } score_multiplier++; @@ -880,10 +835,9 @@ void Player::kill(int mode) { - play_sound(sounds[SND_HURT], SOUND_CENTER_SPEAKER); - base.xm = 0; + physic.set_velocity(0, physic.get_velocity_y()); if (mode == SHRINK && size == BIG) { @@ -899,8 +853,10 @@ { if(size == BIG) duck = true; - physic_set_state(&vphysic,PH_VT); - physic_set_start_vy(&vphysic,7); + + physic.enable_gravity(true); + physic.set_acceleration(0, 0); + physic.set_velocity(0, 7); dying = DYING_SQUISHED; } } @@ -908,8 +864,6 @@ void Player::is_dying() { - base.ym = base.ym + gravity; - /* He died :^( */ --lives; Index: badguy.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/badguy.cpp,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- badguy.cpp 29 Mar 2004 13:24:41 -0000 1.18 +++ badguy.cpp 4 Apr 2004 00:32:10 -0000 1.19 @@ -16,15 +16,16 @@ #include "badguy.h" #include "scene.h" #include "screen.h" +#include "tile.h" -texture_type img_bsod_squished_left; -texture_type img_bsod_squished_right; -texture_type img_bsod_falling_left; -texture_type img_bsod_falling_right; -texture_type img_laptop_flat_left; -texture_type img_laptop_flat_right; [...1336 lines suppressed...] + } + texture_free(&img_bouncingsnowball_squished[0]); + + texture_free(&img_flyingsnowball[0]); + texture_free(&img_flyingsnowball[1]); + texture_free(&img_flyingsnowball_squished[0]); + + for(int i = 0; i<3; ++i) { + texture_free(&img_spiky_left[i]); + texture_free(&img_spiky_right[i]); + } + for(int i = 0; i<3; ++i) { + texture_free(&img_snowball_left[i]); + texture_free(&img_snowball_right[i]); + } + texture_free(&img_snowball_squished_left[0]); + texture_free(&img_snowball_squished_right[0]); } // EOF // Index: title.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/title.cpp,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- title.cpp 28 Mar 2004 01:00:16 -0000 1.15 +++ title.cpp 4 Apr 2004 00:32:10 -0000 1.16 @@ -84,13 +84,12 @@ Player titletux; titletux.init(); st_pause_ticks_init(); - st_pause_ticks_stop(); level_load(¤t_level, (datadir + "/levels/misc/menu.stl").c_str()); loadshared(); activate_particle_systems(); /* Lower the gravity that tux doesn't jump to hectically through the demo */ - gravity = 5; + //gravity = 5; /* Reset menu variables */ menu_reset(); @@ -301,6 +300,10 @@ } } } + // reset tux + scroll_x = 0; + titletux.level_begin(); + update_time = st_get_ticks(); break; case 3: update_load_save_game_menu(load_game_menu, true); Index: tile.cpp =================================================================== RCS file: /cvsroot/super-tux/supertux/src/tile.cpp,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- tile.cpp 3 Apr 2004 13:31:14 -0000 1.9 +++ tile.cpp 4 Apr 2004 00:32:10 -0000 1.10 @@ -46,6 +46,7 @@ tile->solid = false; tile->brick = false; tile->ice = false; + tile->water = false; tile->fullbox = false; tile->distro = false; tile->data = 0; @@ -57,6 +58,7 @@ reader.read_bool("solid", &tile->solid); reader.read_bool("brick", &tile->brick); reader.read_bool("ice", &tile->ice); + reader.read_bool("water", &tile->water); reader.read_bool("fullbox", &tile->fullbox); reader.read_bool("distro", &tile->distro); reader.read_int("data", &tile->data); Index: button.h =================================================================== RCS file: /cvsroot/super-tux/supertux/src/button.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- button.h 3 Apr 2004 13:31:14 -0000 1.11 +++ button.h 4 Apr 2004 00:32:10 -0000 1.12 @@ -42,6 +42,7 @@ } private: + static timer_type popup_timer; texture_type icon; texture_type* bkgd; std::string info; |