使图像成为“边界”

时间:2011-08-03 02:42:35

标签: java collision boundary

我正在制作一个游戏,你可以在其中发射一个简单的圆圈来发射子弹及其多人游戏等等。好吧,我试图让边界有点像迷宫型的东西,你必须经历我尝试过这样的碰撞检测:

public void checkCollisions(){
    Rectangle r1 = bo.getBounds();
    Rectangle d = p.getBounds();
    if (d.intersects(r1))
        border = true;
}

基本上如果border = true,那么我就会阻止角色移动。我这样做有两个问题,

  1. 他没有停下来,真的很慢。
  2. 即使离开边境,他仍然处于极度缓慢的状态。
  3. 我使用这样的边框:

    boolean border = false;
    

    然后在我的绘画方法中我说:

    if (border)
            p.dx = 0;
            p.dy = 0;
    

    p表示Guy类:P 更多dx和dy:

    public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    
    if (key == KeyEvent.VK_A)
        dx = -2;
    
    if (key == KeyEvent.VK_D)
        dx = 2;
    
    if (key == KeyEvent.VK_W)
        dy = -2;
    
    if (key == KeyEvent.VK_S)
        dy = 2;
    

    对于keyReleased,我只需将dx和dy的值更改为0 还有这个家伙的动作:

    public void move() {
    x = x + dx;
    y = y + dy;
    }
    

    请帮我弄清楚为什么这不起作用。

2 个答案:

答案 0 :(得分:1)

好的,我仍然认为你的游戏逻辑的完全重组是有序的,但我想我可以说明发生了什么。让我们看一下发生事情的各个地方:

  1. PAINT:在Swing线程上,当调用paint()时,您会看到是否存在冲突,如果是,则将速度调零(假设您修复了阻塞)。
  2. KEY:在Swing线程上,当按下某个键时,您可以根据按下的键设置速度。
  3. 检查:在某个未知点,您检查是否有碰撞并记录是否有碰撞。
  4. 移动:在某个未知的点上,你用速度更新你的“家伙”位置。
  5. 所以这就是问题所在:在Java中,就像任何其他程序一样,当你按住某个键时,你会得到多个按键事件。第一个和第二个之间会有短暂的延迟,然后它们会迅速重复。在浏览器的文本框中尝试它,在那里会出现相同的行为。

    那对你有什么影响?好吧,你可能正在进入这样的场景:

    PAINT -> speed set to zero
    KEY -> speed set back to -2
    MOVE -> guy is moved -2
    CHECK -> border = false
    PAINT -> speed set to zero again
    

    真的,如果您重新构建代码,以便获得类似于此的游戏循环:

    public void runGame() {
        while(true) {
            updateSpeeds();
            updatePositionFromSpeed();
            repaint();
        }
    }
    

    updateSpeeds()代替关键字是关闭还是关闭,并计算该人是否可以向该方向移动,updatePositionFromSpeed()将更新该人的位置。然后paint()会依赖对该人的xy坐标,不会写入它们,也不需要知道速度。

答案 1 :(得分:0)

这是一个非常简单的解决方案。

这是我的伪代码。

        if(player.getBounds().intersects(wall.getBounds())){
            //Go Back to prior position, regardless of direction coming from. Since the reverse velocity X and velocity Y directions are taken care off
            x -= velX;
            y -= velY;

            //Then Stop at that prior position to make next move
            velX = 0;
            velY = 0;
        }