Я использую класс Manager, который я создал, для управления группой объектов, которые могут быть назначены любому «списку» на основе строки. то есть вы можете назначить его «врагам» и «ALL_OBJECTS». Класс использует pop () для почти мгновенного удаления (и использует объект, а не индекс для удаления, как вы хотели).
Вот объект, который вы бы создали и связали с менеджером:
public class AvGlyph extends Object
{
// vars
internal var signatures:Array = [];
private var _attachment:Object;
/**
* Constructor
* @param attachTo An Object to set as the attachment for this
*/
public function AvGlyph(attachTo:Object)
{
_attachment = attachTo;
}
/**
* Dissolves this, destroying reference to _attachment and fully detaching itself
*/
public function dissolve():void
{
_attachment = null;
AvGlyphManager.fullyDetach(this);
}
/**
* Basic getters
*/
public function get attachment():Object{ return _attachment; }
/**
* Returns an Array containing all signatures applied to this
*/
public function get allSignatures():Array
{
var a:Array = [];
var i:String;
for(i in signatures) a.push(i);
return a;
}
}
И это менеджер для этих:
public class AvGlyphManager
{
// properties
private static var _glyphs:Array = [];
/**
* Attaches an AvGlyph to a specified list
* @param glyph The AvGlyph to attach
* @param signatures Signature Strings used to represent categories
*/
public static function attach(glyph:AvGlyph, ...signatures):void
{
var i:String;
for each(i in signatures)
{
if(!_glyphs[i]) _glyphs[i] = [];
if(!glyph.signatures[i])
{
glyph.signatures[i] = _glyphs[i].length;
_glyphs[i].push(glyph);
}
}
}
/**
* Detach an AvGlyph from a specified list
* @param glyph The AvGlyph to detach
* @param signature Signature Strings used to represent categories
*/
public static function detach(glyph:AvGlyph, ...signatures):void
{
var i:String;
for each(i in signatures)
{
var n:uint = glyph.signatures[i];
if(n == _glyphs[i].length - 1) _glyphs[i].pop();
else
{
_glyphs[i][n] = _glyphs[i].pop();
_glyphs[i][n].signatures[i] = n;
}
if(_glyphs[i].length < 1) delete _glyphs[i];
}
}
/**
* Detach an AvGlyph from all previously specified listings
* @param glyph The AvGlyph to detach
*/
public static function fullyDetach(glyph:AvGlyph):void
{
var i:String;
for(i in glyph.signatures) detach(glyph, i);
}
/**
* Returns a Array of all AvGlyphs that have been attached with a specified signature
* @param signature A signature String used to represent a category
*/
public static function getGlyphs(signature:String):Array
{
if(!_glyphs[signature])return [];
return _glyphs[signature].slice();
}
/**
* Trace a tree of signatures and their children
*/
public static function traceTree():void
{
trace('a');
}
}
Использование просто:
В вашем классе, скажем, Zombie.as, вы могли бы.
public class Zombie extends Sprite
{
private var _glyph:AvGlyph;
/**
* Constructor
*/
public function Zombie()
{
_glyph = new AvGlyph(this);
AvGlyphManager.attach(_glyph, "enemies");
}
}
Отсюда вы можете в любом месте приложения / игры использовать:
AvGlyphManager.getGlyphs("enemies");
Который вернул бы массив глифов, перечисленных в разделе «враги». Доступ к самому Зомби осуществляется просто через glyph.attachment. Так что в цикле через все ваши объекты это будет что-то вроде:
var li:Array = AvGlyphManager.getGlyphs("enemies");
var i:AvGlyph;
for each(i in li)
{
trace(i.attachment);
}
Удаление, вероятно, будет простым, если вы быстро взгляните на AvGlyphManager. Также есть:
AvGlyphManager.fullyDetach(glyph);
Что чрезвычайно полезно, когда вы хотите полностью удалить объект.