自行体会
package com.meilingluo.TXZ_2;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class GameFrame extends JFrame {
private JPanel panel;
private JLabel worker;
private JLabel box;
private JLabel goal;
private JLabel[] walls;
private String[] workerImgPaths;//事件处理中使用
private int index = 1;//记录当前关卡
public GameFrame(String title) throws HeadlessException {
super(title);
super.setSize(22 * 48 + 12, 12 * 48 + 35);//12和35是标题和边框占的距离
super.setLocationRelativeTo(null);//让窗体居中
super.setResizable(false);//大小不可改
super.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭结束进程
initPanel();//初始化面板
addEvent();//添加事件处理
}
private void addEvent() {
super.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
int x = 0, y = 0;
String imgPath = workerImgPaths[0];
if (keyCode == KeyEvent.VK_A || keyCode == KeyEvent.VK_LEFT) {
x = -48;
} else if (keyCode == KeyEvent.VK_W || keyCode == KeyEvent.VK_UP) {
y = -48;
imgPath = workerImgPaths[1];
} else if (keyCode == KeyEvent.VK_S || keyCode == KeyEvent.VK_DOWN) {
y = 48;
imgPath = workerImgPaths[2];
} else if (keyCode == KeyEvent.VK_D || keyCode == KeyEvent.VK_RIGHT) {
x = 48;
imgPath = workerImgPaths[3];
}
//让工人移动
worker.setBounds(worker.getBounds().x + x, worker.getBounds().y + y, 48, 48);
ImageIcon img = new ImageIcon("imgs/"+imgPath);
worker.setIcon(img);
//防止撞墙
for(int i=0;i<walls.length;i++){
//如果位置重合
if(worker.getBounds().contains(walls[i].getBounds())){
worker.setBounds(worker.getBounds().x-x,worker.getBounds().y-y,48,48);
break;
}
}
//柔柔推箱子
if(worker.getBounds().contains(box.getBounds())){
box.setBounds(box.getBounds().x+x,box.getBounds().y+y,48,48);
}
//防止箱子撞墙
for (int i = 0;i<walls.length;i++){
if(box.getBounds().contains(walls[i].getBounds())){
box.setBounds(box.getBounds().x-x,box.getBounds().y-y,48,48);
worker.setBounds(worker.getBounds().x-x,worker.getBounds().y-y,48,48);
break;
}
}
//输赢判断
if(box.getBounds().contains(goal.getBounds())){
LevelData data = LevelDataManager.getNowLevelData(++index);
if(data == null){
JOptionPane.showMessageDialog(null,"恭喜你,通关了");
System.exit(0);
}else {
JOptionPane.showMessageDialog(null,"恭喜你,第"+(index-1)+"关过了");
index++;
loadLevelData(data);
}
}
}
@Override
public void keyReleased(KeyEvent e) {
}
});
}
public void loadLevelData(LevelData data) {
panel.removeAll();//删除面板上的所有控件
//加载箱子显示数据
// int[] location = data.getBoxLocation();
// String imgPath = data.getBoxImgPath();
// this.box = initLable(imgPath, location);
this.box = initLable(data.getBoxImgPath(), data.getBoxLocation());
//加载柔柔显示数据
this.workerImgPaths = data.getWorkerImgPaths();
this.worker = initLable(workerImgPaths[0], data.getWorkerLocation());
//this.worker = initLable(data.getWorkerImgPaths()[0],data.getWorkerLocation());
//加载目的地显示数据
this.goal = initLable(data.getGoalImgPath(), data.getGoalLocation());
//加载围墙和障碍物
initWalls(data.getWallImgPath(), data.getWallsLocations());
panel.repaint();//重新加载
}
private void initWalls(String wallImgPath, int[][] wallLocations) {
ImageIcon wallImg = new ImageIcon("imgs/" + wallImgPath);
this.walls = new JLabel[22 * 2 + 10 * 2 + wallLocations.length];
for (int i = 0; i < walls.length; i++) {
walls[i] = new JLabel(wallImg);
}
int index = 0;
//铺上下墙
for (int i = 0; i < 22; i++) {
panel.add(walls[index]);
walls[index++].setBounds(i * 48, 0, 48, 48);
panel.add(walls[index]);
walls[index++].setBounds(i * 48, 11 * 48, 48, 48);
}
//铺左右墙
for (int i = 1; i <= 10; i++) {
panel.add(walls[index]);
walls[index++].setBounds(0, i * 48, 48, 48);
panel.add(walls[index]);
walls[index++].setBounds(21 * 48, i * 48, 48, 48);
}
//添加障碍物
for (int i = 0; i < wallLocations.length; i++) {
int[] wallLocation = wallLocations[i];
panel.add(walls[index]);
walls[index++].setBounds(wallLocation[0] * 48, wallLocation[1] * 48, 48, 48);
}
}
private void initPanel() {
this.panel = new JPanel();
panel.setBackground(Color.pink);
panel.setLayout(null);
super.setContentPane(panel);//窗体和面板关联
}
JLabel initLable(String imgPath, int[] location) {//向面板中添加标签,并返回添加的标签
ImageIcon img = new ImageIcon("imgs/" + imgPath);
JLabel label = new JLabel(img);
panel.add(label);
label.setBounds(location[0] * 48, location[1] * 48, 48, 48);
return label;
}
JLabel initLable(String imgPath, int x, int y) {//向面板中添加标签,并返回添加的标签
ImageIcon img = new ImageIcon("imgs/" + imgPath);
JLabel label = new JLabel(img);
panel.add(label);
label.setBounds(x * 48, y * 48, 48, 48);
return label;
}
}
package com.meilingluo.TXZ_2;
import java.util.Arrays;
public class LevelData {//游戏关卡数据
private String boxImgPath;//箱子图片
private int boxLocation[];//箱子初始位置
private String goalImgPath;//目的地图片
private int []goalLocation;//目的地位置
private String[] workerImgPaths;//柔柔四张图片
private int[] workerLocation;//柔柔地址
private int[][] wallsLocations;//墙的位置
private String wallImgPath;//墙图片
@Override
public String toString() {
return "LevelData{" +
"boxImgPath='" + boxImgPath + '\'' +
", boxLocation=" + Arrays.toString(boxLocation) +
", goalImgPath='" + goalImgPath + '\'' +
", goalLocation=" + Arrays.toString(goalLocation) +
", workerImgPaths=" + Arrays.toString(workerImgPaths) +
", workerLocation=" + Arrays.toString(workerLocation) +
", wallsLocations=" + Arrays.toString(wallsLocations) +
", wallImgPath='" + wallImgPath + '\'' +
'}';
}
public String getWallImgPath() {
return wallImgPath;
}
public void setWallImgPath(String wallImgPath) {
this.wallImgPath = wallImgPath;
}
public void setWallsLocations(int [][] wallsLocations){
this.wallsLocations = wallsLocations;
}
public int[][] getWallsLocations(){
return wallsLocations;
}
public int[] getWorkerLocation() {
return workerLocation;
}
public void setWorkerLocation(int[] workerLocation) {
this.workerLocation = workerLocation;
}
public void setWorkerImgPaths(String [] workerImgPaths){
this.workerImgPaths = workerImgPaths;
}
public String[] getWorkerImgPaths(){
return workerImgPaths;
}
public String getGoalImgPath() {
return goalImgPath;
}
public void setGoalImgPath(String goalImgPath) {
this.goalImgPath = goalImgPath;
}
public int[] getGoalLocation() {
return goalLocation;
}
public void setGoalLocation(int[] goalLocation) {
this.goalLocation = goalLocation;
}
public void setBoxImgPath(String boxImgPath){
this.boxImgPath = boxImgPath;
}
public String getBoxImgPath(){
return boxImgPath;
}
public void setBoxLocation(int []boxLocation){
this.boxLocation=boxLocation;
}
public int []getBoxLocation(){
return boxLocation;
}
}
package com.meilingluo.TXZ_2;
public class LevelDataManager {
public static LevelData getNowLevelData(int index){//返回当前游戏关卡数据
LevelData levelData = new LevelData();
if(index == 1){
levelData.setBoxImgPath("box3.png");
int [] boxLocation = new int[]{3,2};
levelData.setBoxLocation(boxLocation);
levelData.setGoalImgPath("goal3.png");
levelData.setGoalLocation(new int[] {10,8});
String [] workerImgPaths = {"workerLeft4.png","workerUp4.png","workerDown4.png","workerRight4.png"};
levelData.setWorkerImgPaths(workerImgPaths);
levelData.setWallImgPath("wall3.png");
levelData.setWorkerLocation(new int[] {10,1});
int [][] wallsLocations = {
{2, 3}, {3, 3}, {4, 3}, {5, 3},{6, 3},{7, 3},
{4, 5}, {5, 6}, {6, 7}, {7, 8},
{15, 3}, {15, 4}, {15, 5},{15, 6}
};
levelData.setWallsLocations(wallsLocations);
}
else if(index == 2){
levelData.setBoxImgPath("box2.png");
int [] boxLocation = new int[]{3,2};
levelData.setBoxLocation(boxLocation);
levelData.setGoalImgPath("goal2.png");
levelData.setGoalLocation(new int[] {13,8});
String [] workerImgPaths = {"workerLeft4.png","workerUp4.png","workerDown4.png","workerRight4.png"};
levelData.setWorkerImgPaths(workerImgPaths);
levelData.setWorkerLocation(new int[] {9,1});
levelData.setWallImgPath("wall3.png");
int [][] wallsLocations = {
{2, 3}, {3, 3}, {4, 3}, {5, 3},{6, 3},{7, 3},
{4, 5}, {5, 6}, {6, 7}, {7, 8},
{15, 3}, {15, 4}, {15, 5},{15, 6}
};
levelData.setWallsLocations(wallsLocations);
}
else if(index == 3){}
else {
return null;
}
return levelData;
}
}
package com.meilingluo.TXZ_2;
public class Main {
public static void main(String[] args) {
//创建窗体对象
GameFrame gameFrame = new GameFrame("柔柔推箱子");
//得到游戏关卡数据
LevelData data = LevelDataManager.getNowLevelData(1);
//让游戏窗体加载游戏关卡数据
gameFrame.loadLevelData(data);
//游戏可视
gameFrame.setVisible(true);
}
}