代码编织梦想

解决组件闪动问题

在前面的代码中,由于组件不停的分别绘制,会出现明显闪动问题,若将所有组件绘制到同一个画布里,重新绘制时绘制整个画布,就可以有效解决闪动问题。

在窗体中定义一个画布

Image offScreenImage;//定义画布

在绘制函数中将所有的组件都绘制到画布中,并绘制整个画布

public void paint(Graphics g) {//调用绘制函数

        offScreenImage=this.createImage(768,1000);
        Graphics gImage=offScreenImage.getGraphics();

        bg.paintSelf(gImage);
        line.paintSelf(gImage);
        gold.paintSelf(gImage);

        g.drawImage(offScreenImage,0,0,null);
    }

由于前期创建背景类时使用了bg,为避免混淆,今天把它改为了Bg,修改类名时不小心把绘制部分中调用的Bg类中的变量bg也改掉了,导致背景中绘制自己的函数出错。调用时要使用前面定义的变量。还有就是,如果重新写了程序,请一定要记得把外部的图片等素材复制进去,,,

金块抓取收回

为金块添加一个状态3,抓取收回,当线的endx和endy在金块的坐标内时状态为3

//状态 0 摇摆  1 向下抓取  2 收回  3抓取返回
    int state;

    GameWin frame;//使线类可以接收到主窗口中的元素

    Line(GameWin frame){this.frame=frame;}

    void logic(){
        if (endx>this.frame.gold.x && endx<this.frame.gold.x+this.frame.gold.width
                && endy>this.frame.gold.y && endy<this.frame.gold.y+this.frame.gold.height){
            state=3;
        }


void paintSelf(Graphics g){
        logic();
    switch (state){
        //状态0,1,2省略
            case 3:
                if (length>100) {
                    length = length - 10;
                    lines(g);
                    this.frame.gold.x=endx-26;
                    this.frame.gold.y=endy;
                }else {
                    this.frame.gold.x=-150;
                    this.frame.gold.y=-150;
                    state=0;
                }
                break;
    }

多个金块

public class GameWin extends JFrame {          //创建窗口

    List<Object> objectList = new ArrayList<>();//存储金块,石块
    Bg bg=new Bg();
    Line line=new Line(this);

    {//不能直接在类中使用for循环,可以构造无参构造或代码块
        for (int i = 0; i < 3; i++) {
            objectList.add(new Gold());
        }
    }

    Image offScreenImage;//定义画布

    void launch(){
        this.setVisible(true);                //设置窗口是否可见
        this.setSize(768,700);   //直接输入数字即可
        this.setLocationRelativeTo(null);     //窗口居中
        this.setTitle("黄金矿工");             //窗口名称

        setDefaultCloseOperation(EXIT_ON_CLOSE);//关闭窗口

        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                if(e.getButton()==1);//左轮为e
                {line.state=1;}
            }
        });

        while(true){//死循环
            repaint();//使线段不停的重新绘制,即使线可以进行摇摆

            try {
                Thread.sleep(10);//设置时延
            } catch (InterruptedException e) {
                e.printStackTrace();//编写时会发生异常,直接选择try catch解决
            }
        }
    }

    @Override
    public void paint(Graphics g) {//调用绘制函数

        offScreenImage=this.createImage(768,700);
        Graphics gImage=offScreenImage.getGraphics();

        bg.paintSelf(gImage);
        line.paintSelf(gImage);

        for (Object obj:objectList){//增强for循环
            obj.paintSelf(gImage);
        }

        g.drawImage(offScreenImage,0,0,null);
    }

    public static void main(String[] args) { //输入psvm直接声明主函数
        GameWin gameWin=new GameWin();
        gameWin.launch();                    //new一个类后才能调用这个类
    }
}

 线类中

Line(GameWin frame){this.frame=frame;}

    void logic(){
        for (Object obj:this.frame.objectList){//增强for循环
            if (endx>obj.x && endx<obj.x+obj.width
                    && endy>obj.y && endy<obj.y+obj.height){
                state=3;
            }
        }

    }
//前后不再写,直接写case 3
            case 3:
                if (length>100) {
                    length = length - 10;
                    lines(g);
                    for (Object obj:this.frame.objectList) {//增强for循环
                        obj.x=endx-26;
                        obj.y=endy;
                        if (length<=100){
                            obj.x=-150;
                            obj.y=-150;
                            state=0;
                        }
                    }
                }
                break;

多次使用循环增强,感觉冗余度有点高,使用无参构造应该好一点。 

金块类

public class Gold extends Object{
    Gold(){//金块生成位置,因此要设置为变量,使用随机数
        this.x=(int) (Math.random()*700);//窗体大小为768,设置为700防止金块生成在窗体外
        this.y=(int) (Math.random()*400+210);//防止金块生成在天上
        this.width=52;
        this.height=52;
        this.img= Toolkit.getDefaultToolkit().getImage("imgs/gold1.gif");
    }
}

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_47380257/article/details/123489481

intellij idea 学习之一_it小白虫的博客-爱代码爱编程

简介:         程序员每日都会花费数小时使用ide编写和调试代码,其中很多操作都是机械重复且频率非常高,本着"工欲善其事必先利其器"的精神,闷头写代码之外花点时间研究一下自己用的ide,其带来的效率提升非常可观选择了intellij idea这一java集成工作开发环境,从如何高效定位、代码智能提示、重构、关联、版本控制等全方面展示这款idea发挥

idea学习体会与心得_qq_22266971的博客-爱代码爱编程_idea心得体会

