【问题标题】:Collision detection while using rectangles使用矩形时的碰撞检测
【发布时间】:2013-08-16 09:40:01
【问题描述】:

所以我知道我目前没有以最好的方式编写代码;这是一种试运行。我想要做的是使用矩形和 intersects 属性的墙壁碰撞(对不起,如果我没有使用正确的术语)。到目前为止,我在屏幕上有 2 个矩形。 1 玩家控制,而另一方正在与之发生冲突。当它们碰撞时,玩家停止移动。问题是如果玩家在碰撞时试图移动到矩形中,那么玩家就不能在垂直于移动的任何方向上移动,即如果玩家按住右箭头键移动到矩形中,那么他们不能向上或向下移动。游戏的前提是,如果您的 x 或 y 坐标无效,那么您将被移回记录的最后一个有效坐标,但我无法分别检测有效的 x 和 y 坐标。代码如下:

public void Collision() 
{

    if(x < 0)
        x = 0;

    if(x > 400 - width)
        x = 400 - width;

    if(y < 0)
        y = 0;

    if(y > 300 - height)
        y = 300 - height;


    rect1 = new Rectangle(x, y, 16, 16);
    rect2 = new Rectangle(sx, sy, wid, hei);

    if(!rect1.intersects(rect2))
    {
        validX = true;
        validY = true;
    }
    else
    {
        validX = false;
        validY = false;
    }


    if(validX)
    {
        lastValidX = x;
    }

    if(validY)
    {
        lastValidY = y;
    }

    if(!validX)
    {
        x = lastValidX;
    }

    if(!validY)
    {
        y = lastValidY;
    }

}

Guy 类中的 Collision() 方法是我相信的问题所在。是的,我的代码现在很乱,但这只是一个测试。

谢谢,大卫。

【问题讨论】:

  • 你能narrow你的代码吗?只留下需要的部分
  • 我认为您需要了解正确的游戏开发,例如双缓冲、游戏循环等。如果您愿意,我可以给您一个教程?
  • 好的,我已将代码范围缩小到我认为唯一相关的部分。我确实知道缓冲类型和适当的游戏循环,而不是像我一样使用计时器,但我只是为学校项目做这个,所以我认为这比我需要做的要困难一些。

标签: java collision-detection game-physics rectangles intersect


【解决方案1】:

您可以通过在此处执行额外的逻辑来实现您所描述的内容(即检测一个为假而另一个为真的情况):

if(!rect1.intersects(rect2))
{
    validX = true;
    validY = true;
}
else
{
    validX = false;
    validY = false;
}

但是,您似乎一开始就不应该让矩形处于“碰撞”状态。例如,您可以将Move 方法更改为类似

public void Move()
{
    int oldX = x, oldY = y;
    x += dx;
    y += dy;
    if (Collision()) {
        x = oldX;
        y = oldY;
    }
}

【讨论】:

  • 我试图检测只有一个轴发生碰撞的情况,但我不完全确定在矩形和相交时如何做到这一点。我会试一试,看看效果如何。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多