【架构】Java实现游戏引擎_java游戏引擎开发与实践-程序员宅基地

技术标签: 架构  java  游戏引擎  Java架构思想  

学过编程后,感觉所有的游戏都离不开两个方法,一个是画面更新,一个是指令输入。大概所有的游戏都有这几步流程:

  • 输入指令
  • 根据指令做业务逻辑的判断
  • 根据判断结果更新画面

既然大多数的游戏都离不开这几步,那么为了便利游戏的开发,一些工程师就把这几个方法抽象出来,定义为一个规范,游戏开发者只需要根据这个规范实现游戏的业务逻辑就可以简单高效的开发出一个游戏。这个规范就是所谓的游戏引擎
这篇文章就用JAVA语言来实现一个简易的游戏引擎。

思路分析

首先需要定义一个规范。所以需要一个抽象类,这个抽象类作为游戏引擎,应该存在两个抽象方法 “业务更新” 和 “画面更新”,那么所有使用该引擎开发的游戏都应该继承并实现该抽象类。然后还需要一个游戏公共类用来展示游戏画面和初始化游戏引擎。

游戏引擎抽象类
public abstract class GameEngine {
    

    /**
     * 逻辑更新
     */
    public abstract void updateLogic();

    /**
     * 画面更新
     */
    public abstract void renderUI(Graphics2D g2d);
}

游戏公共类
public class Game extends JPanel {
    

    static GameEngine myGameEngine;
    static int keycode;
    /**
     * 初始化方法,展现游戏界面
     * @param title     窗体标题
     * @param width     窗体宽度
     * @param height    窗体高度
     * @param engine    游戏引擎
     */
    public static void init(String title,int width,int height,GameEngine engine){
    
        myGameEngine = engine;
        JFrame frame =new JFrame(title);
        Game game = new Game();
        game.setPreferredSize(new Dimension(width,height));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(game);
        frame.pack();

        //匿名内部类创建键盘监听器
        frame.addKeyListener(new KeyAdapter() {
    
            @Override
            public void keyPressed(KeyEvent e) {
    
                keycode = e.getKeyCode();
            }

            @Override
            public void keyReleased(KeyEvent e) {
    
                keycode = -1;
            }
        });

        frame.setVisible(true);
        while (true){
    
            engine.updateLogic();
            game.repaint(); //自动重绘
            try {
    
                Thread.sleep(30);
            } catch (InterruptedException e) {
    
                throw new RuntimeException(e);
            }
        }
    }

    /**
     * 返回所按的按键码
     * @return int类型的按键码
     */
    public static int getCurrentKeyCode(){
    
        return keycode;
    }

    /**
     * 游戏结束,结束JVM进程
     * @param message 退出时所显示的文字,例:游戏失败.
     */
    public static void GameOver(String message){
    
        JOptionPane.showMessageDialog(null,message);
        System.exit(0);
    }

    @Override
    public void paint(Graphics g) {
    
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        myGameEngine.renderUI(g2d);
    }

}

怎么使用游戏引擎写个游戏呢?
以贪吃蛇为例我们需要定义一个贪吃蛇游戏引擎继承游戏引擎抽象类并实现renderUI 和 updateLogic 两个方法。然后在主函数中运行游戏公共类中的init方法就可以运行了。

public class SnakeGameEngine extends GameEngine 
public class SnakeGame {
     
  public static void main(String[] args) {
     
    Game.init("贪吃蛇", Config.SCREEN_WIDTH, Config.SCREEN_HEIGHT,new SnakeGameEngine());
}
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_58409024/article/details/127679184

智能推荐

QT+OpenGL绘制_qtgflrb-程序员宅基地

文章浏览阅读2.3k次。QT中已经集成了OpenGL的功能,下面利用OpenGL来实现第一个三角形的绘制。先看效果:#pragma once#include <QOpenGLWidget>#include <QOpenGLFunctions>#include <QOpenGLShaderProgram>class BBBOpenGLWgt : public QOpen..._qtgflrb

ROS 学习笔记3. launch文件的使用_launch如何读取rosparam-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏25次。launch文件的使用一、launch文件启动小海龟demo二、launch文件的各个标签的属性1.launch标签属性2.node标签属性3.include标签属性4.remap标签属性5.param标签属性6.rosparam标签属性6.1 rosparam参数加载6.2 rosparam参数导出6.3 rosparam参数删除7.group标签属性8.arg标签属性8.1arg使用参数默认值8.2arg使用动态传参一、launch文件启动小海龟demolaunch文件同时启动小海龟节点和键盘控制节_launch如何读取rosparam

UVM常用类及树形结构_uvm_component_utils-程序员宅基地

文章浏览阅读271次。本文介绍了UVM常用类及其一般用法,并给出了代码案例;讲述了UVM树形结构和一些常用方法_uvm_component_utils

php7 rabbitmq,GitHub - zhangjiahong123/docker-lnmp: docker-compose+docker+nginx+mysql+php7.3+swoole4...-程序员宅基地

文章浏览阅读103次。1.安装Docker首先需要安装docker 已經安裝过的兄台,可以忽略这一步,执行第二步windows 安装linux下载安装curl -sSL https://get.docker.com/ | sh设置开机自启sudo systemctl enable docker.servicesudo service docker start|restart|stop2. 安装git clone htt..._docker-compose php7.3

JS实现复制到剪贴板功能_js复制hidden内容到剪贴板-程序员宅基地

文章浏览阅读789次。原生JS实现原生JS,先使用 select() 选中输入框文本,然后使用 document.execCommand("Copy")复制到剪贴板前提条件select() 方法只对 <input> 和 <textarea> 有效输入框不能有disabled属性输入框不能有hidden属性输入框的 width 和 height 不能为0实现代码HTML<div> <input id="copyInput" type="text" value_js复制hidden内容到剪贴板

Zip压缩文件没有解压密码怎么办?_zip没密码怎么打开-程序员宅基地

文章浏览阅读5.7w次,点赞19次,收藏59次。Zip压缩文件没有解压密码怎么办?在平时,我们难免的需要到浏览器上面寻找一些需要的资源,可往往下载好了zip文件后,解压时却需要密码。真的让人很痛苦,这样设置密码无非是想利用这些资源来赚取利益罢了。那有没有什么办法可以破解zip解压时需要的密码呢?答案当然是有的,下面我就其中一种方法具体演示一遍,希望对大家有所帮助。(第一次写博客,可能讲的没有那么详细,请见谅)首先我们需要下载一个破解软件..._zip没密码怎么打开

随便推点

分布式设计-程序员宅基地

文章浏览阅读439次。一、分布式知识点:分布式基础、缓存机制、消息机制、搜索机制、分布式ID、分布式锁、分布式SESSION、分布式事务、分布式分页、分布式部署、二、分布式基础知识 软件架构设计的六大原则:https://blog.csdn.net/u012562943/article/details/76110761 软件架构需要考虑的基本原则:https://blo..._分布式设计

J1939多帧_j1939多帧接收拒绝接收-程序员宅基地

文章浏览阅读2.9k次。J1939多帧_j1939多帧接收拒绝接收

JS加载资源失败的解决办法_指向其它服务器页面的 <script> 加载失败。-程序员宅基地

文章浏览阅读1.6k次。比如, 网络不稳定,服务器出错,跨域问题、或者资源本身有问题,导致出现了资源加载失败。就会造成后面需要使用的地方出现。// 便签的名称必须是 'SCRIPT' 与 event 错误的类型不能是 ErrorEvent。标签中资源加载出错,从而执行一些自己想要的操作。'script 加载错误'// 拿到触发错误的标签。_指向其它服务器页面的 加载失败。

OpenCV 读取、修改、保存图像_opencv对传入的对象图片进行修改-程序员宅基地

文章浏览阅读529次。OpenCV 图像保存格式之一为 cv::Mat, 常用 imread 进行图像读取,用 imwrite 进行图像保存,用 imshow 进行图像显示。_opencv对传入的对象图片进行修改

OC基础知识点的总结(全),学习OC的日记_oc setobject-程序员宅基地

文章浏览阅读520次。"font-size:18px;">类的方法 1.在加号方法中不能使用实例变量,实例变量是依托于对象存在的只有有了对象,实例变量才会有空间 2.self 谁调用该方法,self就代表谁 当方法是一个减号方法时, 调用该方法的对象是谁,self就代表当前对象 当方法是一个加号方法时, 调用该方法的类是谁,self就代表当前类 3._oc setobject

解决Java上传文件到Linux 没有读权限_linux设置java上传文件的权限-程序员宅基地

文章浏览阅读1.8k次。问题描述上传图片后想对文件进行查看发现一直是403错误,到linux下找到上传文件的,发现其群组和其他组没有读的权限,修改一下权限则可以访问。由此判定由权限问题导致的403错误。导致权限不足原因<1> tomcat版本差别高版本的tomcat会出现这种问题解决问题<1> 检查linux-- 查看系统默认配置vim /etc/profilelinux文件访问默认权限与umask有关,如果是002或022就正常没有问题。<2> 检查tomcat[_linux设置java上传文件的权限

推荐文章

热门文章

相关标签