swing快速入门(二十三)弹球小游戏

news2025/2/4 18:02:03

注释很详细,直接上代码

上一篇

新增内容

1. 键盘响应监听

2. 使用定时器事件更新画板

3. 定时器事件的开始与暂停

4. 弹球小游戏的坐标逻辑判断

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class swing_test_19 {

    //创建一个窗口
    private Frame frame = new Frame("swing_test_19");

    //桌面宽度
    private int TABLE_WIDTH = 300;

    //桌面高度
    private int TABLE_HEIGHT = 400;

    //球拍的高度和宽度
    private final int RACKET_WIDTH = 60;
    private final int RACKET_HEIGHT = 20;
    //球的大小
    private final int BALL_SIZE = 16;

    //定义变量,记录小球的坐标
    private int ballx = 120;
    private int bally = 20;

    //定义变量,记录小球在x和y方向上分别的移动速度
    private int speedX = 10;
    private int speedY = 5;

    //定义变量,记录球拍的坐标
    private int racketX = 120;
    private final int racketY = 340;

    //定义变量,标识当前游戏是否结束
    private boolean isOver = false;

    //声明一个定时器
    private Timer timer;

    //自定义一个类,继承canvas类,充当画布
    class MyCanvas extends Canvas {
        @Override
        public void paint(Graphics g) {
            //绘制游戏内容
            if (isOver) {
                //游戏结束

                //画笔设置为蓝色
                g.setColor(Color.BLUE);

                //设置游戏字体
                g.setFont(new Font("Times", Font.BOLD, 30));

                //在游戏屏幕中间输出“游戏结束”
                g.drawString("游戏结束", TABLE_WIDTH / 2 - 100, TABLE_HEIGHT / 2);
            } else {
                //游戏进行中

                //绘制小球
                g.setColor(Color.RED);//设置小球颜色
                g.fillOval(ballx, bally, BALL_SIZE, BALL_SIZE);//绘制小球

                //绘制球拍
                g.setColor(Color.PINK);//设置球拍颜色
                g.fillRect(racketX, racketY, RACKET_WIDTH, RACKET_HEIGHT);//绘制球拍


            }
        }
    }

    //创建绘画区
    MyCanvas drawArea = new MyCanvas();

    //组装视图
    public void init() {

        //游戏逻辑控制

        //完成键盘按键对球拍坐标的移动改变
        KeyListener listener = new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                //获取键盘按键的代码
                int keyCode = e.getKeyCode();

                if (keyCode == KeyEvent.VK_LEFT) {//左键

                    if (racketX > 0) {
                        racketX -= 10;
                    }

                } else if (keyCode == KeyEvent.VK_RIGHT) {//右键

                    if (racketX < TABLE_WIDTH - RACKET_WIDTH) {
                        racketX += 10;
                    }
                }
            }
        };

        //给frame和drawArea注册监听器
        frame.addKeyListener(listener);
        drawArea.addKeyListener(listener);

        ActionListener task = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //根据边界范围,反向速度
                if (ballx < 0 || ballx >= TABLE_WIDTH - BALL_SIZE) {
                    speedX = -speedX;
                }

                if (bally <= 0 || (bally > racketY - BALL_SIZE && ballx >= racketX && ballx <= racketX + RACKET_WIDTH)) {
                    speedY = -speedY;
                }

                //判断小球是否超出了球拍的范围,游戏结束
                if ((ballx > racketX + RACKET_WIDTH || ballx < racketX) && bally > racketY - BALL_SIZE) {



                    //停止定时器
                    timer.stop();

                    isOver = true;//游戏结束

                    //重绘界面
                    drawArea.repaint();
                }

                //更新小球的坐标,重绘界面
                ballx += speedX;
                bally += speedY;

                drawArea.repaint();//重绘界面

            }
        };

        //对小球坐标的控制
        timer = new Timer(100, task);
        timer.start();//启动定时器

        //设置drawArea的大小
        drawArea.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT));

        frame.add(drawArea);//将drawArea添加到frame中

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new swing_test_19().init();
    }
}


