追踪效果实现方法1 |
| 作者:佚名 来源:闪吧 作者: drmingdrmer 更新:2007-1-13 20:43:06 错误报告 我要投稿 |
Chaser 类: Chaser类实现了简单的追踪效果,使用这个类,用户可以大大简化各种追踪效果的实现。
Chaser的实例具有追踪其他mc的功能,可以追踪的属性如下:
_x _y _xscale _yscale _width _height _rotation _alpha
使用方法:将一个mc连接到xp.gameLib.chase.Chaser类或其子类,并设置onChase事件处理函数,用户在onChase函数中实现追踪的具体实现。
实现效果演示:
点击浏览该文件
源文件:
点击浏览该文件 此方法不同于Target类,它将功能实现写在chaser上面,使他可以追踪任何一个mc(也可以是其他对象,但主要是针对mc作的这个dd^^)。 Target类则是将功能实现在‘目标’上,使它可以被任何1个对象所追踪。
Top Features:
l 速度比较快,如果要更快,可以删除一些不必要得追踪属性
l 易扩展,继承Chaser类后可以在calculateChase方法中添加需要的追踪属性。
l 通用性。
l 性价比高。。功能要求中等的场合。譬如追踪导弹,有趣的拖动条等。
disAdv:
l 追踪者必须是Chaser类或其子类,制约了其他的功能实现。
l 只能追踪特定的属性,不能对不同的对象选择不同的追踪属性,追踪的功能难以细分(下个dd解决这个问题,恩)
l 其他的还在想。。。 类实现:
/** * @author xp@drmingdrmer * Chaser implements chasing.<br> * By making an MC to be a Chaser instance. <br> * Chaser的实例具有追踪其他mc的功能,可以追踪的属性如下: * <code> * _x * _y * _xscale * _yscale * _width * _height * _rotation * _alpha * <code> * 使用方法:将一个mc连接到xp.gameLib.chase.Chaser类或其子类,并设置onChase事件处理函数,用户在onChase函数中实现追踪的具体实现。<br> * Chaser类仅提供了简单的即时追踪效果.<br> * 不支持指定步长的追踪,或几何速率的追踪。用户可以在子类中扩展并实现这些功能。 */ class xp.gameLib.chase.Chaser extends xp.system.MovieClipAdv{
/** * 触发器 */ static var impulser:Object;
/** * default properties list in which the property will be chase.<br> * 默认的属性列表。 */ static var defaultPropList:Object={ _x:1, _y:1, _xscale:1, _yscale:1, _width:1, _height:1, _rotation:1, _alpha:1 };
/** * properties list,use ’addProperty’,’delProperty’ to add or remove properties from chasing。 * @see addProperty * @see delProperty * 属性列表,设置那些属性可以被追踪到。当Chaser实例被实例化后,就具有了默认的属性列表。 */ var propList:Object;
/** * mc list to which this Chaser chases. * mc列表,记录那些mc被这个Chaser实例追踪了 */ private var mlist:Array;
/** * total weight value. * 总的权重。 */ var totalWeight:Number;
/** * constructor<br> * 监听impulser的callChase事件,初始化成员变量。 */
public function Chaser() { //for sub class create a ’constructor’ property. //function implemented in MovieClipAdv. this["createConstructor"](arguments);
if (impulser==undefined){ impulser=createImpulser(); } impulser.addListener(this);
propList=new Object(); for (var i in defaultPropList){ propList[i]=defaultPropList[i]; }
mlist=new Array(); totalWeight=0;
}
/** * overWritten * create a impulser. * @return impulser implemented ’xp.events.Broadcaster’ interface. * 生成一个触发器,定时调用callChase函数,默认生成的impulser每帧调用1次callChase,子类可以覆盖此函数。 */ function createImpulser():Object{ return xp.system.Broadcaster.createAutoBroadcaster("callChase",2); }
/** * add a property to chase<br> * @param n String property name * 添加一个被追踪的属性 */ function addProp(n:String){ propList[n]=1; }
/** * delete a property to chase<br> * @param n String property name * 删除一个被追踪的属性 */ function delProp(n:String){ delete propList[n]; }
/** * add another target to chase,optionally specifying a weight value for calculating chasing result.<br> * @param m MovieClip instance to chase. * @param w weight. * 添加一个被追踪的目标。 */
function addTarget(m:MovieClip,w:Number){ if (!m) return; if (w==undefined || isNaN(w)) w=1;
//push instance to queue,& remember its position. m.__chaser__id__=mlist.push({w:w,ins:m})-1; totalWeight+=w; }
/** * delete a target. * @param p could be MC reference or id. * @return Boolean * 删除一个被追踪的目标 */
function delTarget(p):Boolean{
var id:Number=undefined;
if (!isNaN(p)) id=Number(p); else id=p["__chaser__id__"];
if (id==undefined) return false;
mlist.split(id); for (var i : Number = id; i < mlist.length; i++) { mlist[i]["__chaser__id__"]=i; }
return true;
}
/** * invoked by impulser<br> * broadcast ’onChase’ event * 由impulser定时触发,计算追踪数值并调用用户定义的onChase函数。 */ function callChase(){
var eo=calculateChase();
//subclass implement onChase by get/set function !! this.onChase(eo); }
/** * abstract function<br> * overWritten by user defined function. * 由用户覆盖此函数。 * @param eo 属性集合,包含所有propList中列出的属性。 */ function onChase(eo){ }
/** * overWritten * * 计算追踪的数据,子类应该覆盖此函数以实现更多的追踪效果(例如colorTransfrom,或瞄准目标的角度和距离等)<br> * 计算追踪目标的加权平均值,保存到eo对象中并返回此对象。 * @return Object containing infomation of targets.this object will be used as ’eo’ parameter for ’onChase’ function. * */ function calculateChase():Object{
var eo:Object=new Object(); var tx=0; var ty=0;
for (var i : String in propList) { eo[i]=0; }
for (var j : Number = 0; j < mlist.length; j++) { for (var i : String in propList) { eo[i]+=mlist[j].ins[i]*mlist[j].w; } } for (var i : String in propList) { eo[i]/=totalWeight; }
//for compatibility to Target eo.ins=eo; eo.geo=eo; eo.stp=eo;
return eo;
}
}
|
|
| 文章录入:skyuu 责任编辑:skyuu |
|
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |