我正在为我的SFML游戏编写碰撞检测系统,但它在x轴上不起作用。我的玩家一直在移动物体。但是,碰撞在y轴上正常进行。
我已经尝试更改碰撞系统,使其可以像x轴一样使用x轴,但是当我这样做之后,我的播放器根本无法移动。
void Player::Update(float time){
Keyboard();
if (STATE==climb) if (!onLadder) STATE=stay;
if (STATE!=climb) dy+=0.000005*time;
onLadder=false;
sprite.move(dx,dy);
Collision(0);
Collision(1);
}
void Player::Keyboard()
{
if (key["L"])
{
dir=1;
if (STATE!=duck) dx=-0.1;
if (STATE==stay) STATE=walk;
}
if (key["R"])
{
dir=0;
if (STATE!=duck) dx=0.1;
if (STATE==stay) STATE=walk;
}
if (key["Up"])
{
if (onLadder) STATE=climb;
if (STATE==stay || STATE==walk) { dy=-0.27; STATE=jump;}
if (STATE==climb) dy=-0.05;
if (STATE==climb) if (key["L"] || key["R"]) STATE=stay;
}
if (key["Down"])
{
if (STATE==stay || STATE==walk) { STATE=duck; dx=0;}
if (STATE==climb) dy=0.05;
}
if (!(key["R"] || key["L"]))
{
dx=0;
if (STATE==walk) STATE=stay;
}
if (!(key["Up"] || key["Down"]))
{
if (STATE==climb) dy=0;
}
if (!key["Down"])
{
if (STATE==duck) { STATE=stay;}
}
}
void Player::Collision(int num)
{
for (int i = 0;i < obj.size();i++){
if (getRect().intersects(obj[i].rect))
{
if (obj[i].name == "solid")
{
if (dy > 0 && num == 1)
y = obj[i].rect.top; dy=0;STATE=stay;
if (dy < 0 && num == 1)
y = obj[i].rect.top; dy=0;
if (dx > 0 && num == 0)
x = obj[i].rect.left - width;
if (dx < 0 && num == 0)
x = obj[i].rect.left + obj[i].rect.width;
}
}
}
}
我希望玩家能够移动直到撞到物体为止。相反,播放器被卡在x轴上的对象中。但是,在y轴上的碰撞是可以的。
也许您可以根据精灵的速度向相反方向稍微移动精灵,以将其移出碰撞对象的边界:
if (getRect().intersects(obj[i].rect))
{
// check collision to right
if (dx > 0) {
sprite.move(-1, 0);
// check collision to left
} else if (dx < 0) {
sprite.move(1, 0);
}
// check collision below
if (dy > 0) {
sprite.move(0, -1);
dy = 0;
// check collision above
} else if (dy < 0) {
sprite.move(0, 1);
}