Я кодирую систему обнаружения столкновений для моей игры SFML, но она не работает по оси X. Мой игрок всегда движется через объект. Тем не менее, столкновение работает нормально на оси Y.
Я пытался изменить систему столкновения, чтобы она работала с осью X так же, как с осью Y, но после того, как я сделалчто мой игрок вообще не мог двигаться.
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. Однако столкновение на оси у в порядке.