java游戏开发杂谈 - 有限状态机

在不同的阶段,游戏所运行的逻辑、所显示的界面,都是不同的。

以五子棋举例,游戏开始、游戏中、胜负已分,对应的界面和逻辑都不同。

在游戏中,又分为:自己下棋、对方下棋、游戏暂停、悔棋等多个状态。

再比如RPG游戏的人物,站立、行走、奔跑、攻击、死亡都是不同的动画,

发出一颗子弹,从出现,到往前运动、打到目标,或飞出屏幕,都是不同逻辑。



怎么实现这些效果呢?

程序里设定不同的状态,当前是什么状态,就执行什么逻辑。

这个就叫做:有限状态机!

是不是很简单,不要小瞧它,复杂的游戏功能都是靠它实现的。



接下来我们用代码来实现一个简单的效果,

还以小方块为例,让它在屏幕上,以规定方式运动。

package game6;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;
/**
 * java游戏开发杂谈
 * ---demo6:有限状态机
 *
 * @author 台哥编程课堂
 * https://www.cnblogs.com/chaohi/
 *
 * @date 2019-04-25
 */

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);

		//绘制方块,大小为80
		g.setColor(Color.red);
		g.fillRect(fk_x, fk_y, 80, 80);
	}

	//四个状态,对应四个方向的运动
	private static final int stage_left = 0;
	private static final int stage_right = 1;
	private static final int stage_up = 2;
	private static final int stage_down = 3;

	//当前状态,初始为向右
	private int stage = stage_right;

	/**
	 * 游戏逻辑,处理方块的运动,每次横纵坐标都移动1个像素
	 */
	public void logic()
	{
		switch(stage)
		{
		case stage_right:
			if(fk_x < 260){
				fk_x = fk_x + 1; //右移一个像素
			}else{
				stage = stage_down; //超出指定范围,改为向下状态
			}
			break;
		case stage_down:
			if(fk_y < 260){
				fk_y = fk_y + 1;
			}else{
				stage = stage_left;
			}
			break;
		case stage_left:
			if(fk_x > 60){
				fk_x = fk_x - 1;
			}else{
				stage = stage_up;
			}
			break;
		case stage_up:
			if(fk_y > 60){
				fk_y = fk_y - 1;
			}else{
				stage = stage_right;
			}
			break;
		}

	}

}

另外两个类GameFrame和GameThread,跟上一篇博客里的一样,这里不贴出来了。



?

程序运行的效果,就是红色方块从左上角开始,右移、下移、左移、上移,顺时针循环。

代码里我们是定义了四个状态,分别对应四个方向下的运动,

在游戏线程的逻辑方法里,根据当前状态,进行位置属性的更改,线程再调取界面重绘。



java游戏开发杂谈,这是第十篇了,游戏编程的入门知识,介绍的也差不多了。

用的代码例子,界面都很粗糙,因为目的是介绍知识点,越简化,越容易理解。

我还要不要继续写呢。。广州的天气呀,越来越热了,一到下午就容易犯困。。

如果大家看了有收获,欢迎留言,或加我微信:taigecailing

原文地址:https://www.cnblogs.com/chaohi/p/10773608.html

时间: 2024-10-06 17:07:28

java游戏开发杂谈 - 有限状态机的相关文章

java游戏开发杂谈 - 界面刷新、坐标系

之前几篇博客里的例子,大家运行过的话,就能看出来,界面是需要刷新的. JPanel里的绘制方法是paintComponent,界面上的东西都是这个方法画出来的. JPanel对象有一个repaint方法,从字面意思大家也看的懂,这个是重绘方法. 可以粗浅的这么认为:每调用一次repaint,就会执行一次paintComponent 例如:界面上有一个方块,位置在坐标(20,20)处, 按一下向右的方向键,需要方块往右移动一个像素,变为坐标(21,20) 那么在按键监听方法里,判断按下的如果是向右

cocos2d-x 游戏开发之有限状态机(FSM) (四)