效果演示:

在这里插入图片描述

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

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

相关文章

即将来临的2024年,汽车战场再起波澜?

我们来简要概况一下11月主流车企的销量表现&#xff1a; 根据数据显示&#xff0c;11月吉利集团总销量29.32万辆&#xff0c;同比增长28%。这在当月国内主流车企中综合实力凌厉&#xff0c;可谓表现得体。而与吉利直接竞争的比亚迪&#xff0c;尽管数据未公布&#xff0c;但我们…

gradio 基本样式

可以在下面的网页上作测试&#xff1a; Gradio PlaygroundPlay Around with Gradio Demoshttps://www.gradio.app/playground1.text、checkbox、Slider import gradio as grdef greet(name, is_morning, temperature):salutation "Good morning" if is_morning e…

Arduino平台软硬件原理及使用——Arduino Uno板卡的使用

本文目录 一、Arduino平台简介 二、Arduino Uno板卡简介 三、Arduino编译器简介 四、Arduino平台结合Arduino Uno板卡的使用 一、Arduino平台简介 Arduino 是一个灵活、易于使用的开源电子平台&#xff0c;这个平台包含软件和硬件。 Arduino能通过各种各样的传感器来感知环境&…

Lang–Kobayashi方程实现混沌python实现混沌序列图像

Lang–Kobayashi方程描述为&#xff1a; 第一部分&#xff08;Drive laser&#xff09;是描述的驱动激光器&#xff0c;第二部分&#xff08;Response laser&#xff09;描述的是响应激光器。实验结构图如下&#xff1a; 虚线框表示响应激光器中的闭环配置。开环中响应激光器无…

C#电源串口调试

目的 记录串口调试的遇到的一些问题以及相应的解决方法 1.串口定义:串口是计算机与其他硬件传输数据的通道&#xff0c;在计算机与外设通信时起到重要作用 2.串口通信的基础知识 C#中的串口通信类 C#使用串口通信类是SerialPort(),该类使用方法是 new 一个 SerialPort对象 为S…

【大模型实践】基于文心一言的对话模型设计

文心一言&#xff08;英文名&#xff1a;ERNIE Bot&#xff09;是百度全新一代知识增强大语言模型&#xff0c;文心大模型家族的新成员&#xff0c;能够与人对话互动、回答问题、协助创作&#xff0c;高效便捷地帮助人们获取信息、知识和灵感。文心一言从数万亿数据和数千亿知识…

Git 配置多个 SSH-Key

Git 配置多个 SSH-Key &#xff08;两个都是gitee&#xff09; 先看图&#xff0c;官网固然重要&#xff0c;但是不完全行&#xff08;因为官网示例是一个gitee一个github&#xff09;&#xff0c;现在想是想多个都是gitee在他上面稍微更改即可 一般不对遇到这种问题&#xf…

Kylin基础知识点解析与应用探索

目录 学习目标&#xff1a; 学习内容&#xff1a; 学习时间&#xff1a; 学习产出&#xff1a; Kylin简介 什么是Kylin Kylin的历史和发展 Kylin在大数据领域的地位和作用 Kylin架构 Kylin的组成部分和模块 Kylin的工作原理和流程 Kylin与其他大数据组件的关系和集成 Kylin功能…

ffmpeg 硬件解码零拷贝unity 播放

ffmpeg硬件解码问题 ffmpeg 在硬件解码&#xff0c;一般来说&#xff0c;我们解码使用cuda方式&#xff0c;当然&#xff0c;最好的方式是不要确定一定是cuda&#xff0c;客户的显卡不一定有cuda&#xff0c;windows 下&#xff0c;和linux 下要做一些适配工作&#xff0c;最麻…

Python知识(2/20):Python基本数据类型

1. Python基本数据类型 Python 中基本的数据类型主要有整型&#xff08;int&#xff09;、浮点型&#xff08;float&#xff09;、布尔型&#xff08;bool&#xff09;、 字符串&#xff08;str&#xff09;。 1.1 整型-int 对于整数类型来说&#xff0c;Python 的特殊之处在…

