我的pacman运动面临一些问题,我现在正在努力。
我似乎无法找到使运动类似于原始的pacman运动的方法。为了解释我希望它如何移动,我已经上传了这张照片。
现在,我已经在黄色矩形和蓝色墙壁之间进行了碰撞。问题是当我向左移动时,如图所示,我单击向上箭头,它不应该停止,但继续移动,然后在有空位时上升。
现在,如果单击向上箭头,黄色矩形将停止:
上传了包含我的动作的pacman类,以及检测到碰撞时来自我的棋盘类的代码。
pacman class
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) {
}
}
来自Board class的代码
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的String,它可以检测黄色矩形的移动方向。
“左”“上”“右”或“下”
已经尝试编写一些代码,但没有工作。这是我试过的:
// 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;
好吧,当它向左移动并且你点击时,它将继续向左移动,但它不会像往常一样在可用空间上移动:)
用keydapter /按键是什么东西?也许按下的键没有激活或点击你的东西?
答案 0 :(得分:0)
我认为你在这方面有两个问题。
(问题1)
如果您希望pacman继续移动,请继续更改dx or dy
值,直到按下另一个键。这就是经典的pacman无论如何都在工作的方式。它始终保持移动/试图继续前进keypressed
的方向。 (请亲自看看这里的游戏机制 - https://www.google.com/doodles/30th-anniversary-of-pac-man)
(第2期)
如果您没有尝试实施经典的pacman(从您尝试做的事情来看,它看起来并不像您正在实施经典的pacman),如果您想要改变控件的工作方式,如根据按键历史智能切换方向,考虑存储按键。问题是您要跟踪多少个按键方向?
假设您只想跟踪两个按键,那么您需要拥有一个大小为2的array
,以便在任何时候只存储两个key:value
对。 键将是方向,值将是,如果您可以朝着的方向移动(即{{ 1}} boolean
或true
)。
以下是使用此false
解决问题的方法:
按下方向键时,将其设置为array
并检查是否可以朝该方向移动。如果可以,请将array[0].key
的值设置为array[0].value
并使用此值来查看是否需要通过检查更改其他函数中true
或dx
变量的值dy
和array[0].key
状态决定您是否可以朝这个方向移动。稍后将解释实际array[0].value
函数的细节。您已经实施了基本的move
方法,这样做很好,您只需要添加一些条件并对其进行一些修改。
现在,当按下第二个键(如move
)时,请执行以下操作:
up key
temp = array[0]
array[0].key = 'up'
=检查您是否可以向array[1].value
的方向移动,如果您不能设置为false,则设置为true。array[0].key
并检查array[1] = temp
是array[1].value
还是true
请注意,您已将最早的按键操作移至false
,并将最新按键移至array[1]
。
此时,设置一个约定,您将始终首先尝试向array[0]
方向移动,因为它会存储按下的最新按键的方向值,然后您才会尝试移入array[0]
。
检查您是否可以通过将其布尔值设置为array[1]
和array[0]
来向array[1]
和array[0].value
方向移动,现在您知道可以移动的位置了准备好实际行动:
所以在你的移动方法中,执行以下操作,array[1].value
然后:
if(array[0].value==true)
方向移动并忽略array[0]
(即如果使用循环实现移动逻辑,则中断) array[1]
:
向else if(array[1].value == true)
一旦您的array[1]
函数返回,并且您在新的(x,y)处返回第一步并重新执行此操作。
希望您需要实施的步骤是明确的。