Почему функция конструктора для пользовательского класса вызывается несколько раз? - PullRequest
0 голосов
/ 10 марта 2012

Я создал собственный класс (.as ниже :).Он существует по всей моей основной временной шкале в трех экземплярах (panel1, panel2 и panel3) и в настоящее время имеет только один ключевой кадр.

Когда я отлаживаю свой файл, в кадре 1 функция конструктора вызывается для каждого экземпляра.Здорово.Тем не менее, чуть позже функция конструктора называется AGAIN для каждого экземпляра, стирая все сделанные мной изменения.

Все экземпляры размещаются на сцене, перетаскивая их из библиотеки.В моих сценариях нет "= новых строк Scorepanel ().

Что вызывает это и как я могу предотвратить это?

- Кен (невероятно расстроен) Франклин

{

import flash.display.MovieClip;
import fl.text.TLFTextField;

public class scoreunit extends MovieClip
{
    private var team:String = "WHOAMI";
    private var points:Number = 0;
    private var scorevalue:String;
    private var teamname:String;
    private var inited:Boolean = false;

    function scoreunit()
    {
        if (! inited)
        {
            this.teamname = team;
            this.scorevalue = String(points);
            var teamnamebox=new TLFTextField();
            teamnamebox.x = 2.25;
            teamnamebox.y = 295.25;
            teamnamebox.width = 295.25;
            teamnamebox.height = 70;
            teamnamebox.text = team;
            var scorevaluebox=new TLFTextField();
            scorevaluebox.x = 2.25;
            scorevaluebox.y = 95.80;
            scorevaluebox.width = 295;
            scorevaluebox.height = 97.5;
            scorevaluebox.text = scorevalue;
            trace("I set the starting values");
            trace("teamnamebox = ",teamnamebox.text);
            trace("scorevalue = ",scorevaluebox.text);
            inited = true;
        }
    }

    public function score():Number
    {
        return points;
    }

    public function winpoints(n:Number)
    {
        points +=  n;
        scorevalue = String(points);
        scorevaluebox.text = scorevalue;
    }

    public function losepoints(n:Number)
    {
        points -=  n;
        scorevalue = String(points);
        scorevaluebox.text = scorevalue;
    }

    public function setname(s:String)
    {
        team = s;
        teamname = team;
        teamnamebox.text = s;
        trace("I changed the name to ",teamnamebox.text);
    }

    public function buzzin()
    {
        this.gotoAndStop("buzzedin");
    }

    public function makeddselect()
    {
        this.gotoAndStop("ddtarget");
    }

    public function makeyay(y:Number)
    {
        switch (y)
        {
            case 1 :
                this.gotoAndStop("yay1");
                break;
            case 2 :
                this.gotoAndStop("yay2");
                break;
            case 3 :
                this.gotoAndStop("yay3");
                break;
            case 4 :
                this.gotoAndStop("yay4");
                break;
            case 5 :
                this.gotoAndStop("yay5");
                break;
            case 6 :
                this.gotoAndStop("yay6");
                break;
            default :
                trace("CRASH! "+y+" IS NOT A VALID YAY!");
        }
    }

    public function makeboo(b:Number)
    {
        switch (b)
        {
            case 1 :
                this.gotoAndStop("boo1");
                break;
            case 2 :
                this.gotoAndStop("boo2");
                break;
            case 3 :
                this.gotoAndStop("boo3");
                break;
            case 4 :
                this.gotoAndStop("boo4");
                break;
            case 5 :
                this.gotoAndStop("boo5");
                break;
            case 6 :
                this.gotoAndStop("boo6");
                break;
            default :
                trace("CRASH! "+b+" IS NOT A VALID BOO!");
        }
    }

    public function makescrewing()
    {
        this.gotoAndStop("evilface");
    }

    public function makescrewed()
    {
        this.gotoAndStop("screwed");
    }

    public function makesplat()
    {
        this.gotoAndStop("eekface");
    }

    public function makefreeze()
    {
        this.gotoAndStop("frozen");
    }

    public function makehome()
    {
        this.gotoAndStop("inactive");
    }

}

}

1 Ответ

0 голосов
/ 10 марта 2012

Проблема, с которой вы столкнулись, связана не с вашим кодом, а с временной шкалой. Код из вашего класса может получить доступ только к элементам текущего отображаемого фрейма и потерять доступ к другим экземплярам, ​​символам и всему, что находится за пределами текущего фрейма.

Ваша проблема в том, что флэш-память проходит каждый кадр в первый раз, выделяя при отладке, что каждый объект построен правильно, но как только он достигнет последнего кадра на временной шкале, он возвращается к самому первому кадру, снова выполняя все оттуда, как любой объект, присутствующий в кадре, снова создается.

Вы должны избегать размещения экземпляров класса на сцене вручную.

Также, но это личная практика, если вам нужно работать с фреймами и кодом, предпочитайте работать с однокадровыми клипами, а также с библиотеками значков addChild (), активами и gotoAndStop () из кода. в конце у вас будет намного больше контроля и меньше разочарований. Но в целом, если вы пишете код, по возможности избегайте использования фрейма;)

Надеюсь, это помогло!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...