c++ - 如何在我的 SFML 游戏中实现碰撞检测
问题描述
我正在为我的 SFML 游戏编写一个碰撞检测系统,但它在 x 轴上不起作用。我的播放器总是在对象中移动。但是,碰撞在 y 轴上正常进行。
我尝试更改碰撞系统,使其可以像使用 y 轴一样使用 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 轴上的碰撞是可以的。
解决方案
推荐阅读
- regex - 是否可以删除已经匹配的捕获组,使其不参与?
- r - 使用数据框时,Strptime 失败
- javascript - React Redux mapStateToProps 在获取新数据之前显示旧数据
- java - Firebase Android - 只需要特定表在本地设备中
- reverse-engineering - 在 14 个地址的作弊引擎中找到正确的健康值
- external-data-source - 使用 VBA 代码更新外部数据源链接
- python - Dask:聚合不同数据帧切片并合并在一起的内存有效方式
- javascript - JS回调函数问题?
- java - 为未经授权的用户“加密”或锁定创建的文件的安全方法 - Java
- amazon-web-services - 使用 boto3 创建具有层的 Lambda 函数时出现问题