所以我正在开发一个小逃脱游戏,我想确保你不能穿过墙壁。我也希望能够穿过墙壁。有了这个,我的意思是,当你左边有一堵墙,然后向左和向上按,你就会向上滑动但不要穿过墙。首先,我制作了一些不能很好地运行的错误代码。经过互联网搜索后我发现了这个:
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;
}
我在这里结束了我的智慧。也许我只是错过了一些非常简单的东西(我可能一如既往),但我似乎无法弄清楚这一点。希望你们能帮助我,否则“提交”问题会让我看到光明。
提前致谢!
[编辑]好的,所以我再次尝试了原来的方法因为我有预感。事实证明我的原始系统不起作用,因为在一个函数中我在浮点坐标和整数坐标之间来回跳跃。因此,如果将来有类似问题的人找到此线程,那么请确保您坚持使用一种类型:整数或浮点数。这将为您节省很多麻烦。
答案 0 :(得分:0)
您的rectCol
函数指示是否存在碰撞,但它不区分X中的碰撞和Y中的碰撞。
如果发生碰撞,即使碰撞完全在Y中,您的slideCol
功能也会调整X位置。因此您无法沿着地板或天花板滑动。
我不知道为什么滑动有时比预期的更慢或更快。我认为在代码中没有理由(我不会试验你的dll),所以我怀疑你的期望可能是不现实的。