java游戏开发杂谈 - 线程
线程,让游戏拥有了动态变化的能力。
java的图形界面,在启动的时候,就开始了一个线程。
这个线程负责处理:JFrame、JPanel等的绘制、事件处理。
它是由操作系统调用的,在程序启动时开启,程序关闭时消亡。
这个线程里执行的逻辑,支撑着图形框架的基础逻辑,我们无法控制它。
想一下,游戏里那些动画效果、呼啸而出的子弹、飘来飘去的云朵。。
这些行为都不是我们用按键和鼠标来控制的,是随着时间自己在动的。
它们在动,说明它们的坐标发生了变化,那么谁来控制这些坐标变化的呢?
答案是:另一个线程!
先看一段线程的代码吧:
package game5;
/**
* java游戏开发杂谈
* ---demo5:引入线程
*
* @author 台哥编程课堂
* https://www.cnblogs.com/chaohi/
*
* @date 2019-04-23
*/
public class GameThread extends Thread{ private GamePanel panel; public GameThread(GamePanel panel){
this.panel = panel;
} public void run() {
while(true){
try {
//程序运行暂停 0.01秒
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
} //循环逻辑的执行
panel.logic(); //页面刷新
panel.repaint();
}
} }
这就是我们定义的、用来控制游戏动态逻辑的、每隔0.01秒就运行一次的线程!
可以把它想成一个定时器,每隔一段时间,就运行一次某个动作。
运行什么动作呢? 游戏的动态逻辑、游戏界面的刷新!
再贴出剩下的两块代码,如下:
package game5; import java.awt.Color;
import java.awt.Graphics; import javax.swing.JPanel;
/**
* java游戏开发杂谈
* ---demo5:引入线程
*
* @author 台哥编程课堂
* https://www.cnblogs.com/chaohi/
*
* @date 2019-04-23
*/ public class GamePanel extends JPanel{
/** 屏幕的宽和高 */
private int width,height; public GamePanel(int width, int height) {
this.width = width;
this.height = height;
this.setSize(width, height); //设置当前画布可以获得焦点。
this.setFocusable(true);
} /**方块的位置*/
private int fk_x = 60;
private int fk_y = 60; /**
* 画布的绘制
*/
public void paintComponent(Graphics g) {
super.paintComponent(g); //画绿色背景
g.setColor(new Color(0x9391d6));
g.fillRect(0, 0, width, height); //绘制方块
g.setColor(Color.red);
g.fillRect(fk_x, fk_y, 80, 80);
} /**
* 游戏逻辑,处理方块的运动,每次横纵坐标都移动1个像素
*/
public void logic()
{
if(fk_x < 260){
fk_x = fk_x + 1;
}else{
fk_x = 60;
} if(fk_y < 260){
fk_y = fk_y + 1;
}else{
fk_y = 60;
}
} }
package game5; import javax.swing.JFrame;
/**
* java游戏开发杂谈
* ---demo5:引入线程
*
* @author 台哥编程课堂
* https://www.cnblogs.com/chaohi/
*
* @date 2019-04-23
*/
public class GameFrame extends JFrame{ private int width = 600, height = 400; public GameFrame() {
//设置窗体标题
this.setTitle("java游戏开发杂谈-台哥出品"); //创建一个画布
GamePanel panel = new GamePanel(width, height);
//把画布加入到窗体中
getContentPane().add(panel, "Center"); //设置窗体大小
this.setSize(width, height);
//设置能否调整窗体大小
this.setResizable(false);
//这句会使得在屏幕上居中显示
this.setLocationRelativeTo(null);
//当关闭窗体的时候退出程序
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
//把窗体显示出来
this.setVisible(true); //开始游戏线程的循环
GameThread gt = new GameThread(panel);
gt.start();
} /**
* 主方法
*/
public static void main(String[] args) {
GameFrame frame = new GameFrame();
}
}
在游戏界面创建时,我们就创建了游戏线程。游戏界面显示后,游戏线程也随之启动了,然后就不断的调用游戏逻辑、刷新游戏界面。
我们就可以在逻辑方法里进行物体的坐标修改、动画的帧数切换、人物的行为变化、地图的移动等等,游戏线程里这一刻运行的逻辑,影响着下一刻游戏界面上的变化。
上面的三段代码,执行后出现的是,一个方块从屏幕左上角往右下角运动,运动一段后再回到左上角。

