tHense计划

想法,写下来,做出来。

thense

tHense是要自己网站的主页做的Flash,一直想要为自己做个Flash,终于要动手了。

但我不知道会不会把它做完,因为这几天我开始觉得对以后非常的非常的不确定。

其它:

  • 我错把HTC Sense记成HTC Hense了,所以就叫tHense吧,名字嘛,终归只是个称呼吧。
  • MVC上采用RobotLegs,UI上采用GhostCat,当然了少不了tInspector

[转载]游戏优化 之 四叉树

原文:http://wxsr.blogbus.com/logs/60788934.html

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://wxsr.blogbus.com/logs/60788934.html

 

 四叉树 (QuadTrees)可以说是2叉树的扩展形式.

为什么在游戏中我们要用4叉树代替一般的遍历查找呢?它的优越性主要在于能在大规模对象队列中快速的查找到你想要的内容,而他的消耗却跟对象数的书目没有太直接的关系;

如图,你可以看到,如果在程序中通过遍历查找对象 那是相当消耗资源的,而且会随着数目的增加而呈正比例消耗;

但4叉树则不同,他通过预先建树的过程把对象整理到一个完整的树状结构中去.查询的时候只要根据要求的范围,通过遍历树节点的方法即可得到想要的数据.快速而简洁,

可能会多人会认为4叉树只适用于静态搜索,对于动态四叉树效率则要相对减慢,本人起初也是这样的想法,但经过验证发现,确实如果你每次都重新遍历树的话,那消耗绝对是要比遍历慢的,但是如果方法得当,想我上图的就是一个动态四叉树,叉用的方法是覆写x跟y的设置,在赋值时验证树状结构是否发生变化,这这样做的好处是我们只需要很小的消耗即可完成修正过程.效率上可以说没有太大改变.

下边说说4叉树的大致原理

首先我们以屏幕中心将区域等分成4等分,然后以这4个区间(红线区间)分支点把在各自区间的对象添加到对应支点的哈希表里边;

然后再分别对这4个区间各自进行4等分,重复上边的步骤,(黄线区间),然后在如此类推,一般说只要进行5-6个层级的等分足以分到 1像素大小左右了,这个过程称之为建树;

建树完毕接下来就是用树;

为什么说4叉树遍历快就在于刚才我们的建树过程已经将对象划分到各个支点中去了,剩下的我们只要根据一个搜索区域或者以及一个精确度即可通过递归的方式遍历与搜索区域相交的区间的节点即可.

比方说搜索区域只与第一区间相交,那么就意味之我们只需要遍历第一个区间的节点即可,那样我们就相当于剩下了其他3个区间对象的遍历了,这就是4叉树快的原因所在,而且他不跟对象数目直接相关,它只在乎建树时的区间等级树.

想我们做游戏场景一般都只会在5000*5000的范围内 这样的大小对于四叉树来说只要6层左右就可以完成建树过程了.但搜索的过程确实那么的快速.高效.

 下边是演示文件 :

http://filer.blogbus.com/1587898/resource_158789812690578840.rar

四叉树在游戏中要我们可以应用于,渲染面积,怪物的搜索ai,及数据搜索,条件剔除,深度排序等…

9格切片位图脚本

Flash的9切片缩放(scale9Grid)对位图是没有效果的,在Flash IDE下,可以把位图的9格区域分别打散来实现。如此繁琐的操作当然最好让jsfl来做了,于是tamt编写了这个小脚本:)

使用的话:

  1. 在库面板中,把含有图片的影片剪辑的“启用9切片比例缩放辅助线”勾上。
  2. 进入这个影片剪辑的编辑状态,选中图片。
  3. 执行“[t]9格切片位图.jsfl”脚本,完成。

[t]9格切片位图.jsfl

在AS3环境下,可以通过著名的ScaleBitmap来实现。

[2010.04.17更新]gksinner也实现了同样的一个脚本,推荐使用^_^

记录编译前信息(SWFCompileInfo)的脚本

这个脚本(JSFL)的作用是在Flash IDE测试影片时先记录下一些信息(例如:时间),然后把这些信息写保存到SWFCompileInfo.as这个类文件中,这样就可以在项目其他类文件中直接引用。
SWFCompileInfo.as会被存放在Flash上设置的首选类目录下。

我主要是把它用于显示项目版本字段。

使用的话,打开.fla然后直接运行脚本即可。

[t]创建SWFCompileInfo类.jsfl

MP3FileReferenceLoader

如果想实现Flash音乐播放器这样的一个功能:选择电脑上的声音文件(FileReference)播放。因为Flash Player 10已经提供了FileReference.load(),看上去利用这个load再把文件ByteArray转成Sound应该很容易就可以实现,但实际上,因为Sound类并没有提供类似Sound.loadBytes的方法,所以就卡在这里了。

怎么样把声音文件的ByteArray转换成Flash的Sound对象?

Mp3FileReferenceLoader可以帮你实现这个转换,它的原理是:

  1. 把声音文件以类的形式嵌入(embed)到一个SWF中
  2. 载入这个SWF
  3. 读取嵌入的声音类

详见作者博文。不过原作者并没有加上对ID3信息的解析,“Annoyingly, all the id3 tags get stripped using this method, and I’m far too lazy to parse these too. ”这里提供的是Mike Almond整合了ID3解析的源码。

用法:

_mp3Loader = new MP3FileReferenceLoader();
_mp3Loader.addEventListener(Event.COMPLETE, onMp3LoaderComplete);

_fileReference = new FileReference();
_fileReference.addEventListener(Event.SELECT, onSelectFile);

_fileReference.browse([new FileFilter("mp3", "*.mp3")]);

private function onSelectFile(ev:Event):void {
	_mp3Loader.getSound(_fileReference);
}

private function onMp3LoaderComplete(evt:Event):void{
	_mp3Sound = _mp3Loader.mp3Sound;
}

下载地址

另外也可以利用著名的as3swf实现这个功能,详见

渐变圆圈进度条

[kml_flashembed publishmethod="static" fversion="9.0.0" useexpressinstall="true" movie="http://www.erikhallander.com/blog/flash/circle.swf" width="550" height="400" targetclass="flashmovie"]
Get Adobe Flash player
[/kml_flashembed]

嗯,很多进度条都是这么个圆圈转啊转的。

这里详细介绍,用法:

public function SnakeCircle(
		_radius:int,
		_circleSize:int,
		fillColor:uint,
		speed:Number,
		direction:String = “CLOCKWISE”
	):void;

源码下载地址

tInspector 1.0.4更新

tInspector

tInspector 1.0.4 增加了快捷键,具体安排如下:

  • ctrl + P: 属性面板
  • ctrl + S: 显示列表结构面板
  • ctrl + I: 打开关闭tInspector
  • ctrl + T: 鼠标查看

键盘的配置通过Inspector的keysManager来管理。目前设计成Inspector的私有成员(private)。

[kml_flashembed publishmethod="static" fversion="9.0.0" movie="http://tinspector.googlecode.com/svn/trunk/demo/tInspectorDemo.swf" width="550" height="400" targetclass="flashmovie"]

Get Adobe Flash player

[/kml_flashembed]

嗯,接下来会有一两篇教程介绍tInspector的使用和设置:)