#include "main.hpp"
#include "badguy/badguy.hpp"
#include "player_status.hpp"
+#include "msg.hpp"
static const int TILES_FOR_BUTTJUMP = 3;
static const float SHOOTING_TIME = .150;
: player_status(_player_status), grabbed_object(0)
{
controller = main_controller;
- smalltux_gameover = sprite_manager->create("smalltux-gameover");
- smalltux_star = sprite_manager->create("smalltux-star");
- bigtux_star = sprite_manager->create("bigtux-star");
+ smalltux_gameover = sprite_manager->create("images/creatures/tux_small/smalltux-gameover.sprite");
+ smalltux_star = sprite_manager->create("images/creatures/tux_small/smalltux-star.sprite");
+ bigtux_star = sprite_manager->create("images/creatures/tux_big/bigtux-star.sprite");
init();
}
on_ground_flag = false;
grabbed_object = 0;
+ floor_normal = Vector(0,-1);
+
physic.reset();
}
void
Player::update(float elapsed_time)
{
+ // do we need to enable gravity again?
+ if(on_ground_flag) {
+ Rect lower = bbox;
+ lower.move(Vector(0, 4.0));
+ if(Sector::current()->is_free_space(lower)) {
+ physic.enable_gravity(true);
+ on_ground_flag = false;
+ }
+ }
+
if(dying && dying_timer.check()) {
dead = true;
return;
}
- // fixes the "affected even while blinking" bug
- if (safe_timer.started() && this->get_group() != COLGROUP_MOVING_ONLY_STATIC) {
- this->set_group(COLGROUP_MOVING_ONLY_STATIC);
- }
- else if (!safe_timer.started() && this->get_group() == COLGROUP_MOVING_ONLY_STATIC) {
- this->set_group(COLGROUP_MOVING);
- }
-
if(!controller->hold(Controller::ACTION) && grabbed_object) {
// move the grabbed object a bit away from tux
Vector pos = get_pos() +
if(moving_object) {
moving_object->set_pos(pos);
} else {
-#ifdef DEBUG
- std::cout << "Non MovingObjetc grabbed?!?\n";
-#endif
+ msg_debug("Non MovingObjetc grabbed?!?");
}
grabbed_object->ungrab(*this, dir);
grabbed_object = 0;
handle_input();
movement = physic.get_movement(elapsed_time);
- on_ground_flag = false;
#if 0
// special exception for cases where we're stuck under tiles after
// extend/shrink tux collision rectangle so that we fall through/walk over 1
// tile holes
if(fabsf(vx) > MAX_WALK_XM) {
- bbox.set_width(33);
+ bbox.set_width(34);
} else {
bbox.set_width(31.8);
}
+ // on downward slopes, adjust vertical velocity to match slope angle
+ if (on_ground()) {
+ if (floor_normal.y != 0) {
+ if ((floor_normal.x * vx) > 0) {
+ // we overdo it a little, just to be on the safe side
+ vy = vx * (floor_normal.x / floor_normal.y) * 2;
+ }
+ }
+ }
+
physic.set_velocity(vx, vy);
physic.set_acceleration(ax, ay);
}
if(physic.get_velocity_y() < 0)
physic.set_velocity_y(0);
on_ground_flag = true;
+
+ // remember normal of this tile
+ if (hit.normal.y > -0.9) {
+ floor_normal.x = hit.normal.x;
+ floor_normal.y = hit.normal.y;
+ } else {
+ // slowly adjust to unisolid tiles.
+ // Necessary because our bounding box sometimes reaches through slopes and thus hits unisolid tiles
+ floor_normal.x = (floor_normal.x * 0.9) + (hit.normal.x * 0.1);
+ floor_normal.y = (floor_normal.y * 0.9) + (hit.normal.y * 0.1);
+ }
+
+ // disable gravity
+ physic.enable_gravity(false);
} else if(hit.normal.y > 0) { // bumped against the roof
physic.set_velocity_y(.1);
}
}
BadGuy* badguy = dynamic_cast<BadGuy*> (&other);
- if(badguy != NULL)
+ if(badguy != NULL) {
+ if(safe_timer.started())
+ return FORCE_MOVE;
+
return CONTINUE;
+ }
return FORCE_MOVE;
}
bbox.set_size(31.8, 63.8);
else
bbox.set_size(31.8, 31.8);
- on_ground_flag = false;
duck = false;
last_ground_y = vector.y;