PDA

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


in4core
27.02.2012, 20:36
Собственно не смотрел как организован тот же tweenMax , но думаю здесь мне дадут более понятный ответ.
Задача : статический класс принимающий некий ( или несколько ) объектов - работает с ними раздельно.
Тоесть в твинмаксе я могу TweenMax.to(object1) , TweenMax.to(object2) и т.п.

Вот набросок быдло-кода, собственно вот и хочу узнать как модифицировать, чтобы работать с каждым объектом отдельно, а не было перекрытия методов

package com.in4core.text.effects
{
import com.greensock.TweenMax;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
import flash.display.Sprite;
import flash.events.TimerEvent;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.utils.describeType;
import flash.utils.Dictionary;
import flash.utils.Timer;
/**
* ...
* @author in4core lab
*/
public final class GhostLibrary
{

private static var _objectArray:Dictionary = new Dictionary(true);
private static var _iterator:int = 0;
private static var _tempSource:DisplayObject;
private static var _tempArray:Array = [];

public static function cubicBlurTransition(source:DisplayObject , holder:DisplayObjectContainer,

numW:int , numH:int , oneTime:int = 20 , isStart:Boolean = false):void {

const timer:Timer = new Timer(oneTime);
const sprite:Sprite = new Sprite();

timer.addEventListener(TimerEvent.TIMER , update_cubicBlurTransition);

_objectArray[ source ] = [ holder , timer , sprite ];

_tempSource = source;

const w:int = source.width / numW;
const h:int = source.height / numH;
const b:BitmapData = new BitmapData(source.width , source.height, true, 0);
b.draw(source);

for (var i:int = 0; i < numW + 1; i ++) {

for (var j:int = 0; j < numH + 1; j++) {

const bd:BitmapData = new BitmapData(w + 1, h + 1, false);
bd.copyPixels(b , new Rectangle(i * w , j * h , w , h ) , new Point() );
const bt:Bitmap = new Bitmap(bd , 'never' , true);

sprite.addChild(bt);

_tempArray.push(bt);

bt.alpha = 0;
bt.x = i * w;
bt.y = j * h;
}
}

holder.addChild(sprite);

if (isStart) source.visible = false , timer.start();
}

private static function update_cubicBlurTransition(e:TimerEvent):void {

var tar:Timer = e.target as Timer;
var num:int = Math.floor( Math.random() * _tempArray.length );

if (!_tempArray.length) {

tar.stop();

return;
}


var c:Bitmap = _tempArray[num];

if (_tempArray.length > 1 ) TweenMax.fromTo ( c , 1 , { blurFilter: { blurX:80 } }, { blurFilter: { blurX:0 } , alpha:1 } );
else TweenMax.fromTo ( c , 1 , { blurFilter: { blurX:80 } }, { blurFilter: { blurX:0 } , alpha:1 ,
onComplete:onComplete_cubicBlurTransition } );

_tempArray.splice(num,1);

}

private static function onComplete_cubicBlurTransition():void {

_objectArray[_tempSource][0].removeChild(_objectArray[_tempSource][2]);
_tempSource.visible = true;
}
}

}

Silicium
27.02.2012, 22:54
Возможно, я не совсем понял задачу, но как вариант, можно создавать экземпляр этого же самого, например, класса (или добавить internal class) и класть его в словарик. Методы, которые по факту работают с объектами, не статические но приватные. Т-к используются слабые ключи, то все ненужное само отвалится.

in4core
27.02.2012, 23:46
Странно в письме не добавилось мое UPD
Я написал видимо как раз о том, о чем ты говоришь

public static function TweenMax(rest):void {
var inst:MAXIntsance = new MAXIntsance(rest)
array.push(inst)
}

Silicium
27.02.2012, 23:52
Ну я бы все же пользовался словарем вместо массива и проверял бы в начале метода, есть ли запись или нет, чтобы лишний раз не создавать, или обнулять параметры, или еще что. Можно, конечно, и массив перебирать, но зачем?

in4core
27.02.2012, 23:56
массив это не важно, я саму логику никак не мог понять сначала, что внутри статики создаются локальные инстансы, хотя не факт, что максеры делают так

Silicium
28.02.2012, 00:02
Не факт, но какая разница? Или ты хочешь узнать, как это именно там реализовано?
ЗЫ я сам таким методом последнее время довольно часто ползьзуюсь - very useful

in4core
28.02.2012, 00:08
Узнать бы тоже было не плохо, все пути мне интересны.

Wolsh
28.02.2012, 01:18
Ну если вам лень открыть класс, то вот
public static function to(target:Object, duration:Number, vars:Object):TweenMax {
return new TweenMax(target, duration, vars);
}

Silicium
28.02.2012, 01:25
Спасибо. Я этой либой не пользуюсь, но мы угадали правильно. Даже дальше пошли)

Wolsh
28.02.2012, 01:30
Ага, в какие-то дебри. Зачем классу иметь ссылки на эти экземпляры в каком-то массиве? Предоставлять фасад для работы с этими экземплярами? Возводить суперменеджер экземпляров? Они ему вообще нужны зачем-то? Кому надо было, тот взял и играется.

Silicium
28.02.2012, 01:53
Классу они вообще не нужны, класс их проксирует по сути. А при частом обращении лучше хранить ссылки чем каждый раз создавать новый экземпляр. Тем более, что в зависимости от реализуемой логики, создание мало ли что за собой тянуть будет. Короче говоря, зависит опять-таки от ситуации.

Добавлено через 4 минуты
Иными словами: если у меня есть много объектов, над которыми мне иногда надо проделать какие-то действия (не заложенные в их классы), то я, конечно, не буду хранить на них ссылки. Если есть немножко КЦ объектов, но действия выполняются часто, то инстансы я складываю в словарь, и по необходимости дергаю.