·建站首页 ·钻石 ·繁體
您的位置: 中国建站之家 -> 工具应用 -> Flash -> 追踪效果实现方法1

追踪效果实现方法1

作者:未知  来源:转载  发布时间:2005-8-18 21:02:14  发布人:acx

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;

}


}

将本文收藏到QQ书签与更多好友分享

上一篇:仨个小球一动画

下一篇:飞机游戏(彩京类型《飞天站记》)