Использование экземпляров уже на сцене из другого класса - PullRequest
0 голосов
/ 23 февраля 2011

Я новичок в этом ООП, и мне трудно все это понять.

Я пытаюсь воссоздать в AS3.0 классы с простым ударом-мольигра, которую я создал в AS2.0 с использованием временной шкалы.

Я прочитал много форумов, но до сих пор не понимаю, что именно я делаю не так.

Вот мойsetup:

  1. У меня есть видеоклип с именем mrBunny (моя девушка сказала, чтобы я сменил его на кроликов, так как родинки были слишком уродливыми).Теперь на сцене есть 6 экземпляров mrBunny, каждый с именем mrBunny0-5.
  2. Символ mrBunny связан с классом com.mrBunny.
  3. В классе есть методназывается randomPlay();, который я использую для рандомизации времени анимации mrBunny.
  4. У меня также есть кнопка на сцене с классом stageBtn.

пакет com {

import flash.display.SimpleButton;
import flash.display.MovieClip;
import flash.display.Stage;
import flash.events.MouseEvent;

public class startBtn extends SimpleButton {

    //Constructor
    public function startBtn() {
        this.addEventListener(MouseEvent.CLICK, startClick);
    }

    public function startClick(event:MouseEvent):void {

      mrBunny0.randomPlay();
      mrBunny1.randomPlay();
      mrBunny2.randomPlay();
      mrBunny3.randomPlay();
      mrBunny4.randomPlay();
      mrBunny5.randomPlay();

    }
}

}

Я хочу иметь возможность использовать startBtn для запуска анимации экземпляров mrBunny #.

НасколькоЯ осознаю, что не до конца понимаю ситуацию с классами и ООП.

Ответы [ 2 ]

2 голосов
/ 23 февраля 2011

(кролики были слишком милыми, чтобы ответить на этот вопрос, так что вот так ...)

В вашем коде есть несколько проблемных областей, касающихся ООП. Я постараюсь объяснить их немного.

Имена пакетов:

Имена пакетов даны для уникальной идентификации класса. Рассмотрим ситуацию, когда вы используете стороннюю библиотеку, которая имеет класс StringUtils. У вас также есть класс StringUtils. Как вы храните их в своей рабочей папке? Как вы относитесь к каждому из них в своем коде?

Пакеты, как следует из названия, предоставляют механизм для группировки классов. Поэтому, когда вы ссылаетесь на свой класс, вы можете обратиться к нему как com.joemidi.utils.StringUtils, а другой как com.someoneelse.utils.StringUtils. Имена пакетов могут быть любыми, если они отражают структуру папок. Но в качестве отраслевого стандарта люди используют URL-адреса в именах своих пакетов, поскольку они гарантированно являются уникальными. Вот почему вы видите com во многих пакетах. В вашей ситуации лучше, если вы реструктурируете свои пакеты (и структуры папок) в соответствии с этим.

Экземпляры сцены из IDE:

Когда вы создаете экземпляры в Flash IDE, вы должны помнить, где вы их помещаете и знает ли ваш код о них или нет. Кролики, как сказал @weltraumpirat, не являются внутри вашего startBtn. Правильный способ сделать то, что вы пытаетесь сделать, это:

Main:
    + contains the bunnies.
    + listens to startButton for MouseEvent.CLICK
    + when startButton is clicked, manipulates the bunnies.

Тем не менее, мы понимаем, что есть еще одна проблема:

Не полагайтесь на имена экземпляров:

Вы должны создавать (то есть создавать новые) кролики в своем коде, а не в Flash IDE; и получить к ним доступ из центральной переменной. Например:

public class Main extends MovieClip {

    var bunnies:Array = new Array();

    public function Main() {
        createBunnies(7);
        startButton.addEventListener(MouseEvent.CLICK, onStartClicked)
    }

    protected function createBunnies(bunnyCount:int):void {
        for (var i:int = 0; i < bunnyCount; i++) {
            var bunny:Bunny = new Bunny();
            addChild(bunny);
            // configure bunny.x, bunny.y, etc. here.
            bunnies.push(bunny);
        };
    }

    protected function onStartClicked(e:MouseEvent) {
        for (var i:int = 0; i < bunnies.length; i++) {
            var bunny:Bunny = bunnies[i];
            bunnies.randomPlay();
        };
    }

Здесь вы больше не привязаны к именам экземпляров, которые вы дали кроликам. (Конечно, я просто предполагаю вашу сценическую структуру здесь.) И, таким образом, кролики более «независимы» от кода над ними. Кроме того, вы можете использовать спрайт-держатель и отследить кроликов оттуда, но это может быть немного продвинуто прямо сейчас.

Надеюсь, это может оказаться полезным для вас. Если вы серьезно относитесь к этой теме, вы можете прочитать больше об ООП, в частности о том, почему она необходима, и ключевые термины по этому вопросу: разделение, наследование, инкапсуляция и т. Д.

0 голосов
/ 23 февраля 2011

startBtn не имеет членов mrBunny0-5, основной график имеет. Попробуйте root.mrBunny0 вместо.

...