PicBoard.java
上传用户:jennyfly
上传日期:2021-08-10
资源大小:735k
文件大小:5k
源码类别:

游戏

开发平台:

Java

  1. package view;
  2. import java.awt.*;
  3. import java.awt.Color;
  4. import java.awt.Graphics;
  5. import java.awt.Graphics2D;
  6. import java.awt.Point;
  7. import java.awt.Rectangle;
  8. import java.awt.Shape;
  9. import java.awt.geom.Line2D;
  10. import java.util.ArrayList;
  11. import javax.swing.JPanel;
  12. import javax.swing.border.BevelBorder;
  13. import model.Model;
  14. /**
  15.  * 
  16.  * @author 何晓飞
  17.  * @version 2.0
  18.  */
  19. public class PicBoard extends JPanel {
  20. private static final long serialVersionUID = 1L;
  21. /* 该类中需要的Model对象 */
  22. private Model model;
  23. /* 小图片的高度 */
  24. private  int cellHeight;
  25. /* 小图片的宽度 */
  26. private  int cellWidth;
  27. /*画笔用来绘制连线*/
  28. private Graphics2D g2;
  29. /**
  30.  * GamePanel (构造函数)初始化类变量并设置GamePanel属性.
  31.  * 
  32.  * @param model
  33.  *            该类中需要的Model对象.
  34.  */
  35. public PicBoard(Model model) {
  36. /*只被调用过一次,故无法实现数据更新*/
  37. this.model = model;
  38. cellWidth=model.getCellWidth();
  39. cellHeight=model.getCellHeight();
  40. setBackground(new Color(0,0,0));
  41. setBorder(new BevelBorder(BevelBorder.RAISED));
  42. }
  43. /**
  44.  * 画出消去图片时显示的连接路径
  45.  * 
  46.  * @param obj
  47.  *            连接路径中的Point对象集
  48.  * drawLink 方法的原理在于使用线程采集矩形对象画出线框,对符合消去的矩形画出
  49.  * 路径.
  50.  * 
  51.  */
  52. public  void drawLink() {
  53. /*
  54.  * 获取关键点
  55.  */
  56. ArrayList<Point> points = model.getKeyPoints();
  57. ArrayList<Shape> shapes = new ArrayList<Shape>();
  58. int step = 80;
  59. // 添加路径起点
  60. shapes.add(model.pointToRect(points.get(0)));
  61. // 添加路径终点
  62. shapes.add(model.pointToRect(points.get(points.size() - 1)));
  63. // 添加路线
  64. for (int i = 1; i < points.size(); i++) {
  65. Point p1 = model.getCenter(model.pointToRect(points.get(i - 1)));
  66. Point p2 = model.getCenter(model.pointToRect(points.get(i)));
  67. if (p1.x == p2.x) {// 画横向的线
  68. int distance = p2.y - p1.y;// 计算线长
  69. for (int j = 0; j <= Math.abs(distance); j += step)
  70. shapes.add(new Line2D.Double(p1, new Point(p1.x,
  71. p1.y + distance / Math.abs(distance) * j)));// 生成一条线并加到shaps中
  72. } else if (p1.y == p2.y) {// 画纵向的线
  73. int distance = p2.x - p1.x;// 计算线长
  74. for (int j = 0; j <= Math.abs(distance); j += step)
  75. shapes.add(new Line2D.Double(p1, new Point(
  76. p1.x + distance/ Math.abs(distance) * j,
  77. p1.y)));// 生成一条线并加到shapes中
  78. }
  79. shapes.add(new Line2D.Double(p1, p2));// 构造并初始化一个具有坐标 (0,
  80. }
  81. float dash[] = { 1F };
  82. for (int index = 0; index < shapes.size(); index++) {
  83. if (index < 2)
  84. {
  85. g2.setColor(new Color(0, 0, 255));// 设置圈图片的颜色
  86. g2.setStroke(new BasicStroke(1.0F, BasicStroke.CAP_SQUARE,
  87. BasicStroke.JOIN_BEVEL, 10.0F, dash, 1.F));
  88. }
  89. else{
  90. g2.setColor(new Color(30, 144, 255));// 设置连线的颜色
  91. g2.setStroke(new BasicStroke(1.5F, BasicStroke.CAP_SQUARE,
  92. BasicStroke.JOIN_BEVEL, 10.0F, dash, 1.F));
  93. }
  94. g2.draw(shapes.get(index));// 使用当前 Graphics2D 上下文的设置勾画
  95. // Shape 的轮廓
  96. }
  97. try {// 连线显示0.4秒
  98. Thread.sleep(400);
  99. repaint();
  100. } catch (InterruptedException e) {
  101. }
  102. }
  103. /**
  104.  * 根据调用model.getMaps()方法返回的二维数组map[][]画游戏中的小图片
  105.  * 
  106.  * @param g
  107.  *            该类中需要的Graphics对象,通过调用Graphics的drawImages方法画游戏中的小图片
  108.  */
  109. public void paint(Graphics g) {
  110. Graphics2D g1=(Graphics2D)g;
  111.         /*图片区域的大小*/
  112. setSize(820, 485);
  113. //设置背景色
  114. g1.setColor(Model.BG_COLOR);
  115.  //填充背景
  116. g1.fillRect(0,0, getWidth(), getHeight());
  117. g1.setColor(new Color(118,238,0 ));
  118. //绘制方格
  119. for(int col=3;col<17;col++){
  120. for(int row=1;row<11;row++){
  121. int x=41*col-2;
  122. int y=41*row-2;
  123. g1.draw3DRect(x, y,41, 41, true);
  124. }
  125. }
  126. int map[][] = model.getMaps();// 获得Model中保存游戏中存在小图片位置的数组
  127. for (int i = 0; i < map.length; i++)
  128. for (int j = 0; j < map[0].length; j++) {
  129. Rectangle rect = model.matrixToRect(i, j);// 指定了坐标空间中的一个区域
  130. // 图片已被消去则跳出本次循环,否则把它画出来
  131. if (map[i][j] == 0)
  132. continue;
  133. g1.drawImage(ImageLoader.getImageOf(map[i][j],model.getPictureFile()),
  134. rect.x, rect.y, cellWidth, cellHeight, this);
  135. }
  136. // 画出游戏图片被选中时显示的小框
  137. if (model.getCellSelected() != null) {// 图片被选中
  138. Rectangle rect = model.pointToRect(model.getCellSelected());// 指定图片所在的区域
  139. g1.setColor(new Color(148, 0, 211 ));
  140. float dash[] = { 2f };
  141. g1.setStroke(new BasicStroke(1.0F, BasicStroke.CAP_SQUARE,
  142. BasicStroke.JOIN_BEVEL, 10.0F, dash, 0.F));// 画出规定样式的小筐
  143. g1.draw3DRect(rect.x,rect.y,rect.width,rect.height,true);
  144. }
  145. /*
  146.  * 画笔必须在此处赋值,否则无法正确获取画笔,如果在drawLink中调用则会导致闪屏
  147.  */
  148.  g2 = (Graphics2D)this.getGraphics();
  149. }
  150. }