地图的构建
学习于bilibili 尚学堂官方
1.创建Map类
在model包中定义Map类
定义属性,并提供get和set方法
package com.zy.model;
/*
地图
有多个图层 层层遮盖
*/
import java.util.ArrayList;
import java.util.List;
public class Map {
private Integer floorHeight;//层高
private List<Layer> list = new ArrayList<>();//存放图层数据
public Integer getFloorHeight() {
return floorHeight;
}
public void setFloorHeight(Integer floorHeight) {
this.floorHeight = floorHeight;
}
public List<Layer> getList() {
return list;
}
public void setList(List<Layer> list) {
this.list = list;
}
}
2. 创建测试类
在test包中创建TestBuildMap
package com.zy.test;
/*
测试创建一个地图实例 层高3
*/
import com.zy.model.Layer;
import com.zy.model.Map;
import com.zy.util.LayerUtil;
import java.util.List;
public class TestBuildMap {
public static void main(String[] args) {
Map map = new Map();
map.setFloorHeight(3);
Layer layer1 = LayerUtil.build(3,3);
Layer layer2 = LayerUtil.build(6,6);
Layer layer3 = LayerUtil.build(9,9);
map.getList().add(layer1);
map.getList().add(layer2);
map.getList().add(layer3);
List<Layer> list = map.getList();
for (int i = 0; i < list.size(); i++) {
System.out.println("第"+i+"个图层");
list.get(i).showCells();
}
}
}
3. 封装代码
在util中创建工具类MapUtil
package com.zy.util;
import com.zy.model.Layer;
import com.zy.model.Map;
import java.util.List;
public class MapUtil {
public static Map build(Integer floorHeight){
Map map = new Map();
map.setFloorHeight(floorHeight);
Layer layer1 = LayerUtil.build(3,3);
Layer layer2 = LayerUtil.build(6,6);
Layer layer3 = LayerUtil.build(9,9);
map.getList().add(layer1);
map.getList().add(layer2);
map.getList().add(layer3);
List<Layer> list = map.getList();
for (int i = 0; i < list.size(); i++) {
System.out.println("第"+i+"个图层");
list.get(i).showCells();
}
return map;
}
}
创建好Map后返回,对外面隐藏创建地图的细节
4. 定以测试类渲染map
将TestRenderLayer复制一份改名为TestRenderMap
package com.zy.test;
/*
测试渲染一个地图类
*/
import com.zy.model.Brand;
import com.zy.model.Cell;
import com.zy.model.Layer;
import com.zy.model.Map;
import com.zy.util.LayerUtil;
import com.zy.util.MapUtil;
import javax.swing.*;
import java.util.List;
public class TestRenderMap extends JFrame {
private Map map = MapUtil.build(3);
public TestRenderMap(){
//初始化窗口
init();
//渲染图层
List<Layer> list = map.getList();
for (int i = 0; i < list.size(); i++) {
renderLayer(list.get(i));
}
//自动刷新
autoRefresh();
}
private void renderLayer(Layer layer){
//渲染图层
//默认坐标是(0,0)
//布局方式 默认swing 添加组件 提供了多种布局方式 网格 流
Cell[][] cells = layer.getCells();
for (int row = 0; row < cells.length; row++) {
for (int col = 0; col < cells[row].length; col++) {
Brand brands1 = cells[row][col].getBrand();
int x = col * 50;//0 50 100 150 ...
int y = row * 50;//0 50 100 ...
brands1.setBounds(x,y,50,50);
this.getContentPane().add(brands1);
}
System.out.println();
}
}
private void init(){
this.setTitle("易-java-羊了个羊");//设置弹出游戏窗口的标题
this.setSize(450,800);//设置窗口大小
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭的同时也推出java进程
this.setLocationRelativeTo(null);//居中
//设置绝对布局
this.setLayout(null);
this.setBounds(0,0,450,800);
this.setVisible(true);//让窗口显示 默认隐藏
}
//线程
private void autoRefresh(){
JFrame start = this;
new Thread(new Runnable() {
@Override
public void run() {
//用来刷新
while (true){
start.repaint();//调用的还是当前窗口的repaint
try {
Thread.sleep(40);
start.setVisible(true);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}).start();
}
public static void main(String[] args) {
new TestRenderMap();
}
}
5. 居中
由于之前重新定义了布局故将居中代码放到绝对布局中
//设置绝对布局
this.setLayout(null);
this.setBounds(0,0,450,800);
this.setLocationRelativeTo(null);//居中
this.setVisible(true);//让窗口显示 默认隐藏