cocos2d-x 游戏开发之有限状态机(FSM) (四) 虽然我们了解了FSM,并且可以写自己的FSM,但是有更好的工具帮我们完成这个繁琐的工作.SMC(http://smc.sourceforge.net/)就是这样的工具.下载地址: http://sourceforge.net/projects/smc/files/latest/download 在bin下面的Smc.jar是用于生成状态类的命令行工具.使用如下命令: $ java -jar Smc.jar Monkey.sm 1 真实世

cocos2d-x 游戏开发之有限状态机(FSM) (三)

cocos2d-x 游戏开发之有限状态机(FSM) (三) 有限状态机简称FSM,现在我们创建一个专门的FSM类,负责管理对象(Monkey)的状态.然后Monkey类就实现了行为与状态分离.Monkey类只负责自己的行为,MonkeyFSM作为Monkey的成员,负责状态调度.MonkeyFSM调用状态模式类的方法,状态模式类调用真实对象Monkey的方法.注意本文例子代码只是为了说明问题,并不能真正用于实际当中.其中Monkey与MonkeyFSM互相保存对方的指针,存在循环引用问题. 代码

cocos2d-x 游戏开发之有限状态机(FSM) (二)

cocos2d-x 游戏开发之有限状态机(FSM)  (二) 1 状态模式 State是状态基类.它其实是一个接口,它有3个实现类,分别对应每个状态.Monkey类只需要维护State类,而具体的行为通过3个实现类完成.这就是多态.下面是完整的代码: 2 状态基类 // State.h // #ifndef STATE_H_ #define STATE_H_ class Monkey; struct State { virtual void execute(Monkey *mk) = 0; };

cocos2d-x 游戏开发之有限状态机(FSM) (一)

cocos2d-x 游戏开发之有限状态机(FSM) (一) 参考:http://blog.csdn.net/mgphuang/article/details/5845252<Cocos2d-x游戏开发之旅>(钟迪龙) 基本上所有的软件都是有限状态机(finite-state machine,FSM).它是一个有向图,由一组节点和一组相应的转移函数组成.通俗点讲,它是一个事件驱动系统的模型,这个模型由有限数目的状态,若干输入和状态与状态之间转换的规则组成.在某一时刻,有一个或一组状态是FSM的当

Java软件开发工程师市场需求大不大

Java编程语言是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异.多线程的动态语言.为什么Java开发工程师的待遇一直那么高呢? Java行业市场需求存在巨大的缺口 这几年中国在移动互联网这块发展非常迅猛,各种创业公司.小团队如雨后春笋般冒出来,对Java开发的需要变大.但存在人才发展跟不上市场的需求的现状,相对应的给优秀Java人才开出的薪资待遇随之水涨船高,为此很多大学生看中了这一前景,纷纷加入了动力节点Java培训机构,接受专业的培训,与企业零距离对

Java游戏之碰撞检测

在进行Java游戏开发时,我们经常会遇到碰撞检测的问题.如坦克大战中,炮弹与坦克相遇发生爆炸:守卫者游戏中,守卫者发射的箭与怪物相遇使怪物失血:打飞机游戏中,飞机发送的子弹与敌机相遇干掉敌机.这些都需要实现碰撞检测. 我们先来看一类比较简单的碰撞检测:规则图形的碰撞检测. 矩形碰撞检测 作为一个练手的小游戏,游戏中的物体形状一般为矩形区域,这是规则图形.它的碰撞检测可以通过Java API中的Rectangle类来实现碰撞的检测. Rectangle指的是一个矩形区域,它通过指定左上角位置x和y

java swing开发打飞机的小游戏源代码下载

原文:java swing开发打飞机的小游戏源代码下载 源代码下载地址:http://www.zuidaima.com/share/1550463716084736.htm 这是我为了熟悉java设计模式而练习的代码.其中肯定有很多不足的地方.希望各位牛人们 能多多指点.谢谢

java swing开发俄罗斯方块游戏

原文:java swing开发俄罗斯方块游戏 源代码下载地址:http://www.zuidaima.com/share/1550463573740544.htm 简单的俄罗斯方块游戏,可以读取记录