要找到人物位置并且实现移动,可以在map类中添加一个变量来保存人物的坐标,并在paintComponent()方法中根据该坐标绘制人物。同时,通过重写JPanel类的KeyListener接口来监听键盘事件,在按下方向键时更新人物坐标,并调用repaint()方法重新绘制地图。
具体步骤如下:
- 在map类中添加两个变量x和y来表示人物坐标。
int x = 3;
int y = 3;
上述代码中,将人物初始坐标设置为(3, 3)。
- 修改paintComponent()方法,在(x,y)处绘制人物。
Image renwu = new ImageIcon("D:\\推箱子1\\imge\\renwu.png").getImage();
g.drawImage(renwu, y * size, x * size, size, size, this);
上述代码中,”renwu.png”是需要绘制的人物图片文件名。
- 重写JPanel类的KeyListener接口,在keyPressed()方法中处理按下方向键时更新人物坐标,并调用repaint()方法重新绘制地图。例如,当按下左箭头键时,如果(x,y-1)处是空格或者终点砖块,则更新人物坐标为(x,y-1),否则不做任何操作。
public map(){
//...
setFocusable(true); // 设置焦点
addKeyListener(new KeyAdapter() { // 添加键盘事件监听器
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) { // 按下左箭头键
if (box[x][y - 1] == 0 || box[x][y - 1] == 3) {
y--;
repaint(); // 重新绘制地图
}
} else if (key == KeyEvent.VK_RIGHT) { // 按下右箭头键
// ...
} else if (key == KeyEvent.VK_UP) { // 按下上箭头键
// ...
} else if (key == KeyEvent.VK_DOWN) { // 按下下箭头键
// ...
}
}
});
}
- 运行程序并按下方向键即可移动人物。完整代码如下:
package tuixiangzi;
import javax.swing.*;
import java.awt.*;
public class map extends JPanel {
//0代表为空,1代表围墙 2代表箱子 3代表终点位置砖块 4代表普通砖块
int[][] box = {
{0,0,1,1,1,0,0,0},
{0,0,1,3,1,0,0,0},
{0,0,1,4,1,1,1,1},
{1,1,1,2,4,2 ,3 , 1},
{1 ,3 ,4 ,2 ,5 , 1 , 1 , 1},
{1 , 1 , 1 , 4 ,2 , 1 ,0,0},
{0 , 0 , 0 , 1 ,3 ,1 , 0, 0},
{0,0,0,1,1,1,0,0}
};
int x = 3;
int y = 3;
public map(){
setFocusable(true); // 设置焦点
addKeyListener(new KeyAdapter() { // 添加键盘事件监听器
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) { // 按下左箭头键
if (box[x][y - 1] == 0 || box[x][y - 1] == 3) {
y--;
repaint(); // 重新绘制地图
}
} else if (key == KeyEvent.VK_RIGHT) { // 按下右箭头键
if (box[x][y + 1] == 0 || box[x][y + 1] == 3) {
y++;
repaint(); // 重新绘制地图
}
} else if (key == KeyEvent.VK_UP) { // 按下上箭头键
if (box[x - 1][y] == 0 || box[x - 1][y] == 3) {
x--;
repaint(); // 重新绘制地图
}
} else if (key == KeyEvent.VK_DOWN) { // 按下下箭头键
if (box[x + 1][y] == 0 || box[x + 1][y] ==3 ) {
x++;
repaint(); //重新绘制地图
}
}
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Image image = new ImageIcon("D:\\推箱子1\\imge\\img.png").getImage();
Image xiangzi = new ImageIcon("D:\\推箱子1\\imge\\xiangzi.jpg").getImage();
Image renwu = new ImageIcon("D:\\推箱子1\\imge\\renwu.png").getImage();
int size = Math.min(getWidth() / box[0].length, getHeight() / box.length);//计算每一个格子的大小
for (int i = 0; i < box.length; i++)
for (int j = 0; j < box[i].length; j++) {
if (box[i][j] == 1) {
g.drawImage(image, j * size, i * size, size, size, this);//在每个小格子之中载入地图数据
} else if (box[i][j] == 2) {
g.drawImage(xiangzi, j * size, i * size, size, size, this);
} else if (box[i][j] == 3) {
g.setColor(Color.PINK);
g.fillRect(j * size, i * size, size, size);
} else if (box[i][j] == 4) {
g.setColor(Color.gray);
g.fillRect(j * size, i * size,size,size);
}
}
g.drawImage(renwu,y*size,x*size,size,size,this); // 绘制人物
}
public static void main(String[] args) {
JFrame frame=new JFrame("推箱子游戏");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置点击关闭按钮后的操作,这里是直接退出程序
frame.setSize(800, 600);//设置窗体大小
map Map=new map();//new一个地图类
frame.add(Map);//将地图添加到窗口中
frame.setVisible(true);
}
}
上述代码中,”renwu.png”、”xiangzi.jpg”和”img.png”文件需要放在程序运行的根目录下。如果图片文件位于其他目录下,可以修改文件名为相对或绝对路径。




