Java实现一个打飞机的小游戏【附源码】

简介: Java实现一个打飞机的小游戏【附源码】

1 前言

🚀获取源码,文末公众号回复【飞机】,即可。

⭐欢迎点赞留言

2 正文

2.1 展示

64MB GIF可以欣赏:https://www.z4a.net/images/2022/03/23/ae8bacca260b5e978f1dab8010d9a2a1.gif


2.2 项目结构

2.2 主要代码展示

package main;

import data.Data;
import utils.Load;

import javax.sound.sampled.Clip;
import javax.swing.*;

public class Main {

    public static void main(String[] args) {
        // 创建窗口
        JFrame frame = new JFrame("飞机大战");
        // 添加 JPanel
        Data.canvas = new Canvas(frame);
        frame.setContentPane(Data.canvas);
        // 初始化 Data
        Data.init();
        // 设置图标
        frame.setIconImage(Load.image("ICON.png"));
        // 设置窗口可见
        frame.setVisible(true);
        // 获取标题栏的高度和宽度
        Data.TITLE_BOX_HEIGHT = frame.getInsets().top;
        // 设置大小
        frame.setSize(Data.WIDTH, Data.HEIGHT + Data.TITLE_BOX_HEIGHT);
        // 窗口大小固定
        frame.setResizable(false);
        // 窗口居中显示
        frame.setLocationRelativeTo(frame.getOwner());
        // 窗口关闭时结束程序
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 播放背景音乐
        Load.sound("background").loop(Clip.LOOP_CONTINUOUSLY);
    }
}

2.4 按钮相关类

package scenes;

import data.Data;
import scenes.connector.Scenes;
import utils.Load;
import utils.Rect;

import java.awt.*;

public class About implements Scenes {
    // 背景图片
    Image background;
    // 确定按钮
    Image[] buttonOk;
    // 按钮状态
    int buttonOkStruts = 0;

    public About() {
        buttonOk = new Image[3];

        background = Load.image("关于作者-背景.png");
        buttonOk[0] = Load.image("确定.png");
        buttonOk[1] = Load.image("确定-鼠标移上.png");
        buttonOk[2] = Load.image("确定-鼠标按下.png");
    }

    public void onKeyDown(int keyCode) {

    }

    public void onKeyUp(int keyCode) {

    }

    public void onMouse(int x, int y, int struts) {
        buttonOkStruts = 0;

        if(Rect.isInternal(x, y, 188, 600 + Data.TITLE_BOX_HEIGHT, 132, 42)) {
            buttonOkStruts = struts == Scenes.MOUSE_MOVED ? 1 : struts == Scenes.MOUSE_DOWN ? 2 : 0;
            if(struts == Scenes.MOUSE_UP) Data.canvas.switchScenes("Home");
        }
    }

    public void draw(Graphics g) {
        // 绘制背景
        Data.background.show(g);
        // 绘制关于作者
        g.drawImage(background, 48, 60, null);
        // 绘制按钮
        g.drawImage(buttonOk[buttonOkStruts], 188, 600, null);
    }
}

2.5 背景音乐类

package utils;

import javax.imageio.ImageIO;
import javax.sound.sampled.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;

public class Load {

    public static Image image(String path) {
        BufferedImage img = null;
        URL url = Load.class.getResource("/resources/img/" + path);
        try {
            img = ImageIO.read(url);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return img;
    }

    // 返回一段音乐
    public static Clip sound(String path) {
        try {
            AudioInputStream ais = AudioSystem.getAudioInputStream(Load.class.getResourceAsStream("/resources/sound/" + path + ".wav"));
            Clip sound = AudioSystem.getClip();
            sound.open(ais);
            return sound;
        } catch (LineUnavailableException | UnsupportedAudioFileException | IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    public static void playSound(String path) {
        new Thread(() -> Load.sound(path).start()).start();
    }
}

目录
相关文章
|
16天前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
51 7
|
8天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
55 13
|
22天前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
50 12
|
16天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
18天前
|
人工智能 移动开发 安全
家政上门系统用户端、阿姨端源码,java家政管理平台源码
家政上门系统基于互联网技术,整合大数据分析、AI算法和现代通信技术,提供便捷高效的家政服务。涵盖保洁、月嫂、烹饪等多元化服务,支持多终端访问,具备智能匹配、在线支付、订单管理等功能,确保服务透明、安全,适用于家庭生活的各种需求场景,推动家政市场规范化发展。
|
Java
Java实现一个打飞机的小游戏
Java实现一个打飞机的小游戏,毕业设计,计算机毕业设计。Java实现一个打飞机的小游戏,毕业设计,计算机毕业设计。Java实现一个打飞机的小游戏,毕业设计,计算机毕业设计。Java实现一个打飞机的小游戏,毕业设计,计算机毕业设计。
173 0
Java实现一个打飞机的小游戏
|
8天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
37 6
|
23天前
|
设计模式 Java 开发者
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####
|
21天前
|
存储 监控 小程序
Java中的线程池优化实践####
本文深入探讨了Java中线程池的工作原理,分析了常见的线程池类型及其适用场景,并通过实际案例展示了如何根据应用需求进行线程池的优化配置。文章首先介绍了线程池的基本概念和核心参数,随后详细阐述了几种常见的线程池实现(如FixedThreadPool、CachedThreadPool、ScheduledThreadPool等)的特点及使用场景。接着,通过一个电商系统订单处理的实际案例,分析了线程池参数设置不当导致的性能问题,并提出了相应的优化策略。最终,总结了线程池优化的最佳实践,旨在帮助开发者更好地利用Java线程池提升应用性能和稳定性。 ####
|
22天前
|
缓存 Java 开发者
Java多线程编程的陷阱与最佳实践####
本文深入探讨了Java多线程编程中常见的陷阱,如竞态条件、死锁和内存一致性错误,并提供了实用的避免策略。通过分析典型错误案例,本文旨在帮助开发者更好地理解和掌握多线程环境下的编程技巧,从而提升并发程序的稳定性和性能。 ####