分类存档: work

移除匿名函数的侦听便捷方法

使用arguments.callee。
arguments.callee 指当前被调用的函数。
下面是代码 :
mc.addEventListener(Event.ENTER_FRAME, function(e:Event):void{
//…..
mc.removeEventListener(Event.ENTER_FRAME, arguments.callee);
});

Alchemy 再发行版发布(Win32)

还在为安装和配置Alchemy发愁吗?Alchemy Repack版本发布解除这个问题.

Features

- Auto installation of files, Shorcuts, and cie
- Choice of installation destination
- Generating user passwd and group files
- Generating user profile bashrc
- Auto setup of Alchemy paths
- Auto config Alchemy and link LLVM
- Windows Full Paths navigation (Helper fx)
- Fast compiler functions (Helpers fx)
- Clean on/off  (Clear tempory files .as, .abc, .o, ..) Default = on

官方下载地址

http://www.covergraph.com/blog/archives/alchemy_0.5_setup.exe

U盘下载

http://u.115.com/file/f48b099761

多款as3游戏框架

转自蓝色理想论坛

转自 http://blog.sina.com.cn/s/blog_4a1606960100ixeu.html#post 有删改
这篇文章开始于对Adrian Parr博客中AS3 Code Libraries一文的翻译,虽然开源AS3 Library列表的文章不少,翻译这篇是因为感觉里面大多数东西都是比较著名的,我能用得到的,所以翻译整理一下以备日后不时之需。
对原有的列表进行了部分删减。
对于library的评注和截图将不断添加。
3D引擎
注:对于3D引擎,渲染的效率和支持的渲染功能是很重要的,然而在短短的文章中根本不可能做详细的介绍,特别是截图,很可能具有误导性,要了解更多应用案例以及技术演示的图片,请点击各个引擎的链接到网站上观看,本分类下所放置的图片只是举例该引擎的某一个应用,具有极大随意性,不代表该引擎最好的应用案例。
* Papervision3D
http://blog.papervision3d.org/
不敢说这个是目前最好的AS3三维引擎,但是绝对是最活跃的三维引擎,从互联网上的教程数量,维护团队的活跃程度,用户的规模都可以看出。我使用的就是这个三维引擎,一些案例可以看博客的PV3D分类。
* Away 3D
http://www.away3d.com/
PV3D最大的竞争对手,名气也很大,功能非常丰富,感觉有的时候功能比PV3D要更新的快,不过在我还关注3D引擎比较的时候,Away3D的运行效率(CPU,内存占用率,FPS等)一直不如PV3D,所以最终没有选择它。活跃程度上没有PV3D高,在国内也是如此。
* Sandy 3D
http://www.flashsandy.org/
名气较前两者稍逊,对它的了解不多。
* Alternativa Platform
http://blog.alternativaplatform.com/en/
俄国人开发的引擎,不是开源的,但是效果很强(至少从目前网络上流传的演示来看是如此的),刚一推出便引起业界震动,但是不开源的话恐怕普及度要差很多。
* FIVe3D
http://five3d.mathieu-badimon.com/
与上述引擎不同,FIVe33D是的理念是“矢量3D引擎”,看看它的案例就知道,里面的三维图像都是矢量绘制的,别具一格。用的好的话可以做出与众不同的效果,FIVe3D的官方站点就是很好的案例,非常具有设计感,应该算是另辟蹊径的一款三维引擎。
* WireEngine3D (we3d)
http://osflash.org/we3d/
轻量级的高速Flash 8/9三维引擎,支持LWO(Lightwave Object)格式文件的直接读取
* Sharikura
http://temp.roxik.com/datas/physics/
不开源,效果以及执行效率都非常强大的三维引擎,由日本Flash届No.2 Roxik开发,自己使用,最著名的代表作是ECO ZOO。
*
3D游戏引擎
* PaperWorld 3D
http://paperworld3d.com/
3D 动画开发框架
* Cast3D
http://www.cast3d.org/
基于关键帧过渡的三维动画引擎,支持Skin、蒙皮动画、3D音源等,渲染依靠其他3D引擎,目前支持的有Sandy 3D和PV3D。拥有自己的动画文件格式(XML),无需编程即可完成三维场景的动画制作。
3D 物理引擎
* WOW-Engine
http://seraf.mediabox.fr/wow-engine/
* jiglibflash
http://www.jiglibflash.com/blog/
动画Tweening(过渡 补间)
* Tweener
http://code.google.com/p/tweener/
* TweenLite
http://blog.greensock.com/tweenliteas3/
* TweenMax
http://blog.greensock.com/tweenmaxas3/
* Tweensy
http://www.lostinactionscript.co … ne-tweensy-preview/
* GoASAP (ActionScript动画平台)
http://www.goasap.org/
* AS3 Animation System 2.0
http://www.boostworthy.com/blog/?p=170
* Animation Package
http://www.alex-uhlmann.de/flash/animationpackage/
* KitchenSync – KitchenSync用于管理和触发基于时间的各种行为动作,例如延迟5秒做某某事.
http://code.google.com/p/kitchensynclib/
* Gyro – A tween and animation library for ActionScript 3
http://code.google.com/p/gyro-actionscript-animation/
* gTween
http://www.gskinner.com/blog/arc … tween_a_new_tw.html
* HydroTween + HydroSequence (基于 GoASAP)
http://blog.hydrotik.com/2008/07 … ydrosequence-rev32/
* AS3 Easing
http://www.uza.lt/codex/as3-easing/
* Twease
http://code.google.com/p/twease/
2D物理引擎
* APE (Actionscript Physics Engine的缩写)
http://www.cove.org/ape/index.htm
* Box2DFlashAS3
http://box2dflash.sourceforge.net/
* FOAM – 2维刚体物理引擎
http://code.google.com/p/foam-as3/
* glaze – 2维刚体物理引擎以及游戏引擎
http://code.google.com/p/glaze/
* motor2
http://lab.polygonal.de/motor_physics/
* Fisix Engine
http://www.fisixengine.com/default.asp
* PopShapes
http://lab.andre-michelle.com/physics-engine/

