1

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

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

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

  1. 他没有停下来,只是走得很慢。
  2. 即使在边境之外,他也处于非常缓慢的状态。

我使用这样的边框:

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;
}

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

4

2 回答 2

1

好的,我仍然认为你的游戏逻辑的全面重组是有序的,但我想我可以阐明正在发生的事情。让我们看看事情发生的各个地方:

  1. PAINT:在 Swing 线程上,当paint()被调用时,您会查看是否存在碰撞,如果是,则将速度归零(假设您修复了该 if 阻塞)。
  2. KEY:在 Swing 线程上,当一个键被按下时,你根据按下的键来设置速度。
  3. CHECK:在某个未知点,您检查碰撞并记录是否存在碰撞。
  4. MOVE:在某个未知点,你用速度更新你的“家伙”的位置。

所以问题来了:在 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();
    }
}

WhereupdateSpeeds()将查询键是向下还是向上,并计算该人是否可以朝该方向移动,并updatePositionFromSpeed()更新该人的位置。那么paint()依赖那家伙的坐标xy坐标,不会给他们写信,也不需要知道速度。

于 2011-08-03T03:02:16.173 回答
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;
        }
于 2014-04-10T10:15:28.660 回答