![]() |
|
||||||||||
|
|||||
|
Регистрация: Aug 2013
Сообщений: 10
|
Ребят, такая штука. Есть несколько классов фигур. В основном классе нужно сделать по таймеру появление на сцене в случайном порядке этих фигур. Как я понимаю, нужно создать локальную переменную и сделать так, чтобы тип её выбирался случайно. Как это сделать?
|
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Проще добавить фигуры в массив и уже его элементы добавлять.
package { import flash.display.DisplayObject; import flash.display.Sprite; public class Main extends Sprite { public function Main() { var figure0:Sprite = new Sprite(); var figure1:Sprite = new Sprite(); var figure2:Sprite = new Sprite(); var array:Array = [figure0, figure1, figure2]; super.addChild(array[Math.round(Math.random() * 2)] as DisplayObject); } } } |
|
|||||
|
Регистрация: Feb 2012
Сообщений: 1,540
|
super тут зачем? А вдруг человек захочет заоверрайдить addChild, и, используя super, поймет, что ничего не получается.
Хотя, это дело вкуса. Превращается в: А вообще, правильней будет так: Точнее, разницы никакой, но на глаз приятнее. Последний раз редактировалось MikroAcse; 07.10.2013 в 21:53. |
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
MikroAcse Спасибо! я с Вами соглашусь)
|
|
|||||
|
Регистрация: Mar 2013
Сообщений: 290
|
Akopalipsis, а что происходит когда вы
Вроде бы это запуск конструктора класса Sprite, которому передается элемент массива, приведенный к нужному типу... или это запуск метода addChild этого класса? Последний раз редактировалось Fogflasher; 08.10.2013 в 11:12. |
|
|||||
|
Цитата:
То есть направление правильное. Лучше в массив запихать сами классы.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку. |
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Цитата:
И запись в виде addChild, super.addChild не чем друг от друга не отличаются. Кроме одного Но! Сначала я увидел это на форуме и сразу подумал, что мне тоже так теперь надо) И после того, как я начал так писать у этой глупости оказалась есть положительная сторона. У меня цвет синтаксиса настроен так, что помогает визуально код разбивать на части и именно супер занимает в этом не последнее место. Правда есть один момент, на который я не могу сам однозначно ответить и много раз хотел спросить.. И это как раз такой момент - отличается ли super.addChild() от this.addChild() или это одно и тоже? Сам я всегда даю ответ - нет, не отличается, потому что свойства то addChild у this все равно нет. package { import flash.display.DisplayObject; import flash.display.Sprite; import flash.events.TimerEvent; import flash.utils.Timer; public class Main extends Sprite { private var _figureStorage:Vector.<Class>; public function Main() { _figureStorage = Vector.<Class>([Figure0, Figure1, Figure2]); var _timer:Timer = new Timer(1000, 10); _timer.addEventListener(TimerEvent.TIMER, this_timerHandler); _timer.start(); } private function this_timerHandler(event:TimerEvent):void { var length:int = Math.round(Math.random() * (_figureStorage.length - 1)); var Figure:Class = _figureStorage[length] as Class; super.addChild(new Figure() as DisplayObject); } } } |
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Цитата:
я много написал пытаясь обьяснить моё не понимание, но потом стёр с надеждой на обьяснение. я бы понял разницу, если бы трейс показал меньше детей у this.numChildren.. Хотя разница наверное в исключении посредника this, что должно работать чуть быстрее. package { import flash.display.Sprite; public class MainOne extends Sprite { public function MainOne() { var sprite0:Sprite = new Sprite(); var sprite1:Sprite = new Sprite(); this.addChild(sprite0); super.addChild(sprite1); trace(super.numChildren,this.numChildren);//2,2 } override public function addChild(child:DisplayObject):DisplayObject { return super.addChild(child); } } } |
|
|||||
|
Цитата:
package { import flash.display.Sprite; public class MainOne extends Sprite { public function MainOne() { var sprite0:Sprite = new Sprite(); var sprite1:Sprite = new Sprite(); this.addChild(sprite0); super.addChild(sprite1); } override public function addChild(child:DisplayObject):DisplayObject { trace("I'm overriden method"); return super.addChild(child); } } } super - нет трейса this - есть трейс Если вы сделаете вот так: то объект sprite0 на сцену не добавится, так как метод класса Sprite не будет вызван. А именно метод addChild класса Sprite умеет добавлять что-то на сцену, никаким другим способом вы на сцену ничего не добавите (потому что этот метод реализован "внутри" FlashPlayer'а). То есть методы Main#addChild() и Sprite#addChild() - это разные методы. Просто они имеют одинаковые сигнатуры. Чтобы точно указать какой именно метод Вам нужен Вы можете использовать ключевые слова this или super. Я для себя выбрал такую практику - если метод описан в текущем классе (где я сейчас пишу его вызов), то я пишу this.method(). Если же метод написан в классе-предке, то я пишу super. Если метод не был переопределен (override), то вызовы через this и super дадут одинаковый результат, но чтобы внести ясность их, на мой взгляд, стоит всегда указывать. Хотя это все дело вкуса.
__________________
...вселенская грусть |
![]() |
![]() |
Часовой пояс GMT +4, время: 16:21. |
|
|
« Предыдущая тема | Следующая тема » |
|
|