fisix

www.fisixengine.com/
安全
* AS3Crypto
http://crypto.hurlant.com/
声音
* Popforge
http://code.google.com/p/popforge/
粒子系统
* FLiNT
http://flintparticles.org/
* Partigen (付费)
http://desuade.com/products/partigen/
* Pulse Particle System
http://www.rogue-development.com/pulseParticles.html
* Emitter – ActionScript 3.0 particle FX engine
http://code.google.com/p/emitter/
数据可视化
* Flare – 漂亮的可交互的信息可视化
http://flare.prefuse.org/
载入
* BulkLoader – 同时管理多个数据载入项
http://code.google.com/p/bulk-loader/
* Masapi
http://code.google.com/p/masapi/
* QueueLoaderAS3
http://code.google.com/p/queueloader-as3/
* SomaLoader
http://www.soundstep.com/blog/downloads/somaloader/
OOP面向对象程序开发框架
* Cairngorm
http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm
* PureMVC
http://puremvc.org/
* WeeMVC
轻型 AS MVC 框架,适合中小型项目以及新手迅速掌握。
http://weemvc.org/
* Mate
http://mate.asfusion.com/
* Gaia
http://www.gaiaflashframework.com/
* Slide
http://code.google.com/p/flex-slide/
* Guasax
http://www.guasax.com/
* VEGAS
http://code.google.com/p/vegas/
* Parsley
http://www.spicefactory.org/parsley/
* LowRa – pixlib的AS3版本
http://code.google.com/p/lowra/
* CASA Lib
http://casalib.org/
其他
* facebook-actionscript-api – FaceBook API的AS3版本,国内用FB的不多吧
http://code.google.com/p/facebook-actionscript-api/
* as3facebooklib – 又一个FaceBook API
http://code.google.com/p/as3facebooklib/
* Yahoo Maps API
http://developer.yahoo.com/flash/maps/
* corelib – 包含一些重要的基础工具,是对AS3的补充 (JPEG编码, MD5哈希, JSON).
http://code.google.com/p/as3corelib/
* as3flexunitlib – 单元测试.
http://opensource.adobe.com/wiki/display/flexunit/
* as3flickrlib – Flickr API的AS3版本
http://code.google.com/p/as3flickrlib/
* as3mapprlib – Flickr的地图图片服务:Mappr的AS3版本API
http://code.google.com/p/as3mapprlib/
* as3syndicationlib – 不论订阅的格式是ATOM还是RSS,它都可以帮你屏蔽格式的区别
http://code.google.com/p/as3syndicationlib/
* as3youtubelib – YouTube API的AS3版本
http://code.google.com/p/as3youtubelib/
* as3ebaylib – eBay API的AS3版本
http://code.google.com/p/as3ebaylib/
* as3awss3lib – 与Amazon亚马逊进行交互
http://code.google.com/p/as3awss3lib/
* as3soundeditorlib – 声音播放控制,频谱显示
http://code.google.com/p/as3soundeditorlib/
* as3ds – 游戏开发者常用的各种数据结构这里应有尽有
http://code.google.com/p/as3ds/
* as3notificationlib – AIR的一套notification开发框架,与Event说再见
http://code.google.com/p/as3notificationlib/
* as3preferenceslib – 用于保存和管理用户偏好设置的AIR library
http://code.google.com/p/as3preferenceslib/
* as3nativealertlib – AIR的警告提示窗口
http://code.google.com/p/as3nativealertlib/
* ASCOLLADA – 读取Collada文件格式
http://code.google.com/p/ascollada/
* FZip – 载入,更改并创建标准ZIP文件
http://codeazur.com.br/lab/fzip/
* Modest Maps – TILE(地砖)引擎
http://www.modestmaps.com/
* as3cards – 纸牌游戏引擎
http://code.google.com/p/as3cards/
* AsWing – GUI框架,让开发者更为便捷的定制界面。这个在国内很著名
http://www.aswing.org/
* as3httpclient – 扩展了AS3自带的 HTTP/HTTPS APIs
http://code.google.com/p/as3httpclient/
* DistortionTweener – 让图片具备扭曲(Distortion)变形的功能
http://evolve.reintroducing.com/ … -distortiontweener/
* ascanvas – HTML Canvas以及fl.display.Graphics的替代品,与先定义笔刷再绘制路径不同,ascanvas先绘制路径,然后进行填充
http://code.google.com/p/ascanvas/
* FFilmation – 斜上方45度2D引擎
http://www.ffilmation.org/website/
* Google Maps API
http://code.google.com/apis/maps/documentation/flash/intro.html
* AS3 Parametric Curve Library – 曲线,曲线,曲线!
http://www.algorithmist.net/as3pc.html
* as3webservice – Webservice提供了多种常用的网络信息服务,比如天气,货币汇率等,这是它的API
http://code.google.com/p/as3webservice/
* ASAP Library – 开发易于维护的,多SWF文件驱动的交互应用
http://asaplibrary.org/
* WordPress XML-RPC API – 让AS3与Wordpress之间的通信更容易
http://blog.absentdesign.com/?page_id=22
* FLARToolkit – 最近声名大噪的ARToolkit AS3 API
http://www.libspark.org/wiki/saqoosha/FLARToolKit/en

flash与中文输入法冲突,div遮挡flash问题

现象描述:

默认状态下swf被置于所有的html元素顶层(渲染级别的。类似在所有html元素的总父容器上一层),无法被任何html元素遮挡。

无论怎么设置flash容器和层的深度(z-index)也无济于事。

解决方案:
现有的解决方案是在插入flash的embed或object标签中加入“wmode”属性并设置为wmode=“transparent”或”opaque”

附womde参数详解:

window 模式

默认情况下的显示模式,在这种模式下flash player有自己的窗口句柄,这就意味着flash影片是存在于Windows中的一个显示实例,并且是在浏览器核心显示窗口之上的,所以flash只是貌似显示在浏览器中,但这也是flash最快最有效率的渲染模式。由于他是独立于浏览器的HTML渲染表面,这就导致默认显示方式下flash总是会遮住位置与他重合的所有DHTML层。

但是大多数苹果电脑浏览器会允许DHTML层显示在flash之上,但当flash影片播放时会出现比较诡异的现象,比如DHTML层像被flash刮掉一块一样显示异常。

Opaque 模式

这是一种无窗口模式,在这种情况下flash player没有自己的窗口句柄,这就需要浏览器需要告诉flash player在浏览器的渲染表面绘制的时间和位置。这时flash影片就不会在高于浏览器HTML渲染表面而是与其他元素一样在同一个页面上,因此你就可以使用z-index值来控制DHTML元素是遮盖flash或者被遮盖。

Transparent 模式

透明模式,在这种模式下flash player会将stage的背景色alpha值将为0并且只会绘制stage上真实可见的对象,同样你也可以使用z-index来控制flash影片的深度值,但是与Opaque模式不同的是这样做会降低flash影片的回放效果,而且在9.0.115之前的flash player版本设置wmode=”opaque”或”transparent”会导致全屏模式失效。

=========================================================================================================

现象描述

在ff浏览器里,部分用户输入法无法使用。

解决方案:
现有的解决方案是在插入flash的embed或object标签中加入“wmode”属性并设置为wmode=“window”

当这两种情况碰到一起的时候,无解。只能看实际情况选其一解决。lf繁体版本的解决方法是,wmode=”window”,放弃遮挡,在需要

显示遮挡的场合。用js控制swf的显隐,注意:不能用style.display=”none” 而要用style.width=0来控制,前者会引起swf重加载,非常奇怪,具体情况未知,可能是swf自身机制问题。

Android第一个程序HelloWorld

折腾了一晚上,终于装好Android开发软件,貌似sdk还有些没装好,但是还是跑起来了

测试了下

不过虚拟机在我笔记本上跑有点小卡,囧~

环境配置和安装方法:

http://blog.csdn.net/hgplan/archive/2010/08/17/5819503.aspx

对象池

对象池的工作原理:
对象池的工作原理的核心有两点:使用和缓存,即对于那些被频繁使用的对象,在使用完后,不立即将它们释放,而是将它们缓存起来,以供后续的应用程序反复使用,从而减少创建对象和释放对象的次数,进而改善应用程序的性能。

优点:能快速取出对象节省了new对象所产生的cpu,时间的消耗。能很好的控制内存的占用,使用时从对象池取出,使用完毕放回。中间不涉及到对象销毁创建,所以内存占用是定量的。同时假如对象池提前

缺点:对象池同样消耗new同样对象所消耗的时间,对象池从创建到结束消耗定量的内存。对象池只适合大量的对象需要被反复创建使用销毁创建使用销毁的情况。非提前初始化式内存池,缓存as值类型的对象如:point反而产生更大的消耗。

要实现一个对象池,一般会涉及到以下的几个类:

目标对象(someobject)类
该类就是程序中频繁使用的对象。

对象池(objectpool)类
该类主要用于管理对象的借出和归还,并通知对象池完成相应的工作。它至少包含两个方法:
  borrowobject():用于从池中借出对象;
  returnobject():将对象归还到池中;

package wingox.pool {
    import flash.utils.dictionary;

    /**
     * @version 20100315
     * @author brightli
     */
    public class objectpool {

        private static var _pool : dictionary = new dictionary(true);

        private var _template : class;

        private var _list : array;

        public function objectpool(value : class) {
            _template = value;
            _list = new array();
        }

        public function borrowobject() : object {
            if(_list.length > 0) {
                return _list.shift();
            }
            return new _template();
        }

        public function returnobject(value : object) : void {
            _list.push(value);
        }

        public static function getpool(value : class) : objectpool {
            if(!_pool[value]) {
                _pool[value] = new objectpool(value);
            }
            return _pool[value];
        }
    }
}

AS3效率优化:使用Vector数据类型

自FlashPlayer10伴随着FlashCS4发布时,AS3中就多了一种新的数据类型:Vector
这里先给不大熟悉Vector的同学们做一下简介(节选并改编自官方文档):

Vector是一种特殊的数组
首先,Vector的定义和C语言中“数组”更为接近,即数组的每一个元素都有相同的数据类型。(这就意味着对Vector中元素的访问要经过类型检查)
其次,Vector是一种密集数组,即每一个索引中必须包含一个值。(可以是null)
最后,Vector可以随时指定为固定长度的数组。

由于这些特殊性,Vector便拥有以下几点优势:
性能:使用 Vector 实例时的组元素的访问和迭代速度比使用 Array 时的要快很多。
类型安全性:在严格模式下,编译器可以识别数据类型错误。(但当使用 push() 方法或 unshift() 方法向 Vector 添加值时,编译器不会检查参数的数据类型,而是在运行时检查)
可靠性:相对于 Array,运行时范围检查(或定长检查)极大地提高了可靠性。

