2D 矩形滑动碰撞不起作用
2D rectangle sliding collision doesn't work
所以我正在开发一个小的逃跑游戏,我想确保你不会穿过墙壁。我还想能够在墙上滑动。我的意思是,当你的左边有一堵墙,你向左上按,你会向上滑动,但不会穿过墙。首先,我编造了一些不太好用的错误代码。在互联网上搜索后,我发现了这个:
http://xboxforums.create.msdn.com/forums/t/59723.aspx
这听起来很有逻辑,也很简单,所以我在程序中实现了它。问题是,它仍然不起作用,只是非常不规则。有时它允许你滑动(尽管比预期的慢/快),有时你只能滑动得更快,有时你根本无法滑动。我的代码如下:
bool cLevel::slideCol(SDL_Rect* pos, SDL_Rect* oldPos) {
bool col = false;
for (int i = 0; i < walls.size(); ++i) {
if (rectCol(*pos, walls[i])) {
pos->x = oldPos->x;
col = true;
}
if (rectCol(*pos, walls[i])) {
pos->y = oldPos->y;
col = true;
}
}
return col;
}
它根据当前位置检查所有墙。它首先调整x位置,如果仍然存在碰撞,则调整y位置。如果你想看看我的问题,你可以在这里得到一个演示:https://dl.dropbox.com/u/65227065/Operation%20Get%20Out.zip。我确信rectCol函数是有效的,我已经对它进行了彻底的测试。但可以肯定的是,这里是无论如何:
bool rectCol(SDL_Rect f, SDL_Rect s) {
bool ret = false;
int t1, r1, b1, l1;
int t2, r2, b2, l2;
t1 = f.y;
r1 = f.x + f.w;
b1 = f.y + f.h;
l1 = f.x;
t2 = s.y;
r2 = s.x + s.w;
b2 = s.y + s.h;
l2 = s.x;
// Er zijn vier situaties mogelijk: - rechtsonder1 overlapt linksboven2
// - linksonder1 overlapt rechtsboven2
// - linksboven1 overlapt rechtsonder2
// - rechtsboven1 overlapt linksonder2
// Die worden hier elk individueel gechecked
if (r1 > l2 && r1 < r2) { // rechts
if (b1 > t2 && b1 < b2) { // onder1 overlapt linksboven2
ret = true;
} else if (t1 > t2 && t1 < b2) { // boven overlapt overlapt linksonder2
ret = true;
}
} else if (l1 > l2 && l1 < r2) { // links
if (b1 > t2 && b1 <= b2) { // onder1 overlapt rechtsboven2
ret = true;
} else if (t1 > t2 && t1 < b2) { // boven1 overlapt met rechtsonder2
ret = true;
}
}
return ret;
}
我在这里已经无计可施了。也许我只是错过了一些非常简单的事情(我可能一如既往),但我似乎就是想不通。希望你们能帮助我,否则"提交"问题会让我看到曙光。
提前感谢!
好的,所以我再次尝试了我原来的方法,因为我有预感。事实证明,我原来的系统不起作用,因为在一个函数中,我在浮点坐标和整数坐标之间来回跳跃。因此,如果这个线程将来被有类似问题的人发现,那么一定要坚持一种类型:整数或浮点。那会帮你省去很多头疼的事。
您的rectCol
函数指示是否发生了碰撞,但它不区分X中的碰撞和Y中的碰撞。
如果发生碰撞,即使碰撞完全在Y方向,slideCol
函数也会调整X位置。因此,您无法沿地板或天花板滑动。
我不知道为什么滑动有时比预期的慢或快。我在代码中看不出有任何理由这样做(我不会尝试你的dll),所以我怀疑你的期望可能不现实。
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- C++Matching Brackets 2解决方案不起作用
- C++碰撞检测在上次检查时不起作用?
- 2D 矩形滑动碰撞不起作用