PDA

Просмотр полной версии : Массив объектов класса


michail_93
10.06.2013, 17:34
Как создать массив объектов класса из библиотеки ссылаясь на его имя?


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);
}
...



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 заменить одним мувиклипом?

expl
10.06.2013, 22:43
Перво-наперво - надо выкинуть индекс нафиг
Во вторых, здесь только один объект и он создаётся в обязательном порядке - чтобы бы его самого не передать?

Но коли сильно хочется или если Body создаёт что-то внутри по своему усмотрению да ещё и не только в одном месте, то:
Можно передавать вместо индекстов сами классы или объекты-фабрики, но на практике проще и гибше тупо передать функцию:
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);
}
...

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();
...


...
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;
}
...

Преимущества/недостатки передачи функций по сравнению с передачей классов:
+ Можно использовать одни и те же классы с разными параметрами (меньше лишнего кода)
+ Компилятор скажет, если изменились параметры в конструкторе создаваемого объекта
- Нужно писать функции, а не просто имя класса (больше лишнего кода)

Babylon
10.06.2013, 22:52
вы return background , а у функции YourCommonType? Так можно?

expl
10.06.2013, 22:57
Подразумевается, что у всех должен быть какой-то общий тип - они же все в body присваиваются, но какой?
Если бы я увидел сразу private var body:MovieClip;
то конечно бы написал MovieClip, но теперь то что уж.

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

Babylon
10.06.2013, 23:39
Зачем было отвечать? Человек думает не только над решением своего вопроса, но и над тем что же вы написали такое.