今天我们主要关注的是使用Vector数据类型来优化程序效率。
对于追求效率的RIA应用,使用Vector来提升效率是一种简单却行之有效的办法,
然而很多开发者对Vector的了解不够深入,以致未能充分发挥Vector在速度的优势。
接下来我们便来剖析一下Vector的最佳使用方法。

注:下文中所有代码的运行环境:FlashPlayer 10.1 & Mac OS X 10.6.4,所有耗时均经过多次统计平均并取整。一、Vector数组的长度应当固定
Vector类型在AVM中的实现使用的是定长数组,虽然在AS3中其fixed属性默认为false,但仍不建议对Vector数组进行能够更改长度的操作。
请看以下测试:?

var a:Vector.=new Vector.(1000000);
var b:Vector.=new Vector.(10000000);
var t:Number=getTimer();
for(var k:uint=0;k<9;k+=1){
a.concat(new Vector.(1000000));
}
for(var i:uint=0;i<10000000;i+=1){
a[i]=i;
i=a[i];
}
trace(getTimer()-t);
//////////////////////////////////
t=getTimer();
for(var j:uint=0;j<10000000;j+=1){
b[j]=j;
j=b[j];
}
trace(getTimer()-t);

同样是对长度为1千万的数组进行操作,前者的耗时在850ms,后者则保持在350ms。
如果将上述代码中的Vector a使用1千万次push操作来达到1千万的长度,则耗时变为1800ms。
(事实上,用上述代码对Array进行测试,有同样的耗时比率,所以无论使用哪种数组,都不建议频繁改变其长度)
至于splice操作的耗时,请参见gskinner的Quick As A Flash: Optimization Strategies for AS3 and Flash可以看到,Vector的splice操作要比Array慢出10倍。二、正向/逆向遍历的速度无差异
对于Array类型,正向/逆向遍历其元素的速度大约是3:2,即逆向遍历要慢一些,比如以下代码:?

var a:Array=new Array(10000000);
var b:Array=new Array(10000000);
var t:Number=getTimer();
for(var i:uint=0;i<10000000;i+=1){ a[i]=i; i=a[i]; } trace(getTimer()-t); ////////////////////////////////// t=getTimer(); for(var j:uint=9999999;j>0;j-=1){
b[j]=j;
j=b[j];
}
trace(getTimer()-t);

前者的耗时约是1000ms,后者则是1500ms。
而对于Vector,这种正向/逆向间的速度差异不存在。(有兴趣可以自行修改上面代码进行测试,此处作为结论给出)三、使用Vector储存基元类型的数据时,才能充分发挥Vector的效率优势
AS3内的数据类型分为基元类型和引用类型两种,对于这两种不同类型的数据,使用Vector的效率也是不同的。(需要指出的是,这两种类型在AS3中本质都是引用类型,只不过前者是不变对象,后者是可变对象)
首先是储存基元类型数据时,Vector与Array的读写效率对比:?

var a:Vector.=new Vector.(10000000);
var b:Array=new Array(10000000);
var t:Number=getTimer();
for(var i:uint=0;i<10000000;i+=1){
a[i]=i;
i=a[i];
}
trace(getTimer()-t);
//////////////////////////////////
t=getTimer();
for(var j:uint=0;j<10000000;j+=1){
b[j]=j;
j=b[j];
}
trace(getTimer()-t);

使用Vector耗时在400ms左右,而使用Array则是1200ms。
可见在使用基元类型时,Vector的访问速度相比Array有三倍(以上)的优势。
接下来看看储存引用类型数据时的效率对比:
二者的耗时基本一样,经过多次平均,Array耗时要比Vector多3%~8%,速度上仍然不及Vector,如非对效率要求极高,基本可以忽略。
最后对使用String类型的情况进行了单独测试,与引用类型下的表现结果一致。
四、注意索引的数据类型
很多开发者会忽略一个细节,那就是在AS3中“看起来是整数的”不一定就是整数类型。
请看以下的代码段:

var a:Vector.=new Vector.(10000000);
var t:Number=getTimer();
for(var i:uint=0;i<10000000;i+=1){
a[i*2/2]=i;
i=a[i*2/2];
}
trace(getTimer()-t);
//////////////////////////////////
t=getTimer();
for(var j:uint=0;j<10000000;j+=1){
a[uint(j*2/2)]=j;
j=a[uint(j*2/2)];
}
trace(getTimer()-t);
//////////////////////////////////
t=getTimer();
for(var k:uint=0;k<10000000;k+=1){ a[(k*2/2)>>0]=k;
k=a[(k*2/2)>>0];
}
trace(getTimer()-t);
//////////////////////////////////
t=getTimer();
var n:uint;
for(var q:uint=0;q<10000000;q+=1){
n=(q*2/2);
a[n]=q;
q=a[n];
}
trace(getTimer()-t);

