我在设置对象池时遇到问题。我创建了一个“BallPoll”自定义类来处理池逻辑。我首先调用fillPool()将20个Ball对象添加到我的数组中。然后在我想要创建Ball的文档类中,检查池数组。它不起作用,我不知道为什么。
------文件类---------
function throwBall(e:TimerEvent):void {
if (mouseY>stage.stageHeight-180) {
return;
}
var tBall:Ball = Pool.getBall(new Point(mouseX,mouseY),new Point(Math.random()+Math.random()*5+Math.random()*8),gravity,friction);
tBall.gotoAndStop(BallColor);
addChild(tBall);
ballArray.push(tBall);
}
----------- BallPool类---------
package {
import flash.events.TimerEvent;
import flash.geom.Point;
import flash.events.*;
import flash.display.*;
import flash.utils.*;
import flash.system.*;
import Ball;
public class BallPool extends MovieClip {
private static const gravity:Number=1.5;
private static const friction:Number=.50;
public var STOREDBALLS:Array = new Array();
public function BallPool () {
fillPool();
}
public function fillPool() {
for (var i:int = 0; i < 20; i++) {
var NewBall:Ball = new Ball(new Point(mouseX,mouseY),new Point(Math.random()+Math.random()*5+Math.random()*8),gravity,friction);
STOREDBALLS.push(NewBall);
}
}
public function getBall($position:Point, $vector:Point, $gravity:int, $friction:Number):Ball {
if (STOREDBALLS.length > 0) {
var counter:int = 0;
trace(STOREDBALLS.length);
var ball:Ball = STOREDBALLS[counter];
trace("44");
counter ++;
return ball;
} else {
return new Ball($position, $vector, $gravity, $friction);
}
//return null;
}
}
}
答案 0 :(得分:0)
我认为球池应该在回球时释放球。这不是一个包含所有球的列表(对不起),但它是一个列表,其中包含您目前不使用的球。所以你的getBall()
函数应该返回一个新的Ball并从STOREDBALLS中删除引用。执行此操作的最佳方法是使用pop()
或shift()
,它会从Array中删除最后一个元素并返回该元素的值。
你的计数器是错误的(总是0
?),不应该那样使用。
我会这样做:
public function getBall($position:Point, $vector:Point, $gravity:int, $friction:Number):Ball {
if (STOREDBALLS.length) {
// grab ball from list + remove it
var ball:Ball = STOREDBALLS.pop();
// reset its values
ball.position = $position;
ball.vector = $vector;
ball.gravity = $gravity;
ball.friction = $friction;
return ball;
}
return new Ball($position, $vector, $gravity, $friction);
}
顺便说一句;看起来你是来自PHP背景。在ActionScript 3中,没有人使用美元符号,您不需要使用它们。
更新:要再次将球推入池中,您可以使用此功能:
public function addBall($ball:Ball):void {
STOREDBALLS.push($ball);
}
在您使用池的类中,您应该使用removeChild()
或addChild()
,显示列表的处理不是池类的责任。