** IDEA学习体会与心得 ** 通过近期的学习体会,我觉得IntelliJ IDEA有以下优点: 1:代码输入过程中,自动填充方法或类。智能检查类中的方法,当发现方法名只有一个时自动完成代码输入。 2:自动保存功能

【学习IntelliJ IDEA】12、Netty搭建之第二天-爱代码爱编程

今天定个计划,先解决以下问题: 1、如何在netty工程中添加数据库连接; 2、如何确定唯一的TCP连接,并且将每次连接进行记录; 3、如何设置最大连接数; 4、如何在工程中添加协议解析内容; 5、如何在idea上进行代码上传,加到其他工程中?   从书中了解,如果使用更少的线程处理多个TCP连接,可以减少内存管理和上下文切换所带来的开销,是

IDEA学习二:在IDEA创建第一个Java-web工程(项目)-爱代码爱编程

1.创建JavaWeb工程(项目) Crate New Project–>Java Enterprise,选择自己的SDK(JDK)–>Web Application搭建web应用框架–>next……2.工程(项目)命名那些事儿。详见IDEA学习一中标的标号2 Finish之后注意观察目录。3.web目录中,WEB-INF下的web.xm

IDEA学习三:在IDEA创建第一个python工程(项目)-爱代码爱编程

1.为IDEA配置python编译环境 IDEA初始界面,右下角,展开Configure–>Plugins 在市场中搜索python–>点击Install 安装完成后,install变为installed,如下图样。2.创建python项目(工程) Crate New Project–>java,选择自己的SDK(JDK)–>nex

小白学习Java第二天,玩转IntelliJ IDEA-爱代码爱编程

一、 开发工具IntelliJ IDEA IDEA是一个专门针对Java的集成开发工具(IDE),由Java语言编写。所以,需要有JRE运行环境并配置好环境变量。 它可以极大地提升我们的开发效率,可以自动编译,检查错误,在公司中,使用的就是IDEA进行开发。 1.1 IDEA软件安装 该软件可在官网直接下载,也可以私聊博主发软件包。 此软件集成了32

第五天,IDEA下载及注释-爱代码爱编程

IDEA安装 1.直接进搜索IDEA 2.进入官网找到IntelliJ IDEA点击 3.直接点击Download 4.找到自己电脑的版本;旗舰版需要花钱,功能会多一点;社区版不用花钱,功能少但java学习够用了 5.下载完安装就OK了 6.安装时需要勾选两个东西,第一个选择自己电脑的版本 7.运行起来比较大,建议不要放到C盘里 IDEA使

学习第四天 使用idea创建第一个java项目-爱代码爱编程

首先我们打开昨天刚装的idea或者eclipse,本文以idea为例 打开idea会出现初始化窗口,我们选择新建一个项目进来后我们选择新建java项目 然后选择上我们之前安装好的jdk,jdk默认路径如下: 选择java的hello world项目 最后给项目起个名字,如我起名为javaee,新建的项目自带一串代码,发现跟我们之前第一天所看到的代码是

学习使用IntelliJ IDEA的第一天-爱代码爱编程

安装需注意的地方 Create associations不需要勾选,这部分指以.java .groovy .kt为后缀的文档用intellij idea打开。 安装目录结构 bin:容器,执行文件和启动参数等 help:快捷键文档和其他帮助文档 jre64:64 位java 运行环境 lib:idea 依赖的类库 license:各个插件许可 pl

如何使用IDEA学习java源码以及相关快捷键-爱代码爱编程

文章目录 如何学习源码:图形化操作:方法1.方法2.快捷键:1.打开大纲:2.查看类方法:3.查看类继承的关系图:4查看接口的实现类5 查看定义的变量在哪里被调用6 查看方法在哪里被调用7.查看类及其子类并以层级关系展示参考资料: 如何学习源码: 1.ctrl+左键进入源码 2.看继承和实现的接口 3.看import下的注释第一段话,会介绍特

IDEA学习笔记-爱代码爱编程

目录 1、IDEA的安装、配置和使用 1.1 概述 1.1.1 JetBrains概述 1.1.2 IntelliJ IDEA概述 1.1.3 IDEA相比于eclipse的优势 1.1.4 IDEA下载地址 1.2 IDEA的安装 1.2.1 安装过程 1.2.2 查看安装目录结构 1.2.3 查看设置目录结构 1.3 IDEA的启

IDEA2021.2安装与配置(持续更新)-爱代码爱编程

IDEA2021.2安装与配置(持续更新) 一、下载二、安装三、配置3.1、配置全局生效3.2、首次启动3.3、激活3.4、字体,字体大小3.5、配色方案3.6、注解生效3.7、自动导包移包3.8、自动补全快捷键3.9、格式化代码3.10、代码忽略大小写3.11、git配置3.12、单击打开文件3.13、maven配置3.14、同个项目运行多次的方

idea学习第十天-爱代码爱编程

设置游戏状态,0未开始,1运行,2商店,3失败,4胜利 在窗体中使用switch语句编写五个状态,在状态为0时为起始界面,在背景中打印准备开始字符,并在右击后开始游戏 在状态为1时左右摇摆进行游戏 窗体中 addMouseListener(new MouseAdapter() { @Override

2022java学习笔记五(IDEA开发工具的使用)-爱代码爱编程

2022java学习笔记五(IDEA开发工具的使用) 在业内被公认的 下载文件双击打开并修改安装路径 根据电脑系统的位数进行安装,一直点击下一步 选择使用30天 运行界面 IDEA工具项目创建 一、点击首页的+号,创建工程 修改文件的目录 二、创建Module模块 选择JDK版本 给模块起名根据我们的工程路径创建的模块 点击Finish完成