📄 gamepanel.java
字号:
package view;
import java.awt.BasicStroke;//BasicStroke 类定义针对图形图元轮廓呈现属性的一个基本集合
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;//Rectangle 指定坐标空间中的一个区域,通过坐标空间中 Rectangle 对象左上方的点 (x,y)、宽度和高度可以定义这个区域。
import java.awt.Shape;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;
import model.Model;
public class GamePanel extends JPanel {
private static final long serialVersionUID = 1L;
private final int borderValue = 3;
private Model model;
public GamePanel(Model model) {
this.model = model;
setBackground(Color.GRAY);
setBorder(new BevelBorder(BevelBorder.LOWERED));
}
private Point getCenter(Rectangle rect) {
return new Point(rect.x + rect.width / 2, rect.y + rect.height / 2);
}
public Rectangle matrixToRect(int row, int col) {
int cellWidth = (getWidth() - 2 * borderValue) / model.getCols();
int cellHeight = (getHeight() - 2 * borderValue) / model.getRows();
int x = col * cellWidth + borderValue;
int y = row * cellHeight + borderValue;
return new Rectangle(x, y, cellWidth, cellHeight);
}
public Rectangle matrixToRect(Point p) {
return matrixToRect(p.x, p.y);
}
@Override
public void paint(Graphics g) {
super.paint(g);
int map[][] = model.getMaps();
for (int i = 0; i < map.length; i++)
for (int j = 0; j < map[0].length; j++) {
Rectangle rect = matrixToRect(i, j);
if (map[i][j] == 0)
continue;
g.drawImage(ImageLoader.getImageOf(map[i][j]), rect.x, rect.y,
null);
}
if (model.getSltMatrix() != null) {
Rectangle rect = matrixToRect(model.getSltMatrix());
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.WHITE);
float dash[] = { (float) 5 };
g2.setStroke(new BasicStroke(2f, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER, 10.0f, dash, 0.0f));
g2.drawRect(rect.x, rect.y, rect.width, rect.height);
}
}
public Point PointToMetrix(Point p) {
int cellWidth = (getWidth() - 2 * borderValue) / model.getCols();
int cellHeight = (getHeight() - 2 * borderValue) / model.getRows();
int row = (p.y - borderValue) / cellHeight;
int col = (p.x - borderValue) / cellWidth;
return new Point(row, col);
}
/**
* 显示路径
*/
public void showPath(final Object obj) {
new Thread(new Runnable() {
ArrayList<Point> points = (ArrayList<Point>) obj;
ArrayList<Shape> shapes = new ArrayList<Shape>();
int step = 30;
public void run() {
// 添加起点矩形
shapes.add(matrixToRect(points.get(0)));
// 添加终点矩形
shapes.add(matrixToRect(points.get(points.size() - 1)));
// 添加直线
for (int i = 1; i < points.size(); i++) {
Point p1 = getCenter(matrixToRect(points.get(i - 1)));
Point p2 = getCenter(matrixToRect(points.get(i)));
if (p1.x == p2.x) {
int distance = p2.y - p1.y;
for (int j = 0; j <= Math.abs(distance); j += step)
shapes.add(new Line2D.Double(p1, new Point(p1.x,
p1.y + distance / Math.abs(distance) * j)));
} else if (p1.y == p2.y) {
int distance = p2.x - p1.x;
for (int j = 0; j <= Math.abs(distance); j += step)
shapes
.add(new Line2D.Double(p1, new Point(
p1.x + distance
/ Math.abs(distance) * j,
p1.y)));
}
shapes.add(new Line2D.Double(p1, p2));
}
Graphics2D g2 = (Graphics2D) getGraphics();
float dash[] = { 4F };
g2.setStroke(new BasicStroke(2.0F, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER, 11.0F, dash, 1.0F));
for (int index = 0; index < shapes.size(); index++) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int pre = 0; pre <= index; pre++) {
if (pre < 2)
g2.setColor(Color.BLUE);
else
g2.setColor(Color.RED);
g2.draw(shapes.get(pre));
}
}
}
}).start();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -