Проблема с этим и рутом в Actionscript 2.0 - PullRequest
0 голосов
/ 23 марта 2011

Начнем с того, что я не новичок в ActionScript (AS2.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 в this.attachMovie на _root или если я меняю технику вызова (без изменения this до _root ) до


setInterval(mycaller,100);
function caller(){
     createSym();
}

Я не могу понять, как эти два пути отличаются друг от друга.Спасибо за любую помощь с этим:)

1 Ответ

1 голос
/ 24 марта 2011

Объем изменяется в AS2 с помощью setInterval. Просто чтобы убедиться, сделайте trace(this) внутри обратного вызова, и вы увидите, что это не _root, как ожидалось, но вы можете передать контейнерный видеоклип в качестве дополнительного аргумента функции обратного вызова, чтобы вы могли добавлять элементы библиотеки в.

Кроме того, код выглядит сложным без причины:

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), поскольку MovieClip - это динамический класс, и вы можете добавлять к нему свойства во время выполнения. Обратите внимание, что это не очень хорошая практика. Цель состояла в том, чтобы немного углубиться в анимацию роликов:

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 и scope , проблема с setInterval из-за изменения области действия, но вы можете использовать аргумент для обратного вызова, чтобы обойти проблему.

...