代码改变世界

R G 戏 擎开 日志

2010-03-25 14:33  宝宝合凤凰  阅读(364)  评论(0)    收藏  举报

Flash游戏开发中应该使用的显示层次结构和代码结构

<!--[endif]-->

ActionScript2.0ActionScript3.0有很大的区别,3.0是真正的面向对象语言,而且在内置类的结构体系上要更加合理易懂,同时显示编程的引入以及简单清晰的显示层次结构更是ActionScript的一次升华,将2.0中不推荐的做法从一定程度上摈弃。

那么今天来说说Flash游戏开发中三种层次结构和代码书写的比较(无论是2.0还是3.0都适用)。

 

第一种:按照游戏过程的顺序将需要使用的所有影片剪辑逐次放到主时间轴帧的场景中,同时代码大部分放到影片剪辑或者按钮的脚本中。如果这是一部电影,我的评分是★☆☆☆☆。

第二种:游戏中的各元件按从外到里的顺序分别为:场景[文档[游戏[游戏中的元件]]],而代码统一放到主时间轴的一个叫action层的第一帧中。

解释一下,场景 即舞台,它里面只放一个影片剪辑那就是文档,文档就像ActionScript3.0中的文档类,文档中放有游戏中的诸如生命值显示等影片剪辑和一个叫做游戏的影片剪辑,而游戏中“可以玩的东西”都放到这个游戏的影片剪辑里,这样如果是在rpg游戏中,我们要控制地图移动,则只要控制这个游戏影片剪辑移动和主角反向移动即可。而代码都放到第一帧中也是flash帮助中推荐的最佳做法,不过就是经常需要在某个影片剪辑播放结束时执行一些代码,如停止播放这个影片剪辑,则需要另想它法,有三种做法,1将这类少量的代码放到这个影片剪辑的最后一帧中,此时仍然能保证大部分代码在主时间轴的第一帧;2计算该影片剪辑总共要播放的时间毫秒,用SetTimeout方法去执行播放后的代码;3.EnterFrame事件中判断当前帧是否为最后一帧来执行播放后的代码。

这种做法我的推荐指数是★★★★☆

第三种:完全采用面向对象的编程方式,影片剪辑的层次结构(在AS3中叫做显示层次结构)采用第二种方法中的层次结构,但游戏中需要用代码控制的影片剪辑或者是经常变化在每次打开游戏都“不固定”的影片剪辑,不要放到舞台上去,而由AS自动产生,而代码全部放到外部文件中。甚至可以做的“绝”一点:AS2中舞台上只放一个命名为“文档”的空影片剪辑(即影片剪辑中什么都没有),它绑定到外部的一个类,程序的执行从这个类的构造函数开始,这种更像是应用程序的开发;AS3中则不放任何显示对象,只接把外部的一个类名写到该flash属性的文档类框中。更“绝”的做法就是像FlashDevelop中的开发方式,所有的代码都在外部,FlashDevelop产生的swf文件用反编译工具导出后则发现无论是舞台或者时间轴上还是库里面,什么都没有,只有属性的文档类框中有先前自己定义的一个类名。

这种做法我的推荐指数是★★★★★

 

AS3 RPG游戏引擎开发日志1:设想

  前段时间又准备去做以前没做完的那个RPG游戏(都停好长时间了,有时候觉得自己的毅力是够差的,不过客观的影响也不少),仔细思考后觉得可以做一个AS3RPG游戏引擎,这样就可以做更多的RPG游戏了,思来想去后脑子里面就已经有了一些这个引擎的样子、代码结构和面向用户的使用方式。

  其实脑子里面想做的东西还是很多的,比如之前的“牧场”游戏一直有想做完,并想到在做完后把制作的过程录下来并写成书,这样也许对很多人有帮助。我翻开这个游戏中的代码,发现已经写了很多,但我却没有继续下去(这已经是去年的事了),其实自己毅力是不够的,理想无时无刻产生,很多不错的想法都被自己的惰性给打压了。但在做这个游戏的过程中我探索出了一个自己觉得很好的RPG游戏架构,对我进行下一步的开发很有用,这样我大胆的想做出一个AS3RPG游戏引擎。

  原先我设想这个引擎有两种方式,一种是类似JQuery的方式,所有引擎代码都放到一个文件夹里面,制作游戏时Import相应包,这样就可以使用这个包中的类已实现的功能,减少了自己去写很多代码。

  另一种方式就是发布这个引擎的同时发布一个基于这个引擎的游戏编辑器,引擎的代码嵌入在这个编辑器中,在这个编辑器中可以去制作游戏,这完全体现一个“制作”的过程,设置一些值,定义和添加一些东西(包括地图、角色、动作、事件、NPC以及上传图片和swf文件等等),这些信息放到xml中,图片和swf文件放到xml所标识的目录中,当然也有自己写的代码,但这些代码需要导入引擎中的一个用于扩展的接口包,自定义的类需要实现这其中的一些接口。之后编辑器可以生成swf文件,这个就是游戏了。当然无论是哪一种方式都是开源发布的。

  我觉得第二种方式要优越,其实两种方式没什么区别的,只是第二种方式更彻底更复杂一些,第二种方式中的编辑器还可以做成web的,可以不需要安装就可以使用,这是我昨天才设想到的,呵。

