Assume I have the myCircle class all defined and all that. If my code is as follows:
var circle1:myCircle = new myCircle()
var circle2:myCircle = new myCircle()
var circle3:myCircle = new myCircle()
var circle4:myCircle = new myCircle()
stage.addChild(circle1)
stage.addChild(circle2)
stage.ad开发者_如何学JAVAdChild(circle3)
stage.addChild(circle4)
How would I write a function to return an array of [circle1, circle 2, circle3, circle4] automatically?
It's simple, take a look at the following I made:
package
{
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite
{
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}// end function
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
for (var i:uint = 0; i < 5; i++)
{
var circle:Circle = new Circle();
circle.name = "circle" + (i+1);
stage.addChild(circle);
}// end for
for (var j:uint = 0; j < 5; j++)
{
var square:Square = new Square();
square.name = "square" + (j+1);
stage.addChild(square);
}// end for
traceNames(getCircles(stage)); // output: circle1
// circle2
// circle3
// circle4
// circle5
traceNames(getSquares(stage)); // output: square1
// square2
// square3
// square4
// square5
traceNames(getChildren(stage, Circle)); // output: circle1
// circle2
// circle3
// circle4
// circle5
}// end function
private function getCircles(container:DisplayObjectContainer):Array
{
var array:Array = new Array();
for (var i:uint = 0; i < container.numChildren; i++)
if (container.getChildAt(i) is Circle)
array.push(container.getChildAt(i));
return array;
}// end function
private function getSquares(container:DisplayObjectContainer):Array
{
var array:Array = new Array();
for (var i:uint = 0; i < container.numChildren; i++)
if (container.getChildAt(i) is Square)
array.push(container.getChildAt(i));
return array;
}// end function
private function getChildren(container:DisplayObjectContainer, type:Class):Array
{
var array:Array = new Array();
for (var i:uint = 0; i < container.numChildren; i++)
if (container.getChildAt(i) is type)
array.push(container.getChildAt(i));
return array;
}// end function
private function traceNames(array:Array):void
{
for each(var displayObject:DisplayObject in array)
trace(displayObject.name);
}// end function
}// end class
}// end package
import flash.display.Sprite;
internal class Circle extends Sprite
{
public function Circle() {}
}// end class
internal class Square extends Sprite
{
public function Square() {}
}// end class
The three key functions here are getCircles(), getSquares() and getChildren(). They all essentially do the same thing, theres a for
loop in the function that loops through a specified display object container's children. Upon each interation it checks the type for either Circle
or Square
types in the getCircles()
and getSquares()
functions respectively, and then it adds each display object to a local array which is returned by the function.
The getChildren()
function takes things a step further by allowing for the type to be specified beforehand.
I'm not going to do your job for you but I can give you a hint:
you can check if something is a myCircle instance by doing
if(child is myCircle)
so when you loop through all children of the stage you can put the children that ARE instances of myCircle into the array and if not, do nothing. That will give you an array of all children that are myCircles.
精彩评论