Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.10.2013, 21:28
Bugert вне форума Посмотреть профиль Отправить личное сообщение для Bugert Найти все сообщения от Bugert
  № 1  
Ответить с цитированием
Bugert

Регистрация: Aug 2013
Сообщений: 10
По умолчанию Случайный тип данных

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

Старый 07.10.2013, 21:34
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 2  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Проще добавить фигуры в массив и уже его элементы добавлять.
Код AS3:
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);
		}
 
	}
 
}

Старый 07.10.2013, 21:39
MikroAcse вне форума Посмотреть профиль Отправить личное сообщение для MikroAcse Найти все сообщения от MikroAcse
  № 3  
Ответить с цитированием
MikroAcse
 
Аватар для MikroAcse

Регистрация: Feb 2012
Сообщений: 1,540
super тут зачем? А вдруг человек захочет заоверрайдить addChild, и, используя super, поймет, что ничего не получается.
Хотя, это дело вкуса.
Код AS3:
super.addChild(array[Math.round(Math.random() * 2)] as DisplayObject);
Превращается в:
Код AS3:
this.addChild(array[int(Math.random() * array.length)]);
А вообще, правильней будет так:
Код AS3:
var index:int = int(Math.random() * array.length);
addChild(array[index]);
Точнее, разницы никакой, но на глаз приятнее.


Последний раз редактировалось MikroAcse; 07.10.2013 в 21:53.
Старый 07.10.2013, 21:44
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 4  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
MikroAcse Спасибо! я с Вами соглашусь)

Старый 08.10.2013, 10:01
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 5  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
Akopalipsis, а что происходит когда вы пишете используете оператор super:
Код AS3:
super.addChild(array[Math.round(Math.random() * 2)] as DisplayObject)
Вроде бы это запуск конструктора класса Sprite, которому передается элемент массива, приведенный к нужному типу...
или это запуск метода addChild этого класса?


Последний раз редактировалось Fogflasher; 08.10.2013 в 11:12.
Старый 08.10.2013, 10:41
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 6  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Цитата:
Akopalipsis, а что происходит когда вы пишете:
Из массива тягается случайный спрайт и добавляется на экран. Если элемент уже на экране, то он поднимется выше. То есть по таймеру вы максимум увидите 3 фигуры.

То есть направление правильное. Лучше в массив запихать сами классы.
Код AS3:
var cls:Class = array[Math.round(Math.random() * (len-1))] as Class;
addChild(new cls() as DisplayObject);
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 08.10.2013, 14:52
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 7  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
Akopalipsis, а что происходит когда вы пишете используете оператор super:
Не чего не происходит, класс Main, у которого нет свойства addChild(), унаследует его от класса Sprite.
И запись в виде addChild, super.addChild не чем друг от друга не отличаются. Кроме одного Но!
Сначала я увидел это на форуме и сразу подумал, что мне тоже так теперь надо) И после того, как я начал так писать у этой глупости оказалась есть положительная сторона. У меня цвет синтаксиса настроен так, что помогает визуально код разбивать на части и именно супер занимает в этом не последнее место.
Правда есть один момент, на который я не могу сам однозначно ответить и много раз хотел спросить..
И это как раз такой момент - отличается ли super.addChild() от this.addChild() или это одно и тоже?
Сам я всегда даю ответ - нет, не отличается, потому что свойства то addChild у this все равно нет.

Код AS3:
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);
		}
 
	}
 
}

Старый 08.10.2013, 15:45
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 8  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Переопределите addChild (а это не свойство, а метод) в классе наследнике и увидите разницу.
__________________
тут я

Старый 08.10.2013, 18:00
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 9  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
Сообщение от КорДум Посмотреть сообщение
Переопределите addChild (а это не свойство, а метод) в классе наследнике и увидите разницу.
Наверное я нуждаюсь в обьяснении, так как я не понимаю разницы.
я много написал пытаясь обьяснить моё не понимание, но потом стёр с надеждой на обьяснение.
я бы понял разницу, если бы трейс показал меньше детей у this.numChildren..
Хотя разница наверное в исключении посредника this, что должно работать чуть быстрее.
Код AS3:
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);
		}
 
	}
 
}

Старый 08.10.2013, 18:26
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 10  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
Хотя разница наверное в исключении посредника this, что должно работать чуть быстрее.
Нет разницы по производительности. Попробуйте вот так:
Код AS3:
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 Вы вызовете метод класса-предка (Sprite), а в случае с this - метод класса Main (который является переопределенным методом класса Sprite).
super - нет трейса
this - есть трейс

Если вы сделаете вот так:
Код AS3:
//return super.addChild(child);
return child;
то объект sprite0 на сцену не добавится, так как метод класса Sprite не будет вызван. А именно метод addChild класса Sprite умеет добавлять что-то на сцену, никаким другим способом вы на сцену ничего не добавите (потому что этот метод реализован "внутри" FlashPlayer'а).

То есть методы Main#addChild() и Sprite#addChild() - это разные методы. Просто они имеют одинаковые сигнатуры. Чтобы точно указать какой именно метод Вам нужен Вы можете использовать ключевые слова this или super. Я для себя выбрал такую практику - если метод описан в текущем классе (где я сейчас пишу его вызов), то я пишу this.method(). Если же метод написан в классе-предке, то я пишу super. Если метод не был переопределен (override), то вызовы через this и super дадут одинаковый результат, но чтобы внести ясность их, на мой взгляд, стоит всегда указывать. Хотя это все дело вкуса.
__________________
...вселенская грусть

Создать новую тему Ответ Часовой пояс GMT +4, время: 16:21.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 16:21.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.