小编def*_*one的帖子

2D平台碰撞处理

我正在尝试创建一个2D平台游戏(马里奥型)游戏,我有些问题正确处理碰撞.我用C++编写这个游戏,使用SDL进行输入,图像加载,字体加载等.我也通过FreeGLUT库与SDL结合使用OpenGL来显示图形.

我的碰撞检测方法是AABB(Axis-Aligned Bounding Box),这是我真正需要的.我需要的是一种简单的方法来检测碰撞发生在哪一侧并正确处理碰撞.所以,基本上,如果玩家与平台的顶部发生碰撞,请将他重新定位到顶部; 如果两侧发生碰撞,请将玩家重新定位回对象的一侧; 如果底部发生碰撞,请将玩家重新放置在平台下.

我已经尝试了许多不同的方法,例如尝试找到穿透深度并通过穿透深度向后重新定位玩家.可悲的是,我尝试过的任何东西似乎都没有用.玩家的动作最终会非常小问题,并在我不想要的时候重新定位玩家.部分原因可能是因为我觉得这样的事情很简单,但我过分思考它.

如果有人认为他们可以提供帮助,请查看下面的代码,如果可以,请帮助我尝试改进.如果可能的话,我想避免使用库来处理这个问题(因为我想自己学习)或类似SAT(分离轴定理).预先感谢您的帮助!

void world1Level1CollisionDetection()
{
for(int i; i < blocks; i++)
{
    if (de2dCheckCollision(ball,block[i],0.0f,0.0f)==true)
    {
        de2dObj ballPrev;
        ballPrev.coords[0] = ball.coords[0];
        ballPrev.coords[1] = ball.coords[1];
        ballPrev.coords[2] = ball.coords[2];
        ballPrev.coords[3] = ball.coords[3];
        ballPrev.coords[0] -= ball.xspeed;
        ballPrev.coords[1] -= ball.yspeed;
        ballPrev.coords[2] -= ball.xspeed;
        ballPrev.coords[3] -= ball.yspeed;

        int up = 0;
        int left = 0;
        int right = 0;
        int down = 0;

        if (ballPrev.coords[0] < block[i].coords[0] && ballPrev.coords[2] < block[i].coords[0] && (((ball.coords[1] < block[i].coords[1]) || (ball.coords[3] < …
Run Code Online (Sandbox Code Playgroud)

c++ opengl sdl 2d collision-detection

4
推荐指数
1
解决办法
5649
查看次数

标签 统计

2d ×1

c++ ×1

collision-detection ×1

opengl ×1

sdl ×1