JAVA实现闯关小游戏(一)_jframe闯关游戏_L.Z.hao.的博客-程序员秘密

技术标签: 项目分享  java  游戏  个人开发  

(一)游戏设计思路:

游戏效果演示:

JAVA自制小游戏从入门到入土

  • 这个游戏是用java语言实现,采用了swing技术进行了界面化处理,利用了BufferedImage缓冲区减少闪烁,设计思路用了面向对象思想。
  • 此游戏为闯关游戏,类似于超级玛丽,但更加自由一些;画面采用后现代主义抽象风格,音乐采用的星露谷物语里的专辑,有竖琴演奏;

游戏画面:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
画面采用了矛盾性,复杂性和多元化的后现代主义,为局限于单一的闯关游戏,可自由创作改变

游戏框架:

在这里插入图片描述

具体的类 “面向对象”

1.UI类

继承JFrame创建窗口;继承Runnable创建线程;继承KeyListener实现键盘监听

  • List存储当前背景图片和BufferedImage存储当前场景
    image用于双缓存

  • 重写paint方法绘制所有场景;

2.常量(static)类

  • 创建图片:
    public static BufferedImage 存储图片
    public static Llist<>列表类存储障碍物

  • ImageIO流read方法获取图片并加载图片

3.背景类:

  • BufferedImage用于显示当前图片;
    List存储障碍物
  • 生成getter方法
    构造函数判断在第几关;

4.障碍物类继承Runnable:

  • BudderedImage定义当前图片
    构造函数
  • 生成getter方法
    线程判断是否到达终点

5.Role类继承Runnable:

  • 当前的各种状态参数:
    show获取当前role图片;

  • 函数类

    • 构造函数启动线程:
    • 创建移动方法(在空中不能移动);
    • 重写run方法
    • 跳跃和下落方法

6.Enemy类继承Runnable:

  • 当前的各种状态参数:
    show获取当前Mario的图片
  • 函数类
    • 重写run方法
    • 构造函数启动线程:
    • 创建移动方法(在空中不能移动);

7.音乐类播放音乐:

项目中具体难点:

  • 1.游戏中图片常量的导入
  • 2.游戏中页面的切换
  • 3。多个线程的并发处理
  • 4.游戏中画面闪烁的问题
  • 5.游戏中不同的页面对应阻碍物的绘制

1.在这里先说明游戏中图片常量的导入问题

可以有两个思路:

  • 1.在游戏画面中直接访问,利用绝对路径
  • 2.创建常量类,利用ImageIO中的Read方法获取图片:

由于画面有十多张,相对有点多,因此更优先于采用第二个方法,一方面是创建不同BufferedImage对象方便访问,另一方面是更利于绘制缓冲区

imageIO主要有以下几个包:

  • javax.imageio - 表示图片文件的基础接口及类,包括元信息及缩略图等;控制图片的读取处理;执行不同格式之间的互相转换;报出异常等
  • javax.imageio.event - 处理在读写图片时产生的事件同步通知的接口。
  • javax.imageio.matedata - 读写图片元信息用的接口和类。
  • javax.imageio.plugins.bmp - 内建的读写BMP文件的功能类。
  • javax.imageio.plugins.jpeg - 内建的读写JPEG文件的部分实现类。
  • javax.imageio.spi - 读取、写入、转码器使用的服务提供接口,并包含一个运行时注册机制。
  • javax.imageio.stream - 从文件或流中执行低级 I/O 操作的接口和类

具体实现为:

    public static BufferedImage bg=null;     //BufferedImagd类创建图片
	public static BufferedImage bg2=null;


       //利用ImageIO中的read将文件写入
 bg = ImageIO.read(new File(StaticValue.class.getClassLoader().getResource(path + "bg.png").getPath()));
 bg2 = ImageIO.read(new File(StaticValue.class.getClassLoader().getResource(path + "bg2.png").getPath()));

2.游戏中页面的切换:

在这里也可以有两个思路:

  • 1.利用Switch或if判断背景的种类,进行切换
  • 2利用List列(双向连结串行)不断取出背景图
    在这里插入图片描述

思路如下:
在这里插入图片描述
两种方法均有利弊,由于在本游戏中的画面具有连续性,因此选择第二种方法比较容易实现,第一中方法适用于频繁切换界面的情况

 private List<BackGround> allbg = new ArrayList<>();
    //用于存储当前的背景
 private BackGround nowbg = new BackGround();
  nowbg = allbg.get(0);  //初始背景

if(  ){
    
    nowBg = allBg.get(nowBg.getSort());   //自动取出
}

剩余的相关问题会在剩余教程中解决;

(二)UI界面的实现:

在这里插入图片描述

public class UI extends JFrame implements KeyListener,Runnable {
    
    
    private List<BackGround> allBg = new ArrayList<>();        //用于存储所有的背景
    private BackGround nowBg = new BackGround();            //用于存储当前的背景
    private Image offScreenImage = null;                   //画布用于双缓存

    private Role role= new Role();
    private Thread thread = new Thread(this);

    public UI(){
    
       //设置窗口的大小为800 * 600
        this.setSize(800,600);
        //设置窗口居中显示
        this.setLocationRelativeTo(null);
        //设置窗口的可见性
        this.setVisible(true);
        //设置点击窗口上的关闭键,结束程序
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //向窗口对象添加键盘监听器
        this.addKeyListener(this);
        //设置窗口名称
        this.setTitle("闯关");


      ...//添加图片,开启线程等
    }

  public void paint(Graphics g) {
        //设置缓冲区

    ...//绘制图片
  }


   public void run{
                        //重写run方法
       ...//启动线程
   }


