首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pacman java运动问题

Pacman java运动问题
EN

Stack Overflow用户
提问于 2015-02-01 00:24:03
回答 1查看 1.3K关注 0票数 1

我的帕克曼运动遇到了一个小问题,我现在正在努力。

我似乎找不到一种方法,使运动类似于起源的帕克曼运动。为了解释我想让它移动,我上传了这张照片。

现在,我已经让黄色矩形和蓝色墙壁之间的碰撞起作用了。问题是,当我像在图片中那样向左移动,我点击向上箭头,它不应该停止,而是继续移动,然后上升时,有一个自由的空间。

现在,如果单击如下向上箭头,黄色矩形将停止:

已经上传了包含我的移动的pacman类,以及检测到碰撞时我的board类的代码。

pacman类

代码语言:javascript
复制
public class Pacman {

private String pacmanup = "pacmanup.png";
private String pacmandown = "pacmandown.png";
private String pacmanleft = "pacmanleft.png";
private String pacmanright = "pacmanright.png";

private int dx;
private int dy;
private int x;
private int y;
private int width;
private int height;
private boolean visible;

private Image imageup;
private Image imagedown;
private Image imageleft;
private Image imageright;

public Pacman() {

    Thread thread = new Thread();

    thread.start();

    ImageIcon i1 = new ImageIcon(this.getClass().getResource(pacmanup));
    imageup = i1.getImage();

    ImageIcon i2 = new ImageIcon(this.getClass().getResource(pacmandown));
    imagedown = i2.getImage();

    ImageIcon i3 = new ImageIcon(this.getClass().getResource(pacmanleft));
    imageleft = i3.getImage();

    ImageIcon i4 = new ImageIcon(this.getClass().getResource(pacmanright));
    imageright = i4.getImage();

    width = imageup.getWidth(null);
    height = imageup.getHeight(null);
    visible = true;
    x = 27;
    y = 27;

}

public int getDx() {
    return dx;
}

public void setDx(int dx) {
    this.dx = dx;
}

public int getDy() {
    return dy;
}

public void setDy(int dy) {
    this.dy = dy;
}

public int getX() {
    return x;
}

public int getY() {
    return y;
}

public void setX(int x) {
    this.x = x;
}

public void setY(int y) {
    this.y = y;
}

public Image getImageup() {
    return imageup;
}

public Image getImagedown() {
    return imagedown;
}

public Image getImageleft() {
    return imageleft;
}

public Image getImageright() {
    return imageright;
}

public void setVisible(boolean visible) {
    this.visible = visible;
}

public boolean isVisible() {
    return visible;
}

public Rectangle getBounds() {
    return new Rectangle(x, y, width, height);
}

public Rectangle getOffsetBounds() {
    return new Rectangle(x + dx, y + dy, width, height);
}

public void move() {

    x += dx;
    y += dy;
}

public void keyPressed(KeyEvent e) {

    int key = e.getKeyCode();

    if (key == KeyEvent.VK_LEFT) {
        dx = -1;
        dy = 0;
    }

    if (key == KeyEvent.VK_RIGHT) {
        dx = 1;
        dy = 0;
    }

    if (key == KeyEvent.VK_UP) {
        dx = 0;
        dy = -1;
    }

    if (key == KeyEvent.VK_DOWN) {
        dx = 0;
        dy = 1; 
    }
}

public void keyReleased(KeyEvent e) {

    int key = e.getKeyCode();

    if (key == KeyEvent.VK_LEFT) {

    }

    if (key == KeyEvent.VK_RIGHT) {

    }

    if (key == KeyEvent.VK_UP) {

    }

    if (key == KeyEvent.VK_DOWN) {

    }


}

板类代码

代码语言:javascript
复制
Rectangle r5 = pacman.getOffsetBounds();

    for (int j = 0; j<barriers.size(); j++) {
        Barrier b = (Barrier) barriers.get(j);
        Rectangle r4 = b.getBounds();

        if (r5.intersects(r4)) {

            pacman.setDx(0);
            pacman.setDy(0);
            break;

        }

    }

    pacman.move();

}

在我的板类中做了一个名为“方向”的字符串,它检测黄色矩形移动的方向。

“左”“上”“右”或“下”

已经尝试编写了一些代码,但不起作用。以下是我尝试过的:

代码语言:javascript
复制
      // moving to the left and tried go up
            else if (pacman.getDx() == 0 && pacman.getDy() == -1 && direction.equals("left")) {
                pacman.setDy(0);
                pacman.setDx(-1);
                break;

那么,当它向左移动,然后单击向上,它将继续向左移动,但是它不会像它应该做的那样在空闲空间上向上移动:)

是用键盘/按下键的东西吗?也许按下的向上键没有被激活,或者当你点击向上的时候什么的?

EN

回答 1

Stack Overflow用户

发布于 2015-02-01 02:24:31

在我看来,这里有两个问题。

(问题1)

如果希望pacman继续移动,请继续更改dx or dy值,直到按下另一个键为止。这就是经典的帕克曼是怎么工作的。它总是在往上一个keypressed的方向移动。(参见游戏技工在这里行动- https://www.google.com/doodles/30th-anniversary-of-pac-man)

(问题2)

如果您没有尝试实现经典的pacman (从您想要做的事情来看,它看起来不像是在实现经典的pacman),并且如果您想稍微改变控件的工作方式,比如根据按键的历史智能地切换方向,请考虑存储按键。问题是你想要跟踪多少个按键方向?

假设您只想跟踪两个按键,那么您将需要一个大小为2的array,它在任何时候都只存储两个key:value对。将是方向,而将是,如果您可以向not方向移动(即booleantruefalse)。

下面是如何使用这个array来解决您的问题:

当按下方向键时,将其设置为array[0].key,并检查是否可以向该方向移动。如果可以,将array[0].value的值设置为true,并使用此值查看是否需要通过检查array[0].keyarray[0].value状态来更改另一个函数中的dxdy变量的值,以确定是否可以向该方向移动。有关实际move函数的详细信息将在后面解释。您已经实现了基本的move方法,所以这很好,您只需要添加一些条件并对其进行一些修改。

现在,当按下第二个键(如up key)时,请执行以下操作:

  1. 设置temp = array[0]
  2. 设置array[0].key = 'up'
  3. 设置array[1].value =检查是否可以朝array[0].key的方向移动,如果不能,则设置为true。
  4. 设置array[1] = temp并检查array[1].valuetrue还是false

注意,您已经将最古老的按键操作移动到array[1],而最新的按键移动到array[0]

此时,设置一个约定,首先尝试向array[0]的方向移动,因为它存储按下的最新键的方向值,只有这样,您才会尝试在array[1]中移动。

通过将array[0]array[1]的布尔值设置为array[0].valuearray[1].value,检查它们是否可以朝array[0].valuearray[1].value的方向移动,现在您已经知道了可以移动的位置,并且可以实际移动:

因此,在move方法中,执行以下操作,然后是if(array[0].value==true)

  1. array[0]的方向移动,忽略array[1] (也就是说,如果您使用循环实现移动逻辑,就会中断)

else if(array[1].value == true)

  1. array[1]方向移动 一旦您的move()函数返回,并且在新的(x,y)处,回到第一步,然后再做一遍。

希望您需要实现的步骤是明确的。

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

https://stackoverflow.com/questions/28258111

复制
相关文章

相似问题

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