最好的学习方法,是实践! 眼过千遍,不如手过一遍!
老老实实的把代码放进Eclipse,执行一遍,看看效果。改改代码,再看看执行效果。
用手写,用眼看,用脑想,缺一不可。
台哥编程课堂,用最口语化的表达,介绍编程如何入门。
为什么这么口语化呢,因为台哥的表达能力太差啦,实在写不出书面语来。。
java游戏开发杂谈 - 线程的更多相关文章
- java游戏开发杂谈 - 游戏物体
现实生活中,有很多物体,每个物体的长相.行为都不同. 物体存在于不同的空间内,它只在这个空间内发生作用. 物体没用了,空间就把它剔除,不然既占地方,又需要花精力管理. 需要它的时候,就把它造出来,不需 ...
- java游戏开发杂谈 - 有限状态机
在不同的阶段,游戏所运行的逻辑.所显示的界面,都是不同的. 以五子棋举例,游戏开始.游戏中.胜负已分,对应的界面和逻辑都不同. 在游戏中,又分为:自己下棋.对方下棋.游戏暂停.悔棋等多个状态. 再比如 ...
- java游戏开发杂谈 - 实现游戏主菜单
经常玩游戏的同学,大家都知道,游戏都会有个主菜单,里面有多个菜单选项:开始游戏.游戏设置.关于游戏.退出游戏等等,这个菜单是怎么实现的呢. 有一定桌面软件开发基础的同学可能会想到,用JButton组件 ...
- java游戏开发杂谈 - 事件处理
大家都知道,游戏需要跟玩家交互,需要接收玩家的鼠标.键盘发出的命令,比如在地图上点击一下,人物就自动寻路走过去:键盘上按下某个键,就弹出一个背包界面. 这些逻辑是怎么处理的呢? 大家先不用深究太详细的 ...
- java游戏开发杂谈 - 画布和画笔
在Eclipse里,编写如下两个类: package game2; import java.awt.Color; import java.awt.Graphics; import javax.swin ...
- java游戏开发杂谈 - 创建一个窗体
package game1; import javax.swing.JFrame; /** * java游戏开发杂谈 * ---demo1:创建一个窗体 * * @author 台哥 * @date ...
- java游戏开发杂谈 - 游戏编程浅析
每个游戏,你所看到的它的一切,都是计算机画出来的! 地图是画出来,人物是画出来的,树木建筑是画出来的,菜单按钮是画出来的,滚动的文字.闪烁的图标.云雾烟火,都是画出来的. 游戏编程,所要做的,就是控制 ...
- java游戏开发杂谈 - java是什么
java是一门编程语言, 它有三个开发平台:j2ee.j2se. j2me.(其实android也算一个了) j2ee, 也就是web开发,比如网站.各类管理系统,主要是围绕数据库.网页等进 ...
- java游戏开发杂谈 - 界面刷新、坐标系
之前几篇博客里的例子,大家运行过的话,就能看出来,界面是需要刷新的. JPanel里的绘制方法是paintComponent,界面上的东西都是这个方法画出来的. JPanel对象有一个repaint方 ...
随机推荐
- SOFA 源码分析 — 连接管理器
前言 RPC 框架需要维护客户端和服务端的连接,通常是一个客户端对应多个服务端,而客户端看到的是接口,并不是服务端的地址,服务端地址对于客户端来讲是透明的. 那么,如何实现这样一个 RPC 框架的网络 ...
- php里进程创建和分析
pcntl_fork()函数创建一个子进程,这个子进程仅PID(进程号) 和PPID(父进程号)与其父进程不同成功时,在父进程执行线程内返回产生的子进程的PID,在子进程执行线程内返回0.失败时,在 ...
- 3d轮播图——类似酷狗的轮播
说到轮播图,其实只要是跟web开发相关的无论是前端后端应该都不陌生,各种各样的轮播图,从以前的单纯的平面山水画遮盖滑动或滚动,到Jquery的animate甚至是h5+css3,各种炫酷的轮播图更是层 ...
- SpringBoot开发案例从0到1构建分布式秒杀系统
前言 最近,被推送了不少秒杀架构的文章,忙里偷闲自己也总结了一下互联网平台秒杀架构设计,当然也借鉴了不少同学的思路.俗话说,脱离案例讲架构都是耍流氓,最终使用SpringBoot模拟实现了部分秒杀场 ...
- JS的进阶技巧
前言 你真的了解JS吗,看完全篇,你可能对人生产生疑问. typeof typeof运算符,把类型信息当做字符串返回. //正则表达式 是个什么 ? typeof /s/ // object //nu ...
- @Scheduled cron表达式
一.Cron详解: Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: 1.Seconds Minutes Hours Dayof ...
- Azure Go Management SDK 中国版使用示例
简介 刚学习go几天,尝试调用Azure的SDK进行管理API的操作,基本思路是基于注册的AD Application信息生成token,然后再使用Token生成serviceClient,然后再进行 ...
- const命令,全局变量的属性,变量的解构赋值
const命令 1:声明常量(只在当前代码块中有效)---注意声明的常量可以是对象,但是常量储存的是对象的地址,地址声明后不可变,但是可以给常量对象添加属性 全局变量的属性 1:window和glob ...
- 你不知道的JavaScript--Item28 垃圾回收机制与内存管理
1.垃圾回收机制-GC Javascript具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存. 原理:垃圾收集器会定期(周期性 ...
- 译MassTransit 消息契约
消息契约 在MassTransit中,使用.NET .NET系统定义消息契约.消息可以使用类和接口来定义,但是,建议类型使用只读属性而不使用行为. 注意:强烈建议使用消息接口的接口,基于多年的经验,具 ...