X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fplayer.cpp;h=b3e1831ec78c6a091364d1f16ed3c68b5d23a206;hb=84160722392a024dda42bd86ca9bd85b68c49457;hp=0a5de95d8b8890bcfd1aaeef11c5c01fd83899b7;hpb=997685a947eaa0b269873e5956908b734cde1d76;p=supertux.git diff --git a/src/player.cpp b/src/player.cpp index 0a5de95d8..b3e1831ec 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -1,14 +1,22 @@ +// $Id$ // -// C Implementation: player/tux +// SuperTux - A Jump'n Run +// Copyright (C) 2003 Tobias Glaesser // -// Description: -// -// -// Author: Tobias Glaesser & Bill Kendrick, (C) 2004 -// -// Copyright: See COPYING file that comes with this distribution +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. // +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. // +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + #include #include "gameloop.h" @@ -17,6 +25,7 @@ #include "defines.h" #include "scene.h" #include "tile.h" +#include "sprite.h" #include "screen.h" Surface* tux_life; @@ -27,12 +36,12 @@ Surface* smalltux_jump_right; Surface* smalltux_stand_left; Surface* smalltux_stand_right; -Surface* bigtux_right[3]; -Surface* bigtux_left[3]; -Surface* bigtux_right_jump; -Surface* bigtux_left_jump; -Surface* ducktux_right; -Surface* ducktux_left; +Sprite* bigtux_right; +Sprite* bigtux_left; +Sprite* bigtux_right_jump; +Sprite* bigtux_left_jump; +Sprite* ducktux_right; +Sprite* ducktux_left; Surface* skidtux_right; Surface* skidtux_left; Surface* firetux_right[3]; @@ -63,15 +72,16 @@ void player_input_init(player_input_type* pplayer_input) void Player::init() { + Level* plevel = World::current()->get_level(); + base.width = 32; base.height = 32; size = SMALL; got_coffee = false; - // FIXME: Make the start position configurable via the levelfile - base.x = 100; - base.y = 240; + base.x = plevel->start_pos_x; + base.y = plevel->start_pos_y; base.xm = 0; base.ym = 0; previous_base = old_base = base; @@ -136,7 +146,7 @@ void Player::level_begin() { base.x = 100; - base.y = 240; + base.y = 170; base.xm = 0; base.ym = 0; previous_base = old_base = base; @@ -281,13 +291,6 @@ Player::action(double frame_ratio) play_current_music(); } - /* End of level? */ - if (base.x >= World::current()->get_level()->endpos - && World::current()->get_level()->endpos != 0) - { - player_status.next_level = 1; - } - // check some timers skidding_timer.check(); invincible_timer.check(); @@ -319,10 +322,10 @@ Player::handle_horizontal_input() float ay = physic.get_acceleration_y(); float dirsign = 0; - if(!duck && input.left == DOWN && input.right == UP) { + if(input.left == DOWN && input.right == UP && (!duck || physic.get_velocity_y() != 0)) { dir = LEFT; dirsign = -1; - } else if(!duck && input.left == UP && input.right == DOWN) { + } else if(input.left == UP && input.right == DOWN && (!duck || physic.get_velocity_y() != 0)) { dir = RIGHT; dirsign = 1; } @@ -399,7 +402,7 @@ Player::handle_vertical_input() { if(input.up == DOWN) { - if (on_ground() && !duck) + if (on_ground()) { // jump physic.set_velocity(physic.get_velocity_x(), 5.5); @@ -463,7 +466,7 @@ Player::handle_input() } /* Duck! */ - if (input.down == DOWN && size == BIG && !duck) + if (input.down == DOWN && size == BIG && !duck && physic.get_velocity_y() == 0) { duck = true; base.height = 32; @@ -471,7 +474,7 @@ Player::handle_input() // changing base size confuses collision otherwise old_base = previous_base = base; } - else if(input.down == UP && size == BIG && duck) + else if(input.down == UP && size == BIG && duck && physic.get_velocity_y() == 0) { duck = false; base.y -= 32; @@ -523,14 +526,9 @@ Player::draw() /* Draw cape: */ if (dir == RIGHT) - { - cape_right[global_frame_counter % 2]->draw(base.x- scroll_x, base.y); - } + cape_right[global_frame_counter % 2]->draw(base.x- scroll_x, base.y); else - { - cape_left[global_frame_counter % 2]->draw( - base.x- scroll_x, base.y); - } + cape_left[global_frame_counter % 2]->draw(base.x- scroll_x, base.y); } @@ -555,11 +553,9 @@ Player::draw() else // moving { if (dir == RIGHT) - tux_right[(global_frame_counter/2) % tux_right.size()]->draw( - base.x - scroll_x, base.y - 9); + tux_right[(global_frame_counter/2) % tux_right.size()]->draw(base.x - scroll_x, base.y - 9); else - tux_left[(global_frame_counter/2) % tux_left.size()]->draw( - base.x - scroll_x, base.y - 9); + tux_left[(global_frame_counter/2) % tux_left.size()]->draw(base.x - scroll_x, base.y - 9); } } } @@ -587,15 +583,9 @@ Player::draw() /* Draw cape (just not in ducked mode since that looks silly): */ if (dir == RIGHT) - { - bigcape_right[global_frame_counter % 2]->draw( - capex, capey); - } + bigcape_right[global_frame_counter % 2]->draw(capex, capey); else - { - bigcape_left[global_frame_counter % 2]->draw( - capex, capey); - } + bigcape_left[global_frame_counter % 2]->draw(capex, capey); } if (!got_coffee) @@ -604,57 +594,35 @@ Player::draw() { if (!skidding_timer.started()) { - if (!jumping || physic.get_velocity_y() > 0) + if (physic.get_velocity_y() == 0) { if (dir == RIGHT) - { - bigtux_right[frame_]->draw( - base.x- scroll_x - 8, base.y); - } + bigtux_right->draw(base.x - scroll_x, base.y); else - { - bigtux_left[frame_]->draw( - base.x- scroll_x - 8, base.y); - } + bigtux_left->draw(base.x - scroll_x, base.y); } else { if (dir == RIGHT) - { - bigtux_right_jump->draw( - base.x- scroll_x - 8, base.y); - } + bigtux_right_jump->draw(base.x - scroll_x, base.y); else - { - bigtux_left_jump->draw( - base.x- scroll_x - 8, base.y); - } + bigtux_left_jump->draw(base.x - scroll_x, base.y); } } else { if (dir == RIGHT) - { - skidtux_right->draw( - base.x- scroll_x - 8, base.y); - } + skidtux_right->draw(base.x - scroll_x - 8, base.y); else - { - skidtux_left->draw( - base.x- scroll_x - 8, base.y); - } + skidtux_left->draw(base.x - scroll_x - 8, base.y); } } else { if (dir == RIGHT) - { - ducktux_right->draw( base.x- scroll_x - 8, base.y - 16); - } + ducktux_right->draw(base.x - scroll_x, base.y); else - { - ducktux_left->draw( base.x- scroll_x - 8, base.y - 16); - } + ducktux_left->draw(base.x - scroll_x, base.y); } } else @@ -667,54 +635,32 @@ Player::draw() if (!jumping || physic.get_velocity_y() > 0) { if (dir == RIGHT) - { - bigfiretux_right[frame_]->draw( - base.x- scroll_x - 8, base.y); - } + bigfiretux_right[frame_]->draw(base.x- scroll_x - 8, base.y); else - { - bigfiretux_left[frame_]->draw( - base.x- scroll_x - 8, base.y); - } + bigfiretux_left[frame_]->draw(base.x- scroll_x - 8, base.y); } else { if (dir == RIGHT) - { - bigfiretux_right_jump->draw( - base.x- scroll_x - 8, base.y); - } + bigfiretux_right_jump->draw(base.x- scroll_x - 8, base.y); else - { - bigfiretux_left_jump->draw( - base.x- scroll_x - 8, base.y); - } + bigfiretux_left_jump->draw(base.x- scroll_x - 8, base.y); } } else { if (dir == RIGHT) - { - skidfiretux_right->draw( - base.x- scroll_x - 8, base.y); - } + skidfiretux_right->draw(base.x- scroll_x - 8, base.y); else - { - skidfiretux_left->draw( - base.x- scroll_x - 8, base.y); - } + skidfiretux_left->draw(base.x- scroll_x - 8, base.y); } } else { if (dir == RIGHT) - { - duckfiretux_right->draw( base.x- scroll_x - 8, base.y - 16); - } + duckfiretux_right->draw( base.x- scroll_x - 8, base.y - 16); else - { - duckfiretux_left->draw( base.x- scroll_x - 8, base.y - 16); - } + duckfiretux_left->draw( base.x- scroll_x - 8, base.y - 16); } } } @@ -733,8 +679,8 @@ Player::collision(void* p_c_object, int c_object) { case CO_BADGUY: pbad_c = (BadGuy*) p_c_object; - /* Hurt the player if he just touched it: */ + /* Hurt player if he touches a badguy */ if (!pbad_c->dying && !dying && !safe_timer.started() && pbad_c->mode != HELD) @@ -744,30 +690,24 @@ Player::collision(void* p_c_object, int c_object) pbad_c->mode = HELD; pbad_c->base.y-=8; } + else if (pbad_c->mode == FLAT) + { + // Don't get hurt if we're kicking a flat badguy! + } else if (pbad_c->mode == KICK) { - if (base.y < pbad_c->base.y - 16) + /* Hurt if you get hit by kicked laptop: */ + if (!invincible_timer.started()) { - /* Step on (stop being kicked) */ - - pbad_c->mode = FLAT; - play_sound(sounds[SND_STOMP], SOUND_CENTER_SPEAKER); + kill(SHRINK); } else { - /* Hurt if you get hit by kicked laptop: */ - if (!invincible_timer.started()) - { - kill(SHRINK); - } - else - { - pbad_c->dying = DYING_FALLING; - play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER); - World::current()->add_score(pbad_c->base.x - scroll_x, - pbad_c->base.y, - 25 * player_status.score_multiplier); - } + pbad_c->dying = DYING_FALLING; + play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER); + World::current()->add_score(pbad_c->base.x - scroll_x, + pbad_c->base.y, + 25 * player_status.score_multiplier); } } else @@ -822,9 +762,6 @@ Player::kill(int mode) void Player::is_dying() { - /* He died :^( */ - - --player_status.lives; remove_powerups(); dying = DYING_NOT; }