簡體   English   中英

吃豆子Java運動問題

[英]Pacman java movement issues

我現在正在研究的吃豆人運動面臨一個小問題。

我似乎找不到找到使這種運動類似於起源的吃豆人運動的方法。 為了解釋我希望它如何移動,我上傳了這張照片。

在此處輸入圖片說明

現在,我使黃色矩形和藍色牆壁之間發生碰撞。 問題是當我如圖所示向左移動並單擊向上箭頭時,它不應該停止,而是繼續移動,然后在有可用空間時向上移動。

現在,如果您單擊向上箭頭,則黃色矩形將停止,如下所示:

在此處輸入圖片說明

已上傳我的pacman類,其中包含我的動作,以及檢測到碰撞時來自我的木板類的代碼。

吃豆類

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) {

    }


}

董事會課程的代碼

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();

}

在我的板子類中創建了一個名為direction的字符串,該字符串可以檢測黃色矩形的移動方向。

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

已經嘗試編寫一些代碼,但是沒有用。 這是我嘗試過的:

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

好吧,當它向左移動並單擊向上時,它將繼續向左移動,但是它不會像它應該做的那樣在可用空間上上升:)

鍵盤鍵/按下鍵有問題嗎? 也許按下的鍵沒有激活,或者當您單擊時發生了什么?

我的看法是,這里有兩個問題。

(問題1)

如果要讓pacman保持移動,請繼續更改dx or dy值,直到按下另一個鍵。 無論如何,這就是經典吃豆人的工作方式。 它總是不停地移動/嘗試以保持在最后一次keypressed的方向上移動。 (請親自在這里查看游戲機制-https: //www.google.com/doodles/30th-anniversary-of-pac-man

(問題2)

如果您不打算實現經典的pacman(從您嘗試做的事情來看,看起來就不是在實現經典的pacman),並且您想更改控件的工作方式,例如智能切換根據按鍵歷史記錄的方向,請考慮存儲按鍵。 問題是您要跟蹤多少個按鍵方向?

假設您只想跟蹤兩個按鍵,則需要有一個大小為2的array ,該array將在任何時間僅存儲兩個key:value對。 關鍵將是方向,將是您是否可以朝那個方向移動 (即boolean truefalse )。

這是使用此array解決問題的方法:

當按下方向鍵時,將其設置到array[0].key並檢查是否可以沿該方向移動。 如果可以,請將array[0].value的值設置為true然后使用此值查看是否需要通過檢查array[0].keyarray[0].value array[0].key來更改另一個函數中dxdy變量的值。 array[0].value狀態決定您是否可以朝那個方向移動。 稍后將說明實際move功能的詳細信息。 您已經實現了基本的move方法,所以很好,您只需要添加一些條件並對其進行一些修改。

現在,當按下第二個鍵(如up key )時,請執行以下操作:

  1. 設置temp = array[0]
  2. 設置array[0].key = 'up'
  3. set array[1].value =檢查是否可以沿array[0].key的方向移動,如果不能則設置為false,否則設置為true。
  4. 設置array[1] = temp並檢查array[1].valuetrue還是false

請注意,您已將最早的按鍵操作移至array[1] ,最新的按鍵操作移至array[0]

此時,設置一個約定,您將始終首先嘗試沿array[0]的方向移動,因為它存儲了最近按下的鍵的方向值,然后才嘗試沿array[1]方向移動。

通過將它們的布爾值設置為array[0].valuearray[1].value來檢查是否可以朝着array[0]array[1]的方向移動之后,您現在知道了可以移動的位置並准備移動其實:

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

  1. array[0]的方向移動並忽略array[1] (即,如果您使用循環實現了移動邏輯,則會中斷)

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

  1. array[1]的方向移動

    一旦move()函數返回,並且您使用的是新的(x,y),請返回至第一步,並重新進行一次操作。

希望您需要執行的步驟清楚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM