ZBLOG

package tuixiangzi;import javax.swing.*;import java.awt.*;import java.util.*;import java.io.*;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}, ...

要找到人物位置并且实现移动,可以在map类中添加一个变量来保存人物的坐标,并在paintComponent()方法中根据该坐标绘制人物。同时,通过重写JPanel类的KeyListener接口来监听键盘事件,在按下方向键时更新人物坐标,并调用repaint()方法重新绘制地图。

具体步骤如下:

  1. 在map类中添加两个变量x和y来表示人物坐标。
int x = 3;
int y = 3;

上述代码中,将人物初始坐标设置为(3, 3)。

  1. 修改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”是需要绘制的人物图片文件名。

  1. 重写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) { // 按下下箭头键
                // ...
            }
        }
    });
}
  1. 运行程序并按下方向键即可移动人物。完整代码如下:
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”文件需要放在程序运行的根目录下。如果图片文件位于其他目录下,可以修改文件名为相对或绝对路径。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=5283

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?