【问题标题】:Collision Problem碰撞问题
【发布时间】:2011-05-06 00:42:44
【问题描述】:

我在检查屏幕上绘制的对象的碰撞时遇到问题。例如:我目前正在制作一个蛇游戏,我必须让它检查蛇是否正在撞击某个块对象(这会使蛇增加并在蛇击中/“吃”块时增加分数)。所以我做了一个函数来检查蛇和块对象之间的碰撞,但它不能正常工作(当用蛇从正上方移动对象时,它确实有效,但否则它不起作用):

public boolean checkColision() {
    if(SnakeObjs.get(0).x >= obj.x && SnakeObjs.get(0).x
                <= obj.x+10 && SnakeObjs.get(0).y
                >= obj.y && SnakeObjs.get(0).y <= obj.y+10) {
        return true;
    }else{
        return false;
    }
}

这个函数检查碰撞。其中SnakeObjs.get(0) 包含需要撞击块对象的蛇对象的 x 和 y 坐标,obj 包含块对象的 x 和 y 坐标以检查碰撞。

paint 方法,绘制块对象和蛇对象,如下所示:

public void paint(Graphics g) {
    for(int i=0;i<SnakeObjs.size();i++) {
        g.setColor(new Color(
                        (int)((double)Math.random()*200.0),
                        (int)((double)Math.random()*200.0),
                        (int)((double)Math.random()*200.0)));
        g.fillRect(SnakeObjs.get(i).x, SnakeObjs.get(i).y, 10, 10);
        g.setColor(Color.WHITE);
        g.drawRect(SnakeObjs.get(i).x-1, SnakeObjs.get(i).y-1, 12, 12);
    }
    g.setColor(new Color(
                    (int)((double)Math.random()*200.0),
                    (int)((double)Math.random()*200.0),
                    (int)((double)Math.random()*200.0)));
    g.fillRect(obj.x, obj.y, 10, 10);
    g.setColor(Color.BLACK);
    g.drawString("Score: "+score, 10, 10);
}

如果有人能帮我解决这个碰撞问题,那就太好了。

提前致谢,

最好的问候, Skyfe。

【问题讨论】:

  • 贪吃蛇游戏是的典型游戏,您可以在其中使用网格来表示对象和墙壁。例如一个 int[][] 数组,其中“0”表示“无”,“Integer.MAX_VALUE”表示墙,“1”表示蛇可以吃掉 1 并增长 1,“ 2' 表示蛇是 '2' 并增长 2 等。您的 checkCollision 因此变为 if ( grid[x][y] == Integer.MAX_VALUE ) 等.
  • 啊,我明白了,但我确实使用矩形而不是只为蛇对象和块对象使用点,所以这会使它变得更复杂吗?另外我想我现在可以通过检查矩形之间的交集来让它工作。但是感谢您也展示了使用网格的方式!

标签: java awt paint collision


【解决方案1】:

错误是您将一个对象解释为矩形,而将另一个对象解释为点。您检查该点是否在矩形中,而不是两个矩形是否相交。它从右侧和顶部工作。

我建议为蛇和对象保存一个矩形。添加一个方法 getBounds()。那么您可以使用 Rectangle 中的 intersect() 方法。您也可以将此边界用于绘制操作。

【讨论】:

  • 啊,我完全明白了!非常感谢,我现在看到我在检查碰撞时的错误之处。所以我基本上需要检查是否,不仅仅是一个点(可能是左上点,当它开始从右上位置绘制矩形时使用?所以那个点必须位于块对象的范围内,所以有从右侧击中它,顶部)但是如果我现在正确地得到它,蛇对象矩形(它们中的任何一个)的边界位于块对象矩形内。我现在会尝试使用两个矩形的边界来让它工作,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-12
  • 2012-09-23
相关资源
最近更新 更多