[英]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
true
或false
)。
這是使用此array
解決問題的方法:
當按下方向鍵時,將其設置到array[0].key
並檢查是否可以沿該方向移動。 如果可以,請將array[0].value
的值設置為true
然后使用此值查看是否需要通過檢查array[0].key
和array[0].value
array[0].key
來更改另一個函數中dx
或dy
變量的值。 array[0].value
狀態決定您是否可以朝那個方向移動。 稍后將說明實際move
功能的詳細信息。 您已經實現了基本的move
方法,所以很好,您只需要添加一些條件並對其進行一些修改。
現在,當按下第二個鍵(如up key
)時,請執行以下操作:
temp = array[0]
array[0].key = 'up'
array[1].value
=檢查是否可以沿array[0].key
的方向移動,如果不能則設置為false,否則設置為true。 array[1] = temp
並檢查array[1].value
是true
還是false
請注意,您已將最早的按鍵操作移至array[1]
,最新的按鍵操作移至array[0]
。
此時,設置一個約定,您將始終首先嘗試沿array[0]
的方向移動,因為它存儲了最近按下的鍵的方向值,然后才嘗試沿array[1]
方向移動。
通過將它們的布爾值設置為array[0].value
和array[1].value
來檢查是否可以朝着array[0]
和array[1]
的方向移動之后,您現在知道了可以移動的位置並准備移動其實:
因此,在您的move方法中,執行以下操作: if(array[0].value==true)
然后:
array[0]
的方向移動並忽略array[1]
(即,如果您使用循環實現了移動邏輯,則會中斷) else if(array[1].value == true)
:
朝array[1]
的方向移動
一旦move()
函數返回,並且您使用的是新的(x,y),請返回至第一步,並重新進行一次操作。
希望您需要執行的步驟清楚。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.