NO PAINS NO GAINS

 

AS3 RPG游戏引擎开发日志3:地图坐标转换

  在这里更改之前说的45度角坐标转换的问题,地图仍然不变,但地图坐标和游戏坐标的关系改变了,它的对应关系如下图:


 

  其中虚线表示地图的边缘,区块中标的数是数组的索引,即地图坐标。地图的高度用大写的H表示,区块的高度用小写的h表示,区块的宽度等于高度的两倍。

 

  • 显示坐标转换成地图坐标

  假设一个点(下图中的A点)的显示坐标为(x,y),地图坐标为(i,j),显示坐标转换成地图坐标就是要在已知x和y的情况下求i和j。

  i的值等于AB的长除菱形区块的边长取整,AB=AF+BF,△ADF是一个直角边比为1:2的直角三角形,其中直角边AD=x,因此AF=√5—x2。△FBK是BF=BK等腰三角形,且底边上的高等于底边FK,FK=GE,GE=AE-AG,AG=x/2,因此BF=√52(y-x/2)。最后

i=(AF+BF)/(√5—h2)=[√5—x2+ √52(y-x/2)]/√5—h2=(y+x/2)/h。

  对j的值求解则要分两种情况,即上图中的A点和O点,确定条件分别是x/2<H-h和x/2>=H-h。

  在A点,j等于AC的长除菱形区块的边长取整,AC=AH+HC,HC=HI=AJ,AJ可以通过i的值求出。AH=√5—x2,AJ=菱形区块的边长-(AB-菱形区块的边长×i)=

√5—h2-[√5—x2+ √52(y-x/2)]+√5—hi2

这是可以得出j=(x/2-y)/h+i+1。

  在O点,同上面的道理一样,区别是求PQ,PQ=OS,最后计算的结果是j=(2H+x/2-y)/h-i。

结论:
        i=(y+x/2)/h
        j=(x/2-y)/h+i+1    当x/2<H-h时
        j=(2H+x/2-y)/h-i    当x/2>=H-h时

  • 地图坐标转换成显示坐标

  此时要将上图中的(6,7)转换成Z点到地图左边缘和上边缘的像素值,这里先直接用显示坐标转换成地图坐标中的二元一次方程组求出x和y,同样分条件:

当i<H/h时:
        x=hj-h
        y=h(2i-j+1)/2
当i>=H/h时:
        x=h(2i+j)-2H
        y=H-hj/2

  以上公式是直接求解出来的,当我们用放进去计算的时候x值是正确的,但y值总是比真实值多了h/2。出现这种情况就要从对应关系上去思考,地图坐标系统中的点,比如(6,7),它实际对应于显示坐标系统中的点不是Z点,而是Z点下方h/2位置处的点,把头向左转一点来看上图,可以看到地图坐标中,点(6,7)的左上角(左上角就是坐标点)就是显示坐标中Z点下方h/2位置处,因此更正后得到转换公式:

当i<H/h时:
        x=hj-h
        y=h(2i-j)/2
当i>=H/h时:
        x=h(2i+j)-2H
        y=H-h(j+1)/2

  • 总结

  数学是很有意思的,原本以为这些公式会与地图倾斜的角度有关,但计算后根号5这个值不存在了,不过这样说也不完全对,因为菱形区块的高宽比正好是1比2,这样导致公式最后也简洁很多。

作者:Rick Carter

出处:http://pains.cnblogs.com/

本文版权归作者所有,转载须保留此处声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

强烈鄙视广告太多太大、广告在显著位置或者页面布局混乱的网站转载。

NO PAINS NO GAINS