其实在数字电路中就已经介绍过这种模型,包括后续的“信息论”、“随机过程”等课程中,也介绍到了这个模型中的一些基本概念。可是平时在课堂上学过了,没有实际应用确实难以记住。这次在师弟Xophiix(http://www.xophiix.com.cn)处看到状态机一文,发现确实能将这一概念运用到Flash的交互开发中。Xophiix虽然仅仅是大二的学弟,但是有着非常强烈的创新欲望和实践经验。所谓三人行必有我师,这次这个“状态机”,确实帮了我那个挫的不能再挫的“是男人就下100层”的大忙。

言归正传,来介绍如何使用状态机模型进行开发。

首先,要明确什么叫做状态(Status)。我不想引用什么字典里的解释,那样只会将这里的问题复杂化。举例说明最方便。就拿我这个游戏来说,玩家所扮演的小人,就存在三种状态:小人跑动(move)、小人站立静止(stand)、小人在空中坠落(falling)。为了配合下面的代码实例,我简记为move, stand, falling,下同。图中分别用橘黄标示为A,B,C。

状态的一大特性就是转化。状态不是孤立的,换句话说,状态是变化的,是会互相转化的,比如,move可以转化到falling;falling可以转化到stand。
值得一提的是,转化有两条原则:
·转化本身的逻辑性 - 并非所有的状态之间都可以任意转化,这里stand就不能变化为falling,因为小人不可能站在挡板上不动自己掉下;而falling也不能转化为move,因为小人掉下的途中不可能跑动(脚踩空),而必须通过一次stand,再跑动。

转化的外界因素 - 转化的时候需要一个外因,这里四种转化,我用数字表示为1,2,3,4,意义分别是
1、移动出了挡板,从空中坠落
2、坠落途中掉在挡板上,站立
3、用户按左、右键,或者掉在了有“方向履带”的挡板上,小人跑动起来
4、用户停止按键并且小人站在非“方向履带”的挡板上,小人站立

这两条原则总结完了之后,就好设计程序了。但是在设计程序之前,一定要把这几个状态以及转换原则疏理清晰,如果你连一共有几种状态都分不清楚就开始写代码,那肯定有更多的麻烦等着你。

while-switch的方法可能是VC程序员最熟悉的了,前文提到的Xophiix的blog中可以看到。不过在Flash中,还是onEnterFrame-switch比较方便。毕竟Flash是按frame渲染的,用onEnterFrame的循环在资源消耗上有着很大的优势。代码如下,保留了整个小人的Action,状态机核心在中间加粗部分:

getPlayer.onEnterFrame = function()
{

if (this.isTowardLeft == undefined)
{
// 是否站在履带上
xinc = 0;
}
else if (this.isTowardLeft)
{
// 左旋转履带
xinc = -1;
}
else
{
// 右旋转履带
xinc = 1;
}
if(Key.isDown(Key.LEFT))
{
//按下左件
xinc -= spd;
}
if(Key.isDown(Key.RIGHT))
{
//按下右件
xinc += spd;
}    switch( statusNow )
{
case “stand”://站立状态
if( xinc != 0 )
{
//如果x轴向增量不为零,代表人应该移动了
this.gotoAndPlay( “move” );
statusNow = “move”;
//跳转到移动状态
break;
}
break;
case “move”://移动状态
if( !this.isOnLand)
{
//如果人不在挡板上,则坠落
this.gotoAndStop( “falling” );
statusNow = “falling”;
}
else if( xinc == 0 )
{
//如果x轴向增量为0,则站住
this.gotoAndStop( “stand” );
statusNow = “stand”;
break;
}
break;
case “falling”://坠落状态
if( this.isOnLand )
{
//如果人掉在挡板上,则转化为站立
this.gotoAndStop( “stand” );
statusNow = “stand”;
break;
}
break;
default:break;
}
//简单物理模型的建立,参考了ox_darkness师兄@Flash8
if( statusNow == “stand” )
{
yinc = 0;
this._y = this.receiveTarget._y;
}
if( statusNow == “move” )
{
yinc = 0;
this._y = this.receiveTarget._y;
if( xinc > 0 )
{
this._xscale = -Math.abs( this._xscale );
}
else if ( xinc < 0 )
{
this._xscale = Math.abs( this._xscale );
}
if( xinc != 0 )
{
this._x += xinc;
}
if( statusNow == “falling” )
{
this._y += yinc;
}
}
if( statusNow == “falling” )
{
yinc+=0.15;
this._y += yinc;
if( xinc > 0 )
{
this._xscale = -Math.abs( this._xscale );
}
else if ( xinc < 0 )
{
this._xscale = Math.abs( this._xscale );
}
if( xinc != 0 )
{
this._x += xinc;
}
}
if (this._y > sceneh || this._y < -5)
{
gameOver();
}
}

本文来自:http://www.awflasher.com/blog/archives/534

转载于:https://www.cnblogs.com/allengaller/articles/1657153.html

状态机-简单、重要、高可应用性的思想相关推荐

  1. 一个简单的高并发的回应服务器(5万并发)

    一个简单的高并发的回应服务器,主要是使用boost的库! 自己测试过可以达到5万个并发! 程序的下载地址:http://download.csdn.net/detail/guanyijun123/83 ...

  2. php redis下单,redis 队列简单实现高并发抢购/秒杀

    redis 队列简单实现高并发抢购/秒杀 2019-03-21 14:34 阅读数 82 前提为每人限购1件 <>开抢前 把秒杀商品库存存进 Redis 队列中 $redis = new ...

  3. 中柏mini3 android,简单的高科技——jumper 中柏 EZpad mini3 平板电脑 篇一:开箱简评...

    简单的高科技--jumper 中柏 EZpad mini3 平板电脑 篇一:开箱简评 2016-03-20 17:31:31 27点赞 31收藏 27评论 本人惯例,先上卡片中柏(Jumper)EZp ...

  4. 最简单理解高内聚低耦合

    低耦合: 耦合就是元素与元素之间的连接,感知和依赖量度.这里说的元素即是功能,对象,系统,子系统.模块. 例如:现在有方法A和方法B 我们在A元素去调用B元素,当B元素有问题或者不存在的时候,A元素就 ...

  5. 简单理解高内聚低耦合-高内聚低耦合通俗理解是什么?

    低耦合: 耦合就是元素与元素之间的连接,感知和依赖量度.这里说的元素即是功能,对象,系统,子系统.模块. 例如:现在有方法A和方法B 我们在A元素去调用B元素,当B元素有问题或者不存在的时候,A元素就 ...

  6. 从简单到高并发服务器(一)

    一个单线程的回声服务器 (Echo Server) 我们从一个简单的服务器开始说起. 它可以接受一个客户的连接,接收消息,然后把这个消息发送回去,关闭连接--完工.我们用 Linux 和 iOS / ...

  7. .net core下简单构建高可用服务集群

    一说到集群服务相信对普通开发者来说肯定想到很复杂的事情,如zeekeeper ,反向代理服务网关等一系列的搭建和配置等等:总得来说需要有一定经验和规划的团队才能应用起来.在这文章里你能看到在.net ...

  8. 简单的高可用集群实验

    前言: 上文介绍了高可用集群的基本概念,下面让我们来试试用两台提供web服务的虚拟机来实现一个小小的高可用集群吧- 首先,配置一个高可用集群的前提有: 1.至少两个节点: 2.共享存储(为了提供的页面 ...

  9. 状态机——简单自动售卖机的实现

    状态机也称为同步有限状态机,分为more型状态机(最后的输出只与当前状态有关,而与输入无关)和mealy型状态机(最后的输出不仅与当前状态有关,还与输入有),适合用来表示事件发生有先后顺序的情况.这里 ...

最新文章

  1. 学习社区以及网站总结
  2. 牛客网_PAT乙级_1019. 数字黑洞 (20)
  3. iPad加价抢购,iPhone 11面临缺货,苹果的供应链困局来了
  4. luogu P2678 跳石头 二分answer
  5. wps 甘特图_强烈推荐5款在线甘特图工具,又简单又清爽又好用
  6. Python空间分析| 03 利用Python进行地理加权回归(GWR)
  7. stm32 hal 模拟i2c
  8. Mac/Linux查看内网ip与访问公网的ip地址
  9. python如何计数while循环次数_While循环计数
  10. 【原创】笔记本键盘故障的心得一二
  11. 马云的电影,丁磊的饭局
  12. 游戏的分类及相关热点
  13. word文档在线编辑推荐超级文档
  14. 本周最新文献速递20220227
  15. OddBall-图异常点检测
  16. 微信小程序页面跳转无效
  17. ftp文件盘服务器回档,企业网盘和FTP服务器对比
  18. 自学Java之day07_API的初识及使用
  19. 非容器化Jenkins连接Kubernetes
  20. 你会成为屋里最有趣的人

热门文章

  1. Facebook认证登录
  2. OpenCV作业及近阶段学习总结
  3. Python爬虫与Opencv结合,制作一款自己的拍照翻译程序!
  4. SpringBoot打成jar包时访问templates下的html出错或访问不到
  5. iOS隐私新规如何破局?盗版SKAdnetwork可行吗?
  6. ERP之替代料的使用
  7. 全景图有什么优势?为什么这么多人在做?
  8. 搭建网站,和把大象装冰箱一样简单?
  9. 因为喜欢德国的严谨,所以我主动找到SAP上云
  10. 线性代数笔记6——直线和曲线的参数方程