繁体   English   中英

寻找一种处理基于平铺的角碰撞的好方法

[英]Looking for a good way to handle tile based corner-collisions

好的,我有一个平铺的地图(很明显),并且实现了一个碰撞检测系统,该系统对我来说真的很好用。 但是在那些讨厌的角落有麻烦。 我确实知道为什么会这样,因为我什至不检查角落。 这就是重点,我不知道该怎么做。 所以,首先这里是我当前的代码:

        Body body = currentObject.Body; // Body is a class storing position, velocity, bounds and so on.

        int tileDimensions = level.TileWidth; // Since the tiles are squares...

        int leftTile = body.Bounds.Left / tileDimensions;
        int topTile = body.Bounds.Top / tileDimensions;
        int rightTile = (int)Math.Ceiling((float)body.Bounds.Right / tileDimensions - 1);
        int bottomTile = (int)Math.Ceiling(((float)body.Bounds.Bottom / tileDimensions) - 1);

        if (body.Velocity.Y > 0) // Moving down.
        {
            for (int x = leftTile; x <= rightTile; x++)
            {
                for (int y = bottomTile + 1; y <= (bottomTile + 1) + (body.Velocity.Y / tileDimensions); y++)
                {
                    if (tiles[x, y] != null && !tiles[x, y].IsPassable)
                    {
                        newVelocity = new Vector2(body.Velocity.X, MathHelper.Clamp(body.Velocity.Y, 0, tiles[x, y].Body.Bounds.Top - body.Bounds.Bottom));
                        body.Velocity = newVelocity;
                        break;
                    }
                }
            }
        }

因此,仅此而已。 上面,左边和右边还有其他3种构造。 唯一真正的区别是回路和钳制速度的方式。

如您所见,我只是遍历所有可能发生碰撞的图块。 然后我钳住速度,以防万一确实有瓷砖在移动。

现在,恐怕仅凭文字很难解释我的问题,因此我也必须张贴一张图片。

在此处输入图片说明

在此屏幕截图中,黄色表示不可通过的图块,黑色是上述代码当前正在检查碰撞的图块,红色是播放器。

为了向您展示问题所在,想象一下我将在此框架内加速前进。 如您所见,我的播放器右上角的瓷砖会发生碰撞,但是由于我不检查它是否碰撞,所以玩家会进入瓷砖中。 而且我也不会在下一帧中检查它,因为我不检查我所在的块,因为...我什至不知道,那会背叛我代码的整个思想,不是吗? :P

当然,我可以扩展“搜索”范围,但随后我将与图块发生冲突,而我不应该与之发生冲突。 目前,我正在对所有与边界重叠的图块进行额外检查,以解决此问题,并且...如果知道,只要将播放器移回去即可。 但这确实很混乱,并且不能保留初始速度。 如果玩家撞到一个角落,他将进入该角落,我将检测到该情况,将其移回并使其速度无效。 只是感觉不对,笨拙。

我只是想不出一种处理此类案件的好方法。 我不会经常发生(因为很难复制),但偶尔会发生,这当然是不可接受的。

我真的很想什至没有一个bugfix类型的东西,而是尽可能将其更好地集成到我的其他代码中。 这不是强制性的,但是能够做到这一点将很酷。 因此,如果你们中有人能向我扔东西,我将非常感激。

无论如何,我希望你能听懂我想说的话。 由于英语不是我的母语,因此有时很难解释这些事情。 我也很不擅长解释事情:/

我想您可以再添加4种情况,当currentObject沿对角线移动时处理,不是吗?

但是,您可能要根据边界体积研究碰撞。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM