【Java 2D游戏开发(三)】渲染线程/让Sprite动起来

您所在的位置:网站首页 2d游戏渲染引擎怎么用的 【Java 2D游戏开发(三)】渲染线程/让Sprite动起来

【Java 2D游戏开发(三)】渲染线程/让Sprite动起来

2024-06-03 14:27:46| 来源: 网络整理| 查看: 265

效果图: 运行成功!

针对上次的只有更新窗口时画面才会重画,解决方法很简单: 只需要新建一个线程,隔一段时间就通知游戏窗口重画,不停的在窗口上重画,看起来就好像是动态的画面,实质上只是静态的图片

隔多久呢? 一般的2D游戏的帧数在20-30fps左右

什么是帧/FPS: 帧(Frame):画在游戏窗口上的一张静态图 帧速率(FPS/帧数):静态图片更新速度的快慢(FPS = 1秒 / 1秒内渲染的帧数)

首先修改Game类,添加以下代码:

//..... private int fps;//游戏的FPS //..... //..... /** * 退出游戏 */ public void exit() { System.exit(1); } /** * 返回游戏的FPS */ public int getFPS() { return fps; } /** * 设置游戏的FPS * @param fps 新FPS * @return 是否设置成功 */ public Boolean setFPS(int fps) { if(fps private Thread thread; private boolean exited = false;//游戏是否退出 private int interval;//每次绘制隔多久 public Game game; public RenderThread(Game g) { game = g; interval = 1000 / game.getFPS();//计算出隔多久重画一次(毫秒) System.out.println("[Render]Created"); System.out.println("[Render]Render interval: " + interval + " ms"); } @Override public void run() { System.out.println(thread.getName() + "Start rendering"); while (!exited) { game.repaint();//通知游戏窗口重画 try { Thread.sleep(interval);//间隔一定时间渲染一次,来实现稳定fps } catch (Exception e) { System.out.println(thread.getName() + "Error: " + e.toString()); break; } } System.out.println(thread.getName() + "Stop rendering"); game.exit(); } public void start() { if(thread == null) { thread = new Thread(this, "[RenderThread]"); thread.start(); } } }

在启动游戏的同时启动渲染线程

//Game类... private RenderThread render; //.... public Game(int windowWidth, int windowHeight, int fps) { width = windowWidth; height = windowHeight; this.fps = fps; windowTitle = "Game"; backgroundColor = Color.BLACK; gameObjects = new ArrayList(); createWindow(); render = new RenderThread(this);//初始化线程 render.start();//启动线程 }

启动游戏,看看效果: 成功显示出Sprite 可以看到不需要刷新窗口就能显示出来 下面让Sprite动起来,以便更好地观察效果

修改GameObject类,添加onTick方法,这个方法会在游戏渲染每一帧的时候被调用

/** * 在游戏的每帧被调用 */ public void onTick() { }

下面为了修改让这个方法有实际用途,创建类Player继承Sprite,就可以重写onTick方法:

package com.undertale; import com.game.engine.GameObject; import com.game.engine.Sprite; public class Player extends Sprite { public Player(String filePath) { super(filePath); } @Override public void onTick() { this.transfer(1, 0);//在当前位置的基础上向右移动1个单位长度 } }

修改Main方法:

game = new Game(700, 500, 30);//30fps Player s = new Player("C:\\Users\\Administrator\\Desktop\\a\\spr_maincharad\\char_forward_0.png"); s.setPosition(50, 50); game.addGameObject(s);

启动游戏,好像还是没效果? Sprite静止 因为onTick方法还没有被调用! 修改一下Game类,调用onTick方法

//重写窗体绘制方法 @Override public void paint(Graphics g) { //渲染所有的sprite for(int i = 0; i clear(g); //渲染所有的sprite for(int i = 0; i g.setColor(Color.BLACK);//设置画笔颜色为黑色 g.fillRect(0, 0, width, height);//填充整个窗口为黑色 }

再运行一次: 运行成功! 但是出现了闪烁现象,这是下一次要解决的



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