- 重要的数据模型之一Brand
- 1. 创建class类
- 2. 属性
- 2.1 属性name
- 2.2 其他属性
- 2.3 代码
- 2.4 绘制牌
- 2.5 添加属性
- 2.6 重写绘制函数
- 2.7 错误
- 2.8 简单测试一下
- 3. 定义一个线程
- 4. 修改
- 5. 本次结束代码
重要的数据模型之一Brand
学习于bilibili 春娇与志明
1. 创建class类
在model包下创建Brand类
Brand代表游戏中的 一张牌
2. 属性
2.1 属性name
String 类型
存储当前牌的名字
name属性有两个作用
- 在消除框有个基本的规则是:三个相同的牌就消除,牌是否相同的判断就是name属性
- 通过name属性找到图片文件,我们在项目的根目录下创建imgs文件夹来存放游戏的素材文件,把用到的图片拷贝过来
2.2 其他属性
Boolean isGray 牌的名称
Image image 是否置灰
Image image 正常的图片
Image grayImage 灰色的图片
Integer x
Integer y x和y 代表当前在渲染的时候左上角的坐标
Integer width
Integer height
并生成对应的get set方法
2.3 代码
package com.zy.model;/*
Brand代表游戏中的 一张牌*/import java.awt.*;public class Brand {private String name;//牌的名称private Boolean isGray;//是否置灰private Image image;//正常的图片private Image grayImage;//灰色的图片private Integer x;//x和y 代表当前在渲染的时候左上角的坐标private Integer y;private Integer width;private Integer height;//name是关键属性,对应imgs下面的图片前缀public Brand(String name) {this.name = name;this.image = Toolkit.getDefaultToolkit().getImage("imgs/" + name + ".png");//上面语句可在imgs中找到对应的name.png对象this.grayImage = Toolkit.getDefaultToolkit().getImage("imgs/" + name + "_gray.png");//上面语句可在imgs中找到对应的name_gray.png对象this.isGray = false;//默认用正常图片this.width = 50;this.height = 50;//后期坐标自动生成,现在先预设this.x = 0;this.y = 0;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Boolean getGray() {return isGray;}public void setGray(Boolean gray) {isGray = gray;}public Image getImage() {return image;}public void setImage(Image image) {this.image = image;}public Image getGrayImage() {return grayImage;}public void setGrayImage(Image grayImage) {this.grayImage = grayImage;}public Integer getX() {return x;}public void setX(Integer x) {this.x = x;}public Integer getY() {return y;}public void setY(Integer y) {this.y = y;}public Integer getWidth() {return width;}public void setWidth(Integer width) {this.width = width;}public Integer getHeight() {return height;}public void setHeight(Integer height) {this.height = height;}
}
2.4 绘制牌
继承Component,Component对象来自java.awt
public class Brand extends Component{
...
}
2.5 添加属性
在Start.java中,方法public Start() throws HeadlessException里写
//添加组件的方法,可以添加自己定义的组件到当前的窗口当中
// this.getContentPane().add(component);
2.6 重写绘制函数
在Brand.java中
//重写绘制自身,传递的参数是画笔@Overridepublic void paint(Graphics g) {if(this.isGray){//绘制灰色图片g.drawImage(this.grayImage,this.x,this.y,null);}else{//绘制正常图片g.drawImage(this.image,this.x,this.y,null);}}
2.7 错误
我们自己定义了坐标xy和长宽,而父类中有同样的属性
故先把它们注释
2.8 简单测试一下
// this.setVisible(true);//让窗口显示 默认隐藏//添加组件的方法,可以添加自己定义的组件到当前的窗口当中Brand jd = new Brand("剪刀");jd.setGray(true);this.getContentPane().add(jd);this.setVisible(true);
不能成功绘制出来
无论this.setVisible(true);
在前在后
原因是:函数执行了,牌添加搭到当前的容器当中,拖动一下窗口边框就会显示
拖动触发了窗口的重新绘制
3. 定义一个线程
在线程中不断刷新当前窗口
在Start.java中写
//线程private void autoRefre(){Start start = this;new Thread(new Runnable() {@Overridepublic void run() {//用来刷新while (true){start.repaint();//调用的还是当前窗口的repainttry {Thread.sleep(40);//40毫秒} catch (InterruptedException e) {throw new RuntimeException(e);}//每40毫秒刷新一下}}}).start();}
在无参构造器中调用
//启动自动刷新线程autoRefresh();
4. 修改
- 根据视频,调用了自动刷新并开启前面的
this.setVisible(true);
还是无法自动显示,故开启两个,修改为:
this.setVisible(true);//让窗口显示 默认隐藏//添加组件的方法,可以添加自己定义的组件到当前的窗口当中Brand jd = new Brand("剪刀");// jd.setGray(true);this.getContentPane().add(jd);this.setVisible(true);//启动自动刷新线程autoRefresh();
- 或者修改为:
private void autoRefresh(){Start start = this;new Thread(new Runnable() {@Overridepublic void run() {//用来刷新while (true){start.repaint();//调用的还是当前窗口的repainttry {Thread.sleep(40);start.setVisible(true);} catch (InterruptedException e) {throw new RuntimeException(e);}}}}).start();}
使用这个可无需使用后面的this.setVisible(true);
5. 本次结束代码
- Start.java
package com.zy.view;
/*
游戏的启动入口*/import com.zy.model.Brand;import javax.swing.*;
import java.awt.*;//JFrame使jdk提供的类,可以绘制窗口,使用窗口的api
public class Start extends JFrame {public Start() throws HeadlessException {this.setTitle("易-java-羊了个羊");//设置弹出游戏窗口的标题this.setSize(400,800);//设置窗口大小this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭的同时也推出java进程this.setLocationRelativeTo(null);//居中this.setVisible(true);//让窗口显示 默认隐藏//添加组件的方法,可以添加自己定义的组件到当前的窗口当中Brand jd = new Brand("剪刀");// jd.setGray(true);this.getContentPane().add(jd);// this.setVisible(true);//启动自动刷新线程autoRefresh();}//线程private void autoRefresh(){Start start = this;new Thread(new Runnable() {@Overridepublic void run() {//用来刷新while (true){start.repaint();//调用的还是当前窗口的repainttry {Thread.sleep(40);start.setVisible(true);} catch (InterruptedException e) {throw new RuntimeException(e);}}}}).start();}public static void main(String[] args) {new Start();}
}
- Brand.java
package com.zy.model;/*
Brand代表游戏中的 一张牌*/import java.awt.*;public class Brand extends Component {private String name;//牌的名称private Boolean isGray;//是否置灰private Image image;//正常的图片private Image grayImage;//灰色的图片private Integer x;//x和y 代表当前在渲染的时候左上角的坐标private Integer y;private Integer width;private Integer height;//name是关键属性,对应imgs下面的图片前缀public Brand(String name) {this.name = name;this.image = Toolkit.getDefaultToolkit().getImage("imgs/" + name + ".png");//上面语句可在imgs中找到对应的name.png对象this.grayImage = Toolkit.getDefaultToolkit().getImage("imgs/"+name+"_gray.png");//上面语句可在imgs中找到对应的name_gray.png对象this.isGray = false;//默认用正常图片this.width = 50;this.height = 50;//后期坐标自动生成,现在先预设this.x = 0;this.y = 0;}//重写绘制自身,传递的参数是画笔@Overridepublic void paint(Graphics g) {// super.paint(g);if(this.isGray){//绘制灰色图片g.drawImage(this.grayImage,this.x,this.y,null);}else{//绘制正常图片g.drawImage(this.image,this.x,this.y,null);}}public String getName() {return name;}public void setName(String name) {this.name = name;}public Boolean getGray() {return isGray;}public void setGray(Boolean gray) {isGray = gray;}public Image getImage() {return image;}public void setImage(Image image) {this.image = image;}public Image getGrayImage() {return grayImage;}public void setGrayImage(Image grayImage) {this.grayImage = grayImage;}// public Integer getX() {
// return x;
// }
//
// public void setX(Integer x) {
// this.x = x;
// }
//
// public Integer getY() {
// return y;
// }
//
// public void setY(Integer y) {
// this.y = y;
// }
//
// public Integer getWidth() {
// return width;
// }
//
// public void setWidth(Integer width) {
// this.width = width;
// }
//
// public Integer getHeight() {
// return height;
// }
//
// public void setHeight(Integer height) {
// this.height = height;
// }
}