projects
/
supertux.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Only draw Tux' arm in front of other objects if he's actually holding something ...
[supertux.git]
/
src
/
object
/
player.cpp
diff --git
a/src/object/player.cpp
b/src/object/player.cpp
index
2fd96fe
..
b332cae
100644
(file)
--- a/
src/object/player.cpp
+++ b/
src/object/player.cpp
@@
-51,25
+51,40
@@
#include "object/sprite_particle.hpp"
#include "trigger/climbable.hpp"
#include "object/sprite_particle.hpp"
#include "trigger/climbable.hpp"
+//#define DO_SWIMMING
+
static const int TILES_FOR_BUTTJUMP = 3;
static const float SHOOTING_TIME = .150f;
/// time before idle animation starts
static const float IDLE_TIME = 2.5f;
static const int TILES_FOR_BUTTJUMP = 3;
static const float SHOOTING_TIME = .150f;
/// time before idle animation starts
static const float IDLE_TIME = 2.5f;
+/** acceleration in horizontal direction when walking
+ * (all acceleratiosn are in pixel/s^2) */
static const float WALK_ACCELERATION_X = 300;
static const float WALK_ACCELERATION_X = 300;
+/** acceleration in horizontal direction when running */
static const float RUN_ACCELERATION_X = 400;
static const float RUN_ACCELERATION_X = 400;
+/** acceleration when skidding */
static const float SKID_XM = 200;
static const float SKID_XM = 200;
+/** time of skidding in seconds */
static const float SKID_TIME = .3f;
static const float SKID_TIME = .3f;
+/** maximum walk velocity (pixel/s) */
static const float MAX_WALK_XM = 230;
static const float MAX_WALK_XM = 230;
+/** maximum run velcoity (pixel/s) */
static const float MAX_RUN_XM = 320;
static const float MAX_RUN_XM = 320;
+/** maximum horizontal climb velocity */
static const float MAX_CLIMB_XM = 48;
static const float MAX_CLIMB_XM = 48;
+/** maximum vertical climb velocity */
static const float MAX_CLIMB_YM = 128;
static const float MAX_CLIMB_YM = 128;
+/** instant velocity when tux starts to walk */
static const float WALK_SPEED = 100;
static const float WALK_SPEED = 100;
+/** time of the kick (kicking mriceblock) animation */
static const float KICK_TIME = .3f;
static const float KICK_TIME = .3f;
+/** time of tux cheering (currently unused) */
static const float CHEER_TIME = 1.0f;
static const float CHEER_TIME = 1.0f;
-static const float UNDUCK_HURT_TIME = 0.25f; /**< if Tux cannot unduck for this long, he will get hurt */
+/** if Tux cannot unduck for this long, he will get hurt */
+static const float UNDUCK_HURT_TIME = 0.25f;
// growing animation
Surface* growingtux_left[GROWING_FRAMES];
// growing animation
Surface* growingtux_left[GROWING_FRAMES];
@@
-99,16
+114,16
@@
TuxBodyParts::set_action(std::string action, int loops)
}
void
}
void
-TuxBodyParts::draw(DrawingContext& context, const Vector& pos, int layer)
+TuxBodyParts::draw(DrawingContext& context, const Vector& pos, int layer
, Portable* grabbed_object
)
{
if(head != NULL)
{
if(head != NULL)
- head->draw(context, pos, layer-
1
);
+ head->draw(context, pos, layer-
2
);
if(body != NULL)
if(body != NULL)
- body->draw(context, pos, layer-
3
);
+ body->draw(context, pos, layer-
4
);
if(arms != NULL)
if(arms != NULL)
- arms->draw(context, pos, layer
+10
);
+ arms->draw(context, pos, layer
-1 + (grabbed_object?10:0)
);
if(feet != NULL)
if(feet != NULL)
- feet->draw(context, pos, layer-
2
);
+ feet->draw(context, pos, layer-
3
);
}
Player::Player(PlayerStatus* _player_status, const std::string& name)
}
Player::Player(PlayerStatus* _player_status, const std::string& name)
@@
-588,11
+603,13
@@
Player::handle_vertical_input()
// swimming
physic.set_acceleration_y(0);
// swimming
physic.set_acceleration_y(0);
+#ifdef SWIMMING
if (swimming) {
if (controller->hold(Controller::UP) || controller->hold(Controller::JUMP))
physic.set_acceleration_y(-2000);
physic.set_velocity_y(physic.get_velocity_y() * 0.94);
}
if (swimming) {
if (controller->hold(Controller::UP) || controller->hold(Controller::JUMP))
physic.set_acceleration_y(-2000);
physic.set_velocity_y(physic.get_velocity_y() * 0.94);
}
+#endif
}
void
}
void
@@
-614,12
+631,24
@@
Player::handle_input()
if( controller->released( Controller::PEEK_RIGHT ) ) {
peeking = AUTO;
}
if( controller->released( Controller::PEEK_RIGHT ) ) {
peeking = AUTO;
}
+ if( controller->released( Controller::UP ) ) {
+ peeking = AUTO;
+ }
+ if( controller->released( Controller::DOWN ) ) {
+ peeking = AUTO;
+ }
if( controller->pressed( Controller::PEEK_LEFT ) ) {
peeking = LEFT;
}
if( controller->pressed( Controller::PEEK_RIGHT ) ) {
peeking = RIGHT;
}
if( controller->pressed( Controller::PEEK_LEFT ) ) {
peeking = LEFT;
}
if( controller->pressed( Controller::PEEK_RIGHT ) ) {
peeking = RIGHT;
}
+ if( controller->pressed( Controller::UP ) ) {
+ peeking = UP;
+ }
+ if( controller->pressed( Controller::DOWN ) ) {
+ peeking = DOWN;
+ }
/* Handle horizontal movement: */
if (!backflipping) handle_horizontal_input();
/* Handle horizontal movement: */
if (!backflipping) handle_horizontal_input();
@@
-661,9
+690,13
@@
Player::handle_input()
if(moving_object) {
moving_object->set_pos(pos);
} else {
if(moving_object) {
moving_object->set_pos(pos);
} else {
- log_debug << "Non MovingObjetc grabbed?!?" << std::endl;
+ log_debug << "Non MovingObject grabbed?!?" << std::endl;
+ }
+ if(controller->hold(Controller::UP)) {
+ grabbed_object->ungrab(*this, UP);
+ } else {
+ grabbed_object->ungrab(*this, dir);
}
}
- grabbed_object->ungrab(*this, dir);
grabbed_object = NULL;
}
}
grabbed_object = NULL;
}
}
@@
-688,11
+721,16
@@
Player::try_grab()
if(!portable->is_portable())
continue;
if(!portable->is_portable())
continue;
+ // make sure the Portable is a MovingObject
MovingObject* moving_object = dynamic_cast<MovingObject*> (portable);
MovingObject* moving_object = dynamic_cast<MovingObject*> (portable);
- assert(
portable
);
+ assert(
moving_object
);
if(moving_object == NULL)
continue;
if(moving_object == NULL)
continue;
+ // make sure the Portable isn't currently non-solid
+ if(moving_object->get_group() == COLGROUP_DISABLED) continue;
+
+ // check if we are within reach
if(moving_object->get_bbox().contains(pos)) {
if (climbing) stop_climbing(*climbing);
grabbed_object = portable;
if(moving_object->get_bbox().contains(pos)) {
if (climbing) stop_climbing(*climbing);
grabbed_object = portable;
@@
-988,7
+1026,7
@@
Player::draw(DrawingContext& context)
else if (safe_timer.started() && size_t(game_time*40)%2)
; // don't draw Tux
else
else if (safe_timer.started() && size_t(game_time*40)%2)
; // don't draw Tux
else
- tux_body->draw(context, get_pos(), layer);
+ tux_body->draw(context, get_pos(), layer
, grabbed_object
);
}
}
@@
-998,6
+1036,7
@@
Player::collision_tile(uint32_t tile_attributes)
if(tile_attributes & Tile::HURTS)
kill(false);
if(tile_attributes & Tile::HURTS)
kill(false);
+#ifdef SWIMMING
if( swimming ){
if( tile_attributes & Tile::WATER ){
no_water = false;
if( swimming ){
if( tile_attributes & Tile::WATER ){
no_water = false;
@@
-1011,6
+1050,7
@@
Player::collision_tile(uint32_t tile_attributes)
sound_manager->play( "sounds/splash.ogg" );
}
}
sound_manager->play( "sounds/splash.ogg" );
}
}
+#endif
}
void
}
void
@@
-1127,7
+1167,7
@@
Player::kill(bool completely)
Vector(systemRandom.rand(5), systemRandom.rand(-32,18)),
systemRandom.rand(-100,100)));
}
Vector(systemRandom.rand(5), systemRandom.rand(-32,18)),
systemRandom.rand(-100,100)));
}
- player_status->coins -=
25
;
+ player_status->coins -=
std::max(player_status->coins/10, 25)
;
}
else
{
}
else
{