四种方式的耗时分别是1100ms,750ms,650ms,550ms,当然,最后一种由于只计算了一次,不具可比性。(如果同样计算两次,则是750ms)
这里测试用的是乘法和除法,另经测试,+1/-1的结果也是一样。
所以这里特地提一下,如果一定要把算式直接写在索引的位置,要使用位运算将其转化为整数。
关于AS3效率优化中Vector的使用,目前我能想到的就是这四点。(不排除以后想起来了再更新)
希望能对各位有所帮助。

游戏中的碰撞检测

游戏中的碰撞检测方式有很多,不同的算法之间主要是在精度和速度之间权衡。以下几种方式按照速度排序说明。以2D为例,3D不过是增加了一维罢了,算法理解上没太大区别。

一、地图格子划分检测

最简单的一种检测,就是把地图(或者称为场景,总之是指碰撞发生的范围)划成一个个格子,类似仙剑奇侠传这样。假设地图有800*600px,20*20个像素为一格。那么可以划为40*30个格子。地图中参与检测的对象都存储着自身所在的格子坐标,判断碰撞就显而易见了,例如可以认为两个物体在相邻格判为碰撞,或者两个物体在同一格。采用这种方式有个要求,就是地图中所有可能参与碰撞的物体都要是20*20像素左右大小或者是其整数倍,例如房子占了3*3个格子,诸如此类。如果不遵守这个规则,有的物体只占了格子的一半,那么在玩家眼里这种检测就显得非常的粗糙。这种检测就像是把地图的像素点放大几十倍一样,与逐像素检测相比,效率提高了几十倍甚至上百倍。这种方式可运用于对检测要求不严格的游戏,例如踩地雷的RPG、推箱子之类的智力游戏。

二、矩形检测

当地图中的物体不能严格按照某个块大小的整数倍来绘制时,那么就需要另想其他的方法。这种方法适用于地图中的物体近似为矩形或者虽然不是矩形,但是碰撞精度要求不高的情况下。每个物体记录一个能够将自己框住的最小矩形的左上角坐标和矩形长宽。碰撞退化为判断矩形与矩形之间是否重叠,而这仅需要4次比较即可得出,速度很快。但为了判断整个场景中的物体,必须取第一个物体,迭代其他所有物体进行判断,再取第二个物体,迭代除第一第二个物体外的所有物体进行判断,以此类推。总计要进行(n-1)!次矩形判断才能准确得出场景中所有的碰撞可能。

三、圆形检测

与上一种方法类似,区别在于用一个能够包含物体的最小圆代替了矩形。主要是考虑到游戏中的物体外形以平滑为主,例如人物角色。而判断两个圆是否碰撞的计算也很简单,就是判断两个圆心之间的距离是否小于两个圆的半径之和。虽然球形检测在某些情况下提高了精度,但却损失了速度,因为点距离的计算需要用到平方和开方。具体相比慢多少我就不太清楚了。另外,为了计算整个地图的所有碰撞可能,也要进行(n-1)!次比较。

四、像素检测

精确到像素级,已经不能比这更精确了,相对的,效率也是最低的。怎样判断两个物体是否碰撞呢?在过去png格式图片还不盛行的时候,游戏中用到的图片中的透明部分是指定用某种颜色来表示的,例如洋红色。就像电影中的绿幕蓝幕,通过处理把这些颜色的像素点当做透明点处理,而为了判断检测,需要准备一张原图像的黑白图,黑色区域表示透明,这张图片中的每个像素值为0或者1,判断检测的时候取两张图片的黑白图,进行与运算,结果为1(有白点重叠),则判为碰撞。但是现在有了PNG和XNA,逐像素检测就相对简单一些。首先仍然需要有一个矩形框包围物体,通过矩形检测得到重叠的矩形区域可以大大减少检测的像素点数量。然后在这个区域内,取两个图片的点逐行逐列迭代,如果遇到某个点两张图片均有颜色存在,即判为碰撞。同理,进行(n-1)!次比较后得到全地图的碰撞可能。