通过navcat的ssh连接 将一个服务器当作跳板连接远程mysql

文章目录 通过ssh连接一个服务器当作跳板连接远程mysql 通过ssh连接一个服务器当作跳板连接远程mysql 简单来说 一共三台机器 windows Linux&#xff08;入口&#xff09; Linux&#xff08;mysql&#xff09; windows 可以通过ssh 私钥连接Linux&#xff08;入口&#xff09;…

数据分析基础之《numpy(4)—ndarry运算》

一、逻辑运算 当我们要操作符合某一条件的数据时&#xff0c;需要用到逻辑运算 1、运算符 满足条件返回true&#xff0c;不满足条件返回false # 重新生成8只股票10个交易日的涨跌幅数据 stock_change np.random.normal(loc0, scale1, size(8, 10))# 获取前5行前5列的数据 s…

小程序隐私保护指引组件wx.getPrivacySetting

问题&#xff1a;项目里使用了获取微信昵称的input标签&#xff0c;发现上线后获取不到微信昵称 解决方案去更新隐私保护协议 然后重新进入小程序就会弹出弹框 2.自己自定义一个隐私保护提示&#xff0c;以下是我的组件 在component里面创建privacyPopup文件夹 privacyPopup.…

裸色打底裤:“光腿神器”怎么就成了“美丽刑具”?

近日&#xff0c;裸色打底裤因其隐形又保暖、拍照显得像真的光腿一般的效果&#xff0c;一直有着“光腿神器”的美誉&#xff0c;在冬天销量十分可观。然而&#xff0c;最近关于“光腿神器的危害有多大”的话题登上热搜&#xff0c;引发了广泛关注。 裸色打底裤作为一种时尚单…

Ubuntu 常用命令之 chown 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 chown 命令在 Ubuntu 系统中用于改变文件或目录的所有者和组。这个命令的基本格式是 chown [选项]... [所有者][:[组]] 文件...。 chown 命令的主要参数有 -c 或 --changes&#xff1a;类似 verbose&#xff0c;但只在发生改变时…

【快速解决】python数据可视化时候无法显示中文字符的问题/图表中无法显示中文字符

目录 问题展示 解决方法 运行效果展示 问题展示 解决方法 加入以下代码即可 import matplotlib.pyplot as pltplt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False运行效果展示 成功运行出来 &#x1f30c;点击下方个人名片&#xff0c;交流会…

如何使用 Helm 在 K8s 上集成 Prometheus 和 Grafana|Part 1

本系列将分成三个部分&#xff0c;您将学习如何使用 Helm 在 Kubernetes 上集成 Prometheus 和 Grafana&#xff0c;以及如何在 Grafana 上创建一个简单的控制面板。Prometheus 和 Grafana 是 Kubernetes 最受欢迎的两种开源监控工具。学习如何使用 Helm 集成这两个工具&#x…

15张超级有用的电商模版

电商即电子商务(Electronic Commerce) &#xff0c;是利用计算机技术、网络技术和远程通信技术&#xff0c;实现电子化、数字化和网络化的整个商务过程。本专题包含电商运营策略、电商平台底层逻辑、营销流程设计等模板内容。 如果你是一个电商小白&#xff0c;你需要以下的电…

爬虫实战案例 -- 爬取豆瓣读书网页内容

进入网站检查信息 , 确定请求方式以及相关数据 找到爬取目标位置 开始敲代码 # 链接网站 def url_link(url):res requests.get(url,headers headers)response res.textparse_data(response)# 爬取信息 def parse_data(data):msg <li\sclass"media\sclearfix…

【沁恒蓝牙mesh】CH58x DataFlash 详解

本文主要介绍了 沁恒蓝牙芯片 CH58x 的 DataFlash 分区以及读写操作以及原理 &#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的小菜鸟。&#x1f60e;&#x1f4dd; 个人主页&#xff1a;欢迎访问我的 Ethernet_Comm 博…