mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-10 10:08:18 +00:00
solved corner case issue
This commit is contained in:
parent
f7ea0b2ba8
commit
7d79756443
|
@ -75,20 +75,32 @@ void move_box(vec2 *inout_pos, vec2 *inout_vel, vec2 size, float elasticity)
|
||||||
|
|
||||||
vec2 new_pos = pos + vel*fraction; // TODO: this row is not nice
|
vec2 new_pos = pos + vel*fraction; // TODO: this row is not nice
|
||||||
|
|
||||||
// make sure that we quantize. this is to make sure that when we set
|
if(test_box(vec2(new_pos.x, new_pos.y), size))
|
||||||
// the final position that we don't move it into the ground.
|
|
||||||
if(test_box(vec2((int)new_pos.x,(int) new_pos.y), size))
|
|
||||||
{
|
{
|
||||||
if(test_box(vec2((int)pos.x, (int)new_pos.y), size))
|
int hits = 0;
|
||||||
|
|
||||||
|
if(test_box(vec2(pos.x, new_pos.y), size))
|
||||||
{
|
{
|
||||||
new_pos.y = pos.y;
|
new_pos.y = pos.y;
|
||||||
vel.y *= -elasticity;
|
vel.y *= -elasticity;
|
||||||
|
hits++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(test_box(vec2((int)new_pos.x, (int)pos.y), size))
|
if(test_box(vec2(new_pos.x, pos.y), size))
|
||||||
{
|
{
|
||||||
new_pos.x = pos.x;
|
new_pos.x = pos.x;
|
||||||
vel.x *= -elasticity;
|
vel.x *= -elasticity;
|
||||||
|
hits++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// neither of the tests got a collision.
|
||||||
|
// this is a real _corner case_!
|
||||||
|
if(hits == 0)
|
||||||
|
{
|
||||||
|
new_pos.y = pos.y;
|
||||||
|
vel.y *= -elasticity;
|
||||||
|
new_pos.x = pos.x;
|
||||||
|
vel.x *= -elasticity;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1011,7 +1011,6 @@ void player::tick_defered()
|
||||||
vec2 start_pos = core.pos;
|
vec2 start_pos = core.pos;
|
||||||
vec2 start_vel = core.vel;
|
vec2 start_vel = core.vel;
|
||||||
bool stuck_before = test_box(core.pos, vec2(28.0f, 28.0f));
|
bool stuck_before = test_box(core.pos, vec2(28.0f, 28.0f));
|
||||||
|
|
||||||
core.move();
|
core.move();
|
||||||
bool stuck_after_move = test_box(core.pos, vec2(28.0f, 28.0f));
|
bool stuck_after_move = test_box(core.pos, vec2(28.0f, 28.0f));
|
||||||
core.quantize();
|
core.quantize();
|
||||||
|
@ -1020,11 +1019,14 @@ void player::tick_defered()
|
||||||
|
|
||||||
if(!stuck_before && (stuck_after_move || stuck_after_quant))
|
if(!stuck_before && (stuck_after_move || stuck_after_quant))
|
||||||
{
|
{
|
||||||
dbg_msg("player", "STUCK!!! %f %f %f %f %x %x %x %x",
|
dbg_msg("player", "STUCK!!! %d %d %d %f %f %f %f %x %x %x %x",
|
||||||
|
stuck_before,
|
||||||
|
stuck_after_move,
|
||||||
|
stuck_after_quant,
|
||||||
start_pos.x, start_pos.y,
|
start_pos.x, start_pos.y,
|
||||||
start_vel.x, start_vel.y,
|
start_vel.x, start_vel.y,
|
||||||
start_pos.x, start_pos.y,
|
*((unsigned *)&start_pos.x), *((unsigned *)&start_pos.y),
|
||||||
start_vel.x, start_vel.y);
|
*((unsigned *)&start_vel.x), *((unsigned *)&start_vel.y));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue