2013-02-19 4 views
1

Я действительно удивляюсь. Я сделал класс MovieClip Apple, я написал функцию, которая создает новый экземпляр с именем «яблоко». Каждый раз, когда новый экземпляр помещается в «Яблоки» массива. Я вызываю функцию 5 раз, и я получаю 5 яблок. Я могу манипулировать ими, называя их, то есть яблоки [0]. И когда я прослеживаю свой массив, я вижу вещи 5 [object Apple]. Так что, может быть, я действительно не понимаю структуру объектов AS3, но не должен каждый объект иметь имя?имена экземпляров класса AS3

Когда я устанавливаю apple.name и получаю массив с 5 различными именами, я не могу манипулировать объектами по именам, например apple1.x = 10. Как компьютер знает, какое яблоко есть где, если у каждого есть собственные координаты? Это единственный способ назвать их: яблоки [0] -пары [4]? И если я создам код, который должен быть таким же для всех яблок, как мне обратиться к функции, к «этому»? Причина, когда я пишу код класса, пока у меня пока еще нет имен ...

Например, если я хочу сделать Apple class picture (MovieClip), который можно перетащить, создайте любое количество яблок, до миллион, я не могу добавить яблоки [0] .addEventListener, apples [1] .addEventListener ... apples [1000000] .addEventListener к коду. Как сделать его глобальным?

Я спрашиваю причину, когда я непосредственно кодирую конкретный экземпляр, он имеет имя, и я точно знаю, что я адресую. И работая с классом и создавая множество объектов, я вроде бы не ... Извините, я зеленый

ответ

4

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

Вы можете сделать что-то вроде этого:

var apples:Array = new Array(); 

for (var i:int = 0; i < 100; i++) 
{ 
    var apple:Apple = new Apple(); 
    apples.push(apple); 
    apple.x = Math.random() * 500; 
    apple.y = Math.random() * 500; 
    addChild(apple); 
    apple.addEventListener(MouseEvent.CLICK, onAppleClick); 

} 

function onAppleClick(e:MouseEvent):void 
{ 
    var ind:int = apples.indexOf(e.currentTarget); 
    var apple:Apple = apples[ind]; 
    trace(ind); 
    apples[ind].visible = false; 
    //or 
    //apple.visible = false; 
} 
+1

Я думаю, что это хороший пример, чтобы получить ОП прокатки[email protected], свойство «name» всех экземпляров DisplayObject, не совпадает с именем переменной в вашем скрипте перед компиляцией. В вашем примере хранения объектов в массиве AS3 знает, где находятся объекты и поддерживает ссылку на них через ваш массив. Скажем, массив находится по адресу 0, а каждый объект - 20 байтов, объект один - в 0, второй объект - по адресу 20, третий - по адресу 40 (обычно этот вопрос обсуждается с C, но теория по-прежнему применяется к AS3) , Здесь показаны способы получения var. – shaunhusain

+2

Также следует отметить, что если вы пишете метод внутри класса (скажем, вы пишете метод в классе Apple), тогда «это» означает текущий экземпляр, поэтому вместо написания кучки кода «снаружи» экземпляров, которые действуют на них вы можете инкапсулировать этот код в методы в определении класса. – shaunhusain

+0

Очень приятно и просто, спасибо! Я попробую и скажу вам, если это сработает. Кроме того, это своего рода способ получить конкретное яблоко из рой? Если я хочу щелкнуть один из них и вместо видимого применить функцию marryMe и изменить ringPutOn = true, а также изменить цвет на розовый и остановить его от того, что делают другие яблоки, это будет особенным, это нормально? (что такое perv XD) Это не изменит весь класс? Или вы скорее рекомендуете создать новый класс, который будет представлять жену-яблоко, и изменить его на новый? – SherWood

3

Та же проблема, да? :)

Например, Apple extends Sprite и наследует имущество name.

Это общедоступное, это означает, что вы можете изменить его название.

var apple:Apple = new Apple() ; 
apple.name = "MegaApple" ; 

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

stage.addChild(apple) ; 

прибудет яблоко обратно:

var oldApple:Apple = stage.getChildByName("MegaApple") ; 

Но что никогда означает, что вы можете использовать яблоко так: MegaApple.move() - потому что название яблока должно быть свойством яблока, а не имя переменной.

Конечно, вы можете создать много яблок вручную:

var apple1 = new Apple() ; 
var apple2 = new Apple() ; 
var apple3 = new Apple() ; 

Но если все они ведут себя точно так же, нет никакого смысла в этом. Вот почему вы храните их в массиве.

Надеюсь, вы понимаете, что я имею в виду.

+0

Хехе, извини, ты ушел и я до сих пор вопрос^_ ^» – SherWood

+0

Naa, это нормально :) – vikingmaster

Смежные вопросы