                          //键盘监听器
    public void keyTyped(KeyEvent e){
    } 
    public void keyPressed(KeyEvent e){
    }
    public void keyReleased(KeyEvent e){
    }

剩余几个界面会在介绍
今天就先介绍这么多,源码还在打包,如需要私信即可,感谢观看;

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

智能推荐

C/C++如何启动外部可执行程序(exe)_c++启动外部程序_Allen Roson的博客-程序员秘密

本文将介绍四种启动外部可执行程序的方法,排版不分优先级,实际应用中需根据需求选择最合适的方法。1.ShellExecute#include &lt;windows.h&gt;ShellExecute(NULL,L"open",L"F:\\Code\\C++\\startexetest\\Win32\\Debug\\startexetest.exe",NULL,NULL,SW_SHOW);2.WinExec#include &lt;windows.h&gt;WinExe..

Matplotlib散点图,条形图和直方图绘制 案例_Saturday66的博客-程序员秘密

先分享几个画图工具:开源的可视化库–Echartplotlyseaborn上面有很多炫酷的案例可供参考使用其实很多属性与绘制折线图有很多重复的地方,参考上篇折线图.散点图"""散点图"""from matplotlib import pyplot as pltfrom matplotlib import font_managermy_font = font_manager.FontProperties(fname='C:\Windows\Fonts\msyh.ttc',size=14

2008-05-27: CREATE DATABASE LINK (2008-05-27)_fibbery的博客-程序员秘密

Skip Headers Oracle Database SQL Reference10g Release 1 (10.1)Part Number B10759-01

数据源的配置_迷茫的兔子的博客-程序员秘密

DBCP数据源DBCP类包位于 /lib/jakarta-commons/commons-dbcp.jar,DBCP是一个依赖 Jakartacommons-pool对象池机制的数据库连接池,所以在类路径下还必须包括/lib/jakarta- commons/commons-pool.jar。下面是使用DBCP配置MySql数据源的配置片断:xml 代码       destr

程序员编程能力层次模型_高级程序员知识模型_BigLeo的博客-程序员秘密

来自 网络,供参考。对原作者表示感谢! 前言 程序员的编程技能随着经验的积累,会逐步提高。我认为编程能力可以分为一些层次。下面通过两个维度展开编程能力层次模型的讨论。一个维度是编程技能层次,另一个维度是领域知识层次。编程技能层次 编程技能层次,指的程序员设计和编写程序的能力。这是程序员的根本。0段—非程序员: 初学编程者,遇到问题,完全是懵懵懂懂,不知道该怎么编程解决问题。也就是

verilog基础设计7-同步fifo的实现_瞅什么瞅的博客-程序员秘密

1、同步fifo 的实现主要需要考虑以下几点empty 空信号 full 满信号 什么时候读 什么时候写2、 基于以上几点考虑开始书写verilogmodule sy_fifo( input wire clk, input wire rst_n, input wire wr_en, input wire [7:0] data_in, input wire rd_en, output wire full, output reg

随便推点

超详细的网络抓包神器 tcpdump 使用指南_tcpdump icmp_CN-FuWei的博客-程序员秘密

本文主要介绍了 tcpdump 的基本语法和使用方法,并通过一些示例来展示它强大的过滤功能。将 tcpdump 与 wireshark 进行组合可以发挥更强大的功效,本文也展示了如何优雅顺滑地结合 tcpdump 和 wireshark。如果你想了解更多的细节,可以查看 tcpdump 的 man 手册。...

Swift - 使用Alamofire通过HTTPS进行网络请求,及证书的使用_alamofire访问https没任何反应_walkerwqp的博客-程序员秘密

(本文代码已升级至Swift3) 我原来写过一篇文章介绍如何使用证书通过SSL/TLS方式进行网络请求(Swift - 使用URLSession通过HTTPS进行网络请求,及证书的使用),当时用的是URLSession。本文介绍如何使用 Alamofire 来实现HTTPS网络请求,由于Alamofire就是对URLSession的封装,所以实现起来区别不大。(如果Alamof

【Resnet最强变体】ResNeSt学习笔记 --- ResNeSt: Split-Attention Networks_跨图注意力_梦坠凡尘的博客-程序员秘密

代码:https://github.com/zhanghang1989/ResNeSt论文:https://hangzhang.org/files/resnest.pdf尽管图像分类模型最近不断发展,但是由于其简单而模块化的结构,大多数下游应用程序(例如目标检测和语义分割)仍将ResNet变体用作backbone。ResNeSt展示了一个简单的模块:Split-Attention,该块可实现跨...

linux slf4j找不到,SLF4J错误消息_恋猫的博客-程序员秘密

在本章中,我们将讨论在使用SLF4J时获得的各种错误消息或警告以及这些消息的原因/含义。无法加载类“org.slf4j.impl.StaticLoggerBinder”。这是在类路径中没有提供SLF4J绑定时引起的警告。以下是完整的警告 -SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".SLF4J: Defaultin...

一次INTERNAL_SERVER_ERROR的问题分析_e_server_internal_「已注销」的博客-程序员秘密

问题现象晚上版本上线后,发现工号进入首页后页面空白,显示INTERNAL_SERVER_ERROR过程回顾通过fiddler抓包,发现某个请求出现500错误检查应用,was,ihs日志,没有发现有效日志发现只有部分工号有问题,开始怀疑存在数据问题,准备导数据回测试环境验证同时,新建一套ihs和was环境进行验证新环境验证,发现原来失败的工号可以正常,怀疑环境配置有问题。同...

数字系统实验—第11-12周任务(认识数据存储芯片HM62256、IP核、LPM开发流程和平台、 IIC串行总线时序分析)_Flechazo_z的博客-程序员秘密

数字系统实验—第11-12周任务—硬件语言描述训练3任务书(18级在家实验,可能不同)0.简介1. 认识数据存储芯片HM62256、IP核、LPM开发流程和平台实操:C级任务(80%)实操:B级任务(90%)实操:A级任务(100%)2. IIC串行总线时序分析实操:S级任务(110%)3. 提交数字系统实验——硬件语言描述训练3一、C级任务1、 设计HM62256测试电路并对其仿真验证2、 依据上述HM62256的功能,定制开发一个1-port RAM的IP核二、B级任务1、 html文件波形分析(htm

推荐文章

热门文章

相关标签