重要的数据模型之一Brand

  • 重要的数据模型之一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属性有两个作用

  1. 在消除框有个基本的规则是:三个相同的牌就消除,牌是否相同的判断就是name属性
  2. 通过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. 修改

  1. 根据视频,调用了自动刷新并开启前面的this.setVisible(true);还是无法自动显示,故开启两个,修改为:
       this.setVisible(true);//让窗口显示 默认隐藏//添加组件的方法,可以添加自己定义的组件到当前的窗口当中Brand jd = new Brand("剪刀");//       jd.setGray(true);this.getContentPane().add(jd);this.setVisible(true);//启动自动刷新线程autoRefresh();
  1. 或者修改为:
 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. 本次结束代码

  1. 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();}
}
  1. 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;
//    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/762536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++初阶】第七站:string类的初识(万字详解、细节拉满)

前言: 📍本文知识点:string的初识 💨个人博客:Dream_Chaser~-CSDN博客 🚩本专栏:C 目录 一、什么是STL 二、STL的六大组件 三、STL的缺陷 四、为什么学习string类? 五、标准库中…

云ERP vs 本地ERP:优劣对比与选择指南

在性能方面,本地ERP需要需要较高级别的计算机系统和其他设备来确保其高效运行。如果企业的计算机设备不够先进,那么选择本地ERP可能导致系统性能下降。而云ERP解决方案则能保证性能,只要企业拥有稳定的互联网连接即可。 在成本方面&#xff0…

Linux的基本使用

1.Linux的背景 1.1什么Linux Linux是⼀个操作系统.和Windows是"并列"的关系. 1.2Linux系统的优势 1. 开源(意味着免费,便宜) 2. 稳定(Linux可以运⾏很多年,都不会发⽣重⼤问题) 3. 安全(Linux只有管理员或者特定⽤⼾才能访问Linux内核) 4. ⾃由(不会被强加商业产品和…

练习题-15

问题:设函数 f ( x ) ∑ n 0 ∞ cos ⁡ ( n x ) 2 n f(x)\sum_{n 0}^{\infty} \frac{\cos (nx)}{2^n} f(x)∑n0∞​2ncos(nx)​. 求 A ∫ 0 2 π f 2 ( x ) d x A\int_0^{2\pi} f^2(x) dx A∫02π​f2(x)dx. 解:把 f f f看成是某个周期 2 π 2\pi 2…

EasyCloud软件简介

运行环境:Win10 PCL1.9 VTK8.1 Qt5.12 VS2017 基于PCL点云库的三维点云数据处理软件 1.软件用户界面 本软件的用户界面主要包括以下几个部分(如图1): [1]菜单栏,将软件功能模块划分为不同菜单&…

JAVA八股--集合面试题

AVA八股--集合面试题--上 java只有值传递,没有引用传递代理模式Java之HashMap和Hashtable选用 ArrayDeque 来实现队列要比 LinkedList 更好为什么HashMap的长度一定是2的次幂?HashMap常见遍历方式 java只有值传递,没有引用传递 文章讲解 文…

第四讲 Buffer Pool

问题:DBMS 是如何管理其内存和磁盘之间来回移动数据的? 答案:在决定如何在磁盘中来回移动数据时,我们必须考虑两个关键方面: 空间控制【Spatial Control】: 将页【pages】写在在磁盘的什么地方&#xff…

HJ6 质数因子HJ7 取近似值HJ8 合并表记录HJ9 提取不重复的整数

HJ6 质数因子 质数因子_牛客题霸_牛客网 题目分析 算法的核心是质因数分解,它通过以下步骤实现: 1. 处理2的因子 首先,算法处理输入数n的2因子。因为2是最小的质数,也是唯一的偶数质数,所以首先检查n能被2整除多少…

vsc ctrl+. 无效的问题

描述 ubuntu ibus 输入法 vsc ctrl.快捷键无效 输出 _e 解决方案: 运行 ibus-setup 把表情符号这里的快捷键改了

MR混合现实情景实训教学系统在消防安全模拟上的教学应用

MR混合现实情景实训教学系统在消防安全模拟上的教学应用,将为消防安全教育带来一场革命性的改变。该系统能通过混合现实技术将真实环境与虚拟环境结合,让学生亲身体验到真实的火灾现场,并在模拟环境中进行实践操作,提高消防安全意…

Linux系统——Mysql索引详解

目录 一、索引介绍 1.索引的概念 2.索引的作用 3.索引的缺点 4.创建索引的原则依据 5.索引优化 二、索引的分类和创建 1.索引分类 1.1普通索引 1.1.1直接创建索引 1.1.2修改表方式创建 1.1.3创建表的时候指定索引 1.2唯一索引 1.2.1直接创建唯一索引 1.2.2修改表…

mysql 空间查询 多边形内的点

数据库查询 # 1新增空间point类型坐标字段 ALTER TABLE gaoxin_isdp.business_master ADD COLUMN location2 point NULL AFTER location;# 2从原字段更新点位字段,原字段poi1是字符串106.474596,29.464360 UPDATE business_master SET location POINT(substr(poi…

基于Springboot+Vue的前后端分离的简单Demo案例(一)

后端创建Springboot项目 创建数据库表结构及表信息 添加依赖&#xff08;pom.xml&#xff09; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/X…

微服务网关介绍

1. 为什么是Spring Cloud Gateway 一句话&#xff0c;Spring Cloud已经放弃Netflix Zuul了。现在Spring Cloud中引用的还是Zuul 1.x版本&#xff0c;而这个版本是基于过滤器的&#xff0c;是阻塞IO&#xff0c;不支持长连接。Zuul 2.x版本跟1.x的架构大一样&#xff0c;性能也有…

GraalVM详细安装及打包springboot、java、javafx使用教程(打包普通JAVA项目篇)

前言 在当前多元化开发环境下&#xff0c;Java作为一种广泛应用的编程语言&#xff0c;其应用部署效率与灵活性的重要性日益凸显。Spring Boot框架以其简洁的配置和强大的功能深受开发者喜爱&#xff0c;而JavaFX则为开发者提供了构建丰富桌面客户端应用的能力。然而&#xff…

ArcGis 地图文档

ArcGis官网 https://developers.arcgis.com/labs/android/create-a-starter-app/ Arcgis for android 加载谷歌、高德和天地图 https://blog.csdn.net/qq_19688207/article/details/108125778 AeroMap图层地址: API_KEY: 7e95eae2-a18d-34ce-beaa-894d6a08c5a5 街道图&#xf…

Python模块与包管理使用pip与virtualenv【第151篇—模块与包管理】

Python模块与包管理&#xff1a;使用pip与virtualenv 在Python开发中&#xff0c;模块和包管理是至关重要的&#xff0c;它们使得代码的组织、重用和共享变得更加简单和高效。本文将介绍两个Python生态系统中最常用的工具&#xff1a;pip和virtualenv。通过这些工具&#xff0…

探索医用制氧机的种类及其应用场景

医用制氧机是一种能够制取高纯度氧气的制氧设备&#xff0c;广泛应用于各种场景。随着科技的进步和行业需求的增加&#xff0c;医用制氧机的种类和应用领域也在不断扩展。本文将探索医用制氧机的多元种类及其应用领域&#xff0c;以更好地了解这一设备的重要性。 一、医用制氧机…

docker构建镜像命令

编写dockerfile文件 例子1; FROM oraclelinux:7-slim ENV release19 ENV update13 RUN curl -o /etc/yum.repos.d/public-yum-ol7.repo https://yum.oracle.com/public-yum-ol7.repo && \yum-config-manager --enable ol7_oracle_instantclient && \yum in…