五、四叉树检测

准确的说这事在第三四五种方法的基础上的优化策略,或者说是第一种方法同后三种方法的组合应用。主要是针对那最后的(n-1)!次比较。方法是,像第一种方法一样将地图分为格子,格子的大小应该能够容纳10个左右的地图中最大物体,例如一个800*600的地图可能就划为9个区。同样的,每个物体要记录自己所在的区坐标以及矩形包围盒。如果该物体完全位于该区内,则只要将其与该区内的其他物体判断碰撞。如果该物体虽然位于某个区,但是小部分位于隔壁区,则额外的需要迭代隔壁区的物体,这点效率损失是可以容忍的,相比于迭代全地图的物体。

有个问题,我怎么知道哪些物体是跟该物体位于同一个区呢?那不是还是要迭代一遍所有物体?这时候就是题目发挥的地方的,之所以称为四叉树检测(当然,这名字是我自己取的),就是因为那些区块是以四叉树的方式链接的,即得到一个区块的对象,就可以直接得到其上下左右相邻的区块的对象,而物体可以是存储在所在区的一个列表中。这样就不用遍历所有物体也可以直接取出隔壁区的物体了。当地图很大的时候,四叉树的优势体现得很好。

六、3D中的碰撞检测

以上是我所掌握碰撞方法,可能还有更多吧。那么3D中的检测其实是2D的延伸,例如矩形检测变为立方体检测,圆形检测引申为球形检测,四叉树检测进化为八叉树检测。

当然了,凡是有例外。逐像素检测方法在3D中没有相对应的方法,因为3D中的物体的表示最小单元是三角型而非点。其实也可以说逐三角片检测是逐像素检测的3D版,但毕竟是平面碰撞的检测,需要一定的计算公式,而不是与或一下就OK的。这里就不赘述了。

总结

我的表达能力不是很OK,另外手打得也有些酸。

选择哪种方法,要根据你的游戏需要,例如推箱子游戏,显然只要格子碰撞检测就足够了。而一些以球作为主要物体的游戏例如射击游戏则可以考虑圆形碰撞。

同样的,在有些碰撞精度要求很高的游戏中,还要对这些方法进行一定的变化,例如格斗游戏,作为判断的单元不是整个人而是四肢、身体等部位,需要更多的包围盒来表示一个物体。

原文地址:http://darkey2s.blog.163.com/blog/static/739930262010115105333989/

[转]一个AS3 socket解码设计的错误思路

作者:闪刀浪子 http://www.iflashigame.com http://hi.baidu.com/mr_ziqiang
转载请保留以上信息。

调试游戏确实是一项磨人的工作。难怪很多业内人都喜欢说“好游戏是改出来的”。奇都(game.qdooo.com)基础平台目前还在测试,陆陆续续收到了很多朋友的反馈(想参与测试的朋友欢迎联系我索取激活码)。所以这段时间的主要工作是在做美化和优化,新的竞技系统也在紧锣密鼓的准备中。

这里主要想说一下socket解码在设计时忽略的一个问题。(感谢Lite3的反馈)。

对于客户端的Socket的数据基本读取方式一般来说可以分为三种:

1、按照数据流的结尾标记截取
2、按照包头记录的包长度截取
3、按照包长度截取并验证结尾标记。

第一种方式:如图,通常做发是每个包结尾发送一个\0标记,表示这个数据包发送完了。socket每次读取1个字节直到遇到结尾符,结束读取将数据包传递到逻辑层。这种方式在xmlSocket时就已经用了很多了。

第二种方式:如图包头用一个整型记录完整包的长度。每次都先读取一个包长度,然后按照包长度读取指定长度的数据作为一个完整数据包传递到到逻辑层。

第三种方式:如图。这种方式把以上两种方式做了结合,读取的时候无需一个一个字节读,直接读取指定长度。结尾符可以用来做校验判定,同时可以作为包长度字节的读取依据。(如果上一个包有问题可以丢弃之后,以结尾符为标记读取下一个包的包长度。)

介绍了一点基本原理,下面说一下这个设计缺陷。

问题:

通讯中我们使用的是第二种方式——包长读取。在通讯类中创建一个临时存储变量_dataArray,提供一个getData():*公用方法,供外部取出数据。每次读完一个完整包后压入_dataArray,同时触发”recievedData”事件。代码如下:

private function socketDataHandler(event:ProgressEvent):void
{
//_readFlag:int;//0表示全部读完了,1表示长度读取完毕 2表示正在读取数据
while (bytesAvailable)
{
if (_readFlag == 0&&bytesAvailable>=4)
{
_length = Number(readInt());
_readFlag=1
}
if (_readFlag == 1 && bytesAvailable >= _length)
{
var temp:Object = readObject();
_dataArray.push(temp);
dispatchEvent(new Event(“recievedData”));//
_length = 0;
_readFlag = 0;
}
}
}

以上代码从结构上看是没有任何问题的,而且在测试前期我们也一直用着没有任何问题。逻辑相当清楚:接收到socket的事件后首先读取一个包长,然后按照包长读取数据。读取完毕发出事件。。。

那么,问题终于来了——网友Lite3出现了。^ _ ^

Lite3发来了一个出错提示:
Error: Error #1502: 脚本的执行时间已经超过了 15 秒的默认超时设置。
at qdooo.net::mySocket/socketDataHandler()

相信大家一看就能知道问题出在了哪里——问题就在while上。

while的循环等待时间因为某种原因超过了15秒。这里所指的某种原因就是网速,那天Lite3那边的网速非常慢。这样一来放大了设计中一处缺陷所照成的影响——必须等到可读数据的长度等于或者大于包长度的时候才开始读取,也就是下面这句:

if (_readFlag == 1 && bytesAvailable >= _length)

正是由于这个判断做了限定,如果数据长度不够,那么他会在while中一直循环等待。直到超过15秒报错。

解决:

分析好了原因那么就很好解决了,想办法读空流里面的数据让while跳出等待就行了。

Adobe Flash Catalyst CS5全新交互式设计工具

Adobe Flash Catalyst CS5 软件是一款触手可得的全新交互式设计工具。无需编写任何代码,即可将 Adobe Photoshop、Illustrator 和 Fireworks 图稿变换为具有表现力的交互式项目,并充分利用 Adobe Flash Platform 的范围和一致性。
2010年4月12日北京时间23时,Adobe Creative Suite 5设计套装软件正式发布。Adobe CS5总共有15个独立程序和相关技术,这些软件通过五种不同的组合构成了五个不同的组合版本,分别是大师典藏版、设计高级版、设计标准版、网络高级版、产品高级版。
Flash Catalyst之前的开发代号为Thermo。这是一个为FLEX设计师准备的软件,通过Catalyst,设计师与程序员可以更好的搭配之间的工作。 它可以让你通过简单的拖拽就可以完成界面设计,然后可以生成具体的Flex代码,就不需要程序员在Flex中单独布局样式,Catalyst可以跳跃启动任意Flex项目。 Adobe平台业务部门总经理David Wadhwani表示,Catalyst旨在为开发人员和设计人员建立起沟通的桥梁,程序开发人员可以导入设计师在Photoshop、IIIustrator和Fireworks中设计的用户界面,并将它们转化成UI组件而不改变它们原先的“皮肤”、外观和整体风格。设计师仍然用Adobe的各种产品来完成自己的大部分工作,但是能通过Catalyst来定义UI组件了,就像开发人员通过编程来完成这一工作一样。它给开发人员和设计人员提供了一种交流协作的平台,而不用通过电子邮件或是一起坐在电脑前探讨。 Adobe CS5 的 Flash Catalyst 则是为了挑战微软的 Expression Studio,这款新的软件将作为Flash的另一个选择,是专门为设计师和美工量身定做,用户无需编写代码即可创建具有表现力的界面和交互式内容,可将 Adobe Photoshop、Illustrator 和Fireworks 图稿变换为具有表现力的交互式项目,并充分利用 Adobe Flash Platform 的范围和一致性,可以说设计结果触手可得
Flash Catalyst 就像是设计人员与开发人员之间的一座桥梁,它可以让设计者在熟悉的应用程序环境下工作,如Photoshop 、Illustrator,同时能够在后台自动生成开发人员所需要的代码。
Flash Catalyst的工作流程着重强调工具的直觉本质(intuitive nature),在短时间内获得成果。

ppzhu's blog 使用的缓存程序为 WP Super Cache