X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fplayer.cpp;h=b3e1831ec78c6a091364d1f16ed3c68b5d23a206;hb=84160722392a024dda42bd86ca9bd85b68c49457;hp=d9d476ea56fe60ed3c3df54646bb2b51c836b2b9;hpb=05bbe471f28d4ce4f9666ca7e78c7b6ef8697066;p=supertux.git diff --git a/src/player.cpp b/src/player.cpp index d9d476ea5..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 = 170; + base.x = plevel->start_pos_x; + base.y = plevel->start_pos_y; base.xm = 0; base.ym = 0; previous_base = old_base = base; @@ -312,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; } @@ -392,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); @@ -456,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; @@ -464,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; @@ -516,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); } @@ -548,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); } } } @@ -580,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) @@ -597,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 @@ -660,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); } } }