首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#二维碰撞检测问题

C#二维碰撞检测问题
EN

Stack Overflow用户
提问于 2009-08-19 10:29:59
回答 3查看 5.9K关注 0票数 2

我被卡住了,试图弄清楚如何改变我的碰撞检测来正确地工作,我把我所有的墙对象堆叠在一个列表中,然后当玩家移动时,我循环遍历每个墙对象并调用DetectCollision方法,这将根据对象是否在墙内返回真或假。

墙检测碰撞(X和Y坐标是墙的位置)

代码语言:javascript
复制
public bool DetectCollision(float x, float y)
    {
        if ((x >= this.XCoordinate && x <= (this.XCoordinate + this.BlockWidth)) && (y >= this.YCoordinate && y <= (this.YCoordinate + this.BlockHeight)))
            return true;            
        else
            return false;
    }

因此,在我的玩家函数中,当玩家试图移动时,我将移动添加到临时的X,Y坐标,并检查它们是否碰撞到墙上,如果它们什么都没有发生,否则我移动玩家。

但是我注意到它不能正常工作,如果我在gamefield中添加一块墙,它只会检查右下角的碰撞检测?

播放器移动方式:

代码语言:javascript
复制
        float x, y;
        if (direction == Direction.E)
        {
            x = LiveObjects.player.XCoordinate - MovementSpeed;
            y = LiveObjects.player.YCoordinate;
        }
        else if (direction == Direction.W)
        {
            x = LiveObjects.player.XCoordinate + MovementSpeed;
            y = LiveObjects.player.YCoordinate;
        }
        else if (direction == Direction.N)
        {
            x = LiveObjects.player.XCoordinate;
            y = LiveObjects.player.YCoordinate - MovementSpeed;
        }
        else
        {
            x = LiveObjects.player.XCoordinate;
            y = LiveObjects.player.YCoordinate + MovementSpeed;
        }

        if (GameMechanics.DetectWallCollision(x, y) || GameMechanics.DetectWallCollision((x + LiveObjects.player.BlockWidth), (y + LiveObjects.player.BlockHeight))
        {
            OnPlayerInvalidMove(null, new PlayerEventArgs());
            return;
        }

DetectWallCollision的循环是这样的:

代码语言:javascript
复制
foreach (Wall wall in LiveObjects.walls)
        {
            if (wall.DetectCollision(x, y))
                return true;
        }
        return false;

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-08-19 10:51:49

有件事让我很困扰,你说DetectCollision方法得到了墙的位置--但是如果我正确地解释了你的代码,你把x和y参数传递给DetectWallCollision,这是球员(在移动后)的位置,然后把这个位置传递给DetectCollision方法……

你有没有调试过你的代码,看看传递给碰撞方法的坐标是什么,并跟踪if语句要走的路线?

如果由于某种原因不能调试您的代码--编写一个跟踪文件--我认为解决方案将会落在您的膝上;)

票数 0
EN

Stack Overflow用户

发布于 2009-08-19 20:27:33

我假设你的世界中没有任何东西是无限小的(即像素的大小)。要有真正的边界框碰撞,你必须考虑两个对象的大小,而不仅仅是一个。

代码语言:javascript
复制
boolean intersectsEntity(Entity e)
{
    return (e.position.x <= position.x + size.x) &&
           (e.position.y <= position.y + size.y) &&
           (e.position.x + e.size.x >= position.x) &&
           (e.position.y + e.size.y >= position.y);
}

当然,这是假设一个实体的位置和大小都有一个向量。所以size.x == width和size.y == height。

票数 1
EN

Stack Overflow用户

发布于 2009-08-19 11:02:39

你的东方和西方是错误的方向。在左上角的坐标系为0,0的情况下,向下或向右移动时正向增加,则移动West通常意味着向左移动,这意味着减小X的值,反之亦然。你在做相反的事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1298999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档