【问题标题】:Object Pool not working对象池不工作
【发布时间】:2011-12-28 21:52:49
【问题描述】:

我在设置对象池时遇到问题。我创建了一个“BallPoll”自定义类来处理池逻辑。我首先调用 fillPool() 将 20 个 Ball 对象添加到我的数组中。然后在我的文档类中,当我想创建一个 Ball 时,我检查了 pool 数组。它不起作用,我不确定为什么。

------文档类------

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

【问题讨论】:

  • 哪个部分不起作用?究竟是什么问题?
  • getBall 函数不起作用。我不知道如何遍历 STOREDBALLS 数组并确定哪些球在舞台上,哪些不在舞台上。此外,正确回收来自父 Document 类的 Balls。谢谢

标签: flash actionscript-3 actionscript object-pooling


【解决方案1】:

我认为游泳池应该在回球时释放球。这不是一个包含所有球的列表(对不起),但它是一个包含您目前不使用的球的列表。所以你的getBall() 函数应该返回一个新的 Ball 并从 STOREDBALLS 中删除引用。最好的方法是使用pop()shift(),它们从数组中删除最后一个元素并返回该元素的值。

你的计数器是错误的(它总是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(),显示列表的处理不是池类的责任。

【讨论】:

  • 感谢您的回复!请最后一个问题。我已经实现了你的新 getBall 函数。球完美卸载,但如何将它们送回阵列。当我将它们从池中拉出时,我将这些球存储在我的文档类中一个名为“ballArray”的数组中。 “Pool”是我的“BallPool.as”类的实例。我尝试调用“Pool.STOREDBALLS.push(ballArray[i]);”但它没有用。因此,总结一下如何将完成的球发送回自定义类中的 STOREDBALLS 数组?如何从文档类中将对象推送到自定义类中的数组?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 2013-02-08
  • 2015-03-14
相关资源
最近更新 更多