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

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

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

Регистрация: Jun 2013
Сообщений: 1
По умолчанию Массив объектов класса

Как создать массив объектов класса из библиотеки ссылаясь на его имя?

Код AS3:
package Classes
{
	import flash.display.MovieClip;
	import flash.display.Sprite;
 
 
	public class Body extends Sprite
	{
 
		private var body:MovieClip;
		public function Body(num:int,dx:Number,dy:Number)
		{
			switch (num)
			{
				case 0 :
					this.body = new Block();
					break;
				case 2 :
					this.body = new Background();
					break;
				case 4 :
					this.body = new Trash();
					break;
				case 5 :
					this.body = new Car();
					break;
			}
			this.body.x = dx;
			this.body.y = dy;
			this.addChild(this.body);
		}
...
Код AS3:
package Classes
{
	import flash.display.Sprite;
	import flash.display.MovieClip;
	import Classes.Body;
 
	public class Scroller extends Sprite
	{
		private var bg:Body = null;
		private var bgArray = new Array();
		private var i:int = 0;
		private var posfront = 0;
		private var posback = 0;
		private var count:Number = 0;
		private var mc:MovieClip = null;
		private var num:Number = 0;
		private var MWidth = 0;
		private var speed:Number = 0;
		private var currentX:int = 0;
		private var oldX:int = 0;
 
		public function Scroller(num:Number,sw:Number,dy:Number)
		{
			this.num = num;
			this.MWidth = sw;
			switch (num)
			{
				case 0 :
					mc = new Block();
					break;
				case 2 :
				{
					mc = new Background();
					speed=-0.5;
				}
					break;
				case 4 :
				{
					mc = new Trash();
					speed=-0.75;
				}
					break;
				case 5 :
					mc = new Car();
					break;
			}
			count = Math.floor(sw/mc.width)+1;
			for (i=0; i<2*count; i++)
			{
				if (i!=0)
				{
					bg = new Body(num,bgArray[i - 1].PositionX + bgArray[i - 1].Width,dy);
				}
				else
				{
					bg = new Body(num,-mc.width -  sw/2,dy);
				}
				bgArray.push(bg);
				if (num==4 || num==5)
				{
					bg.Frame = Rand(num);
				}
				this.addChild(bg);
			}
			bg = null;
			posfront = 0;
			posback = bgArray.length - 1;
		}
...
Добавлено через 28 минут
тоесть как можна этот switch заменить одним мувиклипом?

Старый 10.06.2013, 22:43
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 2  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Перво-наперво - надо выкинуть индекс нафиг
Во вторых, здесь только один объект и он создаётся в обязательном порядке - чтобы бы его самого не передать?

Но коли сильно хочется или если Body создаёт что-то внутри по своему усмотрению да ещё и не только в одном месте, то:
Можно передавать вместо индекстов сами классы или объекты-фабрики, но на практике проще и гибше тупо передать функцию:
Код AS3:
package Classes
{
	import flash.display.MovieClip;
	import flash.display.Sprite;
 
 
	public class Body extends Sprite
	{
 
		private var body:MovieClip;
		public function Body(createBody:Function,dx:Number,dy:Number)
		{
			this.body = createBody();
			this.body.x = dx;
			this.body.y = dy;
			this.addChild(this.body);
		}
...
Код AS3:
package Classes
{
	import flash.display.Sprite;
	import flash.display.MovieClip;
	import Classes.Body;
 
	public class Scroller extends Sprite
	{
		private var bg:Body = null;
		private var bgArray = new Array();
		private var i:int = 0;
		private var posfront = 0;
		private var posback = 0;
		private var count:Number = 0;
		private var mc:MovieClip = null;
		private var num:Number = 0;
		private var MWidth = 0;
		private var speed:Number = 0;
		private var currentX:int = 0;
		private var oldX:int = 0;
 
		public function Scroller(createMC:Function,sw:Number,dy:Number)
		{
			this.num = num;
			this.MWidth = sw;
			mc = createMC();
...
Код AS3:
...
var body:Body = new Body(createBlock, 0, 0);
var body:Body = new Body(createRedBackground, 0, 0);
// Вместо
// var body:Body = new Body(1, 0, 0);// WTF?
// var body:Body = new Body(2, 0, 0);// WTF?
...
private function createBlock():YourCommonType
{
	return new Block();
}
private function createBackground():YourCommonType
{
	return new Background();
}
private function createRedBackground():YourCommonType// пример гибкости
{
	var background:Background = new Background();
	background.color = 0xff0000;
	return background;
}
...
Преимущества/недостатки передачи функций по сравнению с передачей классов:
+ Можно использовать одни и те же классы с разными параметрами (меньше лишнего кода)
+ Компилятор скажет, если изменились параметры в конструкторе создаваемого объекта
- Нужно писать функции, а не просто имя класса (больше лишнего кода)

Старый 10.06.2013, 22:52
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 3  
Ответить с цитированием
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
вы return background , а у функции YourCommonType? Так можно?

Старый 10.06.2013, 22:57
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 4  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Подразумевается, что у всех должен быть какой-то общий тип - они же все в body присваиваются, но какой?
Если бы я увидел сразу
Код AS3:
private var body:MovieClip;
то конечно бы написал MovieClip, но теперь то что уж.

Вообще, можно было и Background написать - здесь фиолетово.

Старый 10.06.2013, 23:39
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 5  
Ответить с цитированием
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
Зачем было отвечать? Человек думает не только над решением своего вопроса, но и над тем что же вы написали такое.

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

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

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


 


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


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