问题与此脚本和动作脚本2.0
问题描述:
首先,我不是新来的动作(AS2.0)我也不是一个有经验的程序员在这种语言,我几乎没有使用它的任何面向对象的功能(坦率地说,我甚至从未写过一堂课)。无论如何,这是我的代码问题与此脚本和动作脚本2.0
var instName;
var num=0;
setInterval(createSym,100);
function createSym(){
instName="sym"+num++;
this.attachMovie("sym",instName,this.getNextHighestDepth());
eval(instName)._x=100;
eval(instName)._y=100;
var t1=setInterval(moveSym,8,instName);
function moveSym(instName){
eval(instName)._x+=1;
}
var t2=setInterval(checkSym,1,instName);
function checkSym(instName){
if(eval(instName)._x>=600){
clearInterval(t1);
clearInterval(t2);
eval(instName).removeMovieClip();
}
}
}
起初我还以为我有某种与嵌套函数范围的问题,但我不小心使用了相同的逻辑在另一个程序和它完美的作品(我还希望一些有助于理解运行时内存如何在像这样的语言中管理)。但后来我意识到,如果我在this.attachMovie改变这到_root或者如果我改变调用技术(不改变这到_root)到
setInterval(mycaller,100);
function caller(){
createSym();
}
我这个代码工作无法弄清楚这两种方式如何不同。感谢您的任何帮助:)
答
作用域在set2中改变了AS2。只需确保在回调中执行trace(this)
,并且您会发现它不是_root,如预期的那样,但您可以将容器movieclip作为额外参数传递给回调函数,以便您可以添加库项目。
此外,代码看起来复杂,没有理由:
var instName;//keep track of the new instance for each clip
var num=0;//number of symbols
setInterval(createSym,100);//create a symbol every 100 milliseconds
function createSym(){
instName="sym"+num++;//update instance name
this.attachMovie("sym",instName,this.getNextHighestDepth());//attach a new clip
eval(instName)._x=100;//set initial position
eval(instName)._y=100;
var t1=setInterval(moveSym,8,instName);//add another interval to move the symbol
function moveSym(instName){
eval(instName)._x+=1;
}
var t2=setInterval(checkSym,1,instName);//and another inverval to check if the clip is 'outside' limits, clear intervals and remove clip
function checkSym(instName){
if(eval(instName)._x>=600){
clearInterval(t1);
clearInterval(t2);
eval(instName).removeMovieClip();
}
}
}
每个人都有一个编码风格,所以没有一个正确/错误在这一点上,只要它的工作。以下是我改写了它,所以它会为我做的意义:
var clips:Array = [];
var currentClips:Number = 0;
var totalClips:Number = 100;
setInterval(update,40,this);//interval is at 40 ms ~ 25 fps, also pass a target movie clip to attache library items into
function update(targetClip:MovieClip) {
if(currentClips < totalClips){//still need clips ?
var clip:MovieClip = targetClip.attachMovie('sym','sym'+currentClips,targetClip.getNextHighestDepth());//add a clip
clip._x = 100;//initialize position
clip._y = Math.random() * 100;
clips.push(clip);//update array and clips counter
currentClips++;
}
//update existing clips
for(var i:Number = 0 ; i < currentClips; i++) {
clips[i]._x+=10;
if(clips[i]._x > Stage.width) {//if a clips is outsite, remove it, update the array and counter, and another should be created instead
clips[i].removeClip();
clips.splice(i,1);
currentClips--;
}
}
}
注意剪辑被删除,每次添加他们退出舞台,这可能需要一些资源,如果我们简单地重复使用,可以被保存同样的符号通过重新定位它:
var clips:Array = [];
var currentClips:Number = 0;
var totalClips:Number = 100;
setInterval(update,40,this);//interval is at 40 ms ~ 25 fps, also pass a target movie clip to attache library items into
function update(targetClip:MovieClip) {
if(currentClips < totalClips){//still need clips ?
var clip:MovieClip = targetClip.attachMovie('sym','sym'+currentClips,targetClip.getNextHighestDepth());//add a clip
clip._y = Math.random() * 100;//initialize position
clips.push(clip);//update array and clips counter
currentClips++;
}
//update existing clips
for(var i:Number = 0 ; i < currentClips; i++) {
clips[i]._x+=10;
if(clips[i]._x > Stage.width) clips[i]._x = 0;//reuse same clips, simply update position
}
}
而且,我发现它看起来并不很好玩的是,所以我增加了对速度(_vx)的变量,因为影片剪辑是一个动态类,你可以添加运行时的属性。请注意,这不是一个好的做法。我们的目标是变得有点深度的方式剪辑动画:深度
var clips:Array = [];
var currentClips:Number = 0;
var totalClips:Number = 100;
setInterval(update,40,this);//interval is at 40 ms ~ 25 fps, also pass a target movie clip to attache library items into
function update(targetClip:MovieClip) {
if(currentClips < totalClips){//still need clips ?
var clip:MovieClip = targetClip.attachMovie('sym','sym'+currentClips,targetClip.getNextHighestDepth());//add a clip
clip._y = Math.random() * 100;//initialize position
clip._vx = 5 + Math.random() * 5;//clips have different velocities - give a bit of depth
clips.push(clip);//update array and clips counter
currentClips++;
}
//update existing clips
for(var i:Number = 0 ; i < currentClips; i++) {
clips[i]._x += clips[i]._vx;
if(clips[i]._x > Stage.width) clips[i]._x = 0;//reuse same clips, simply update position
}
}
来讲,剪辑是不是深度排序,但我岔开... 关于你问题_root和范围,与setInterval的问题,因为范围更改,但您可以使用回调参数来解决问题。
非常感谢你的所有建议:)我必须承认我的风格很差。但有一件事仍然无法解释(或者可能是我没有弄清楚) - 如何调用一个不同的函数(mycaller),然后调用我想调用的函数(createSym)来重置范围? – toofast1227 2011-03-24 16:28:16
@backslash这不是你,这是“他们”:P我不是100%肯定AVM1(ActionScript虚拟机中运行AS2字节码)如何处理setInterval的内部,但它足以知道,通过setInterval的调用函数内部范围的变化。例如:trace(this); var interval:Number = setInterval(update,100); function update(){ \t trace(this); \t clearInterval(interval); } – 2011-03-24 17:35:03
此外,我的checkSym函数更像是一个碰撞检测器,用于检查此处创建的影片剪辑与另一个由用户控制其运动的影片剪辑之间的碰撞。这就是为什么我需要第二个计时器 - 或者用户在位置更新后仍然可以击中其他剪辑。 (我知道我原来的帖子没有指定这个)。我想就如何以更好的方式实施它提出一些建议。 – toofast1227 2011-03-24 17:40:06