你可以在map类中添加一个变量来记录人物的位置,例如:
int playerX = 3; // 初始化人物横坐标为3
int playerY = 4; // 初始化人物纵坐标为4
然后在paintComponent方法中绘制人物,例如:
Image player = new ImageIcon("D:\\推箱子1\\imge\\player.jpg").getImage();
g.drawImage(player, playerX * size, playerY * size, size, size, this);
接下来实现移动,你可以在map类中添加一个movePlayer方法,用于处理移动逻辑。这个方法可以接受两个参数:横向偏移量dx和纵向偏移量dy。例如:
public void movePlayer(int dx, int dy) {
int newX = playerX + dx;
int newY = playerY + dy;
if (box[newY][newX] == 0 || box[newY][newX] == 3) { // 判断目标位置是否为空或终点位置砖块
playerX = newX;
playerY = newY;
repaint(); // 更新视图
} else if (box[newY][newX] == 2) { // 如果目标位置是箱子
int nextBoxX = newX + dx;
int nextBoxY = newY + dy;
if (box[nextBoxY][nextBoxX] == 0 || box[nextBoxY][nextBoxX] == 3) { // 判断箱子下一步是否为空或终点位置砖块
box[nextBoxY][nextBoxX] = 2;
box[newY][newX] = 0;
playerX = newX;
playerY = newY;
repaint(); // 更新视图
}
}
}
在movePlayer方法中,首先计算出目标位置的坐标newX和newY。然后判断目标位置是否为空或终点位置砖块,如果是,则更新人物的位置,并调用repaint()方法更新视图。如果目标位置是箱子,则需要再次计算出箱子下一步的坐标nextBoxX和nextBoxY,判断下一步是否为空或终点位置砖块。如果是,则更新箱子和人物的位置,并调用repaint()方法更新视图。
最后,在你的界面类中添加KeyListener监听器来监听键盘事件,例如:
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
switch (keyCode) {
case KeyEvent.VK_UP:
map.movePlayer(0, -1);
break;
case KeyEvent.VK_DOWN:
map.movePlayer(0, 1);
break;
case KeyEvent.VK_LEFT:
map.movePlayer(-1, 0);
break;
case KeyEvent.VK_RIGHT:
map.movePlayer(1, 0);
break;
}
}
});
在这个监听器中,根据按下的键码调用movePlayer方法来移动人物。注意要为map组件设置焦点才能接收键盘事件:
map.setFocusable(true); // 设置map组件可获得焦点
map.requestFocusInWindow(); // 让map组件获取焦点




