Объектный пул не работает - PullRequest
0 голосов
/ 29 декабря 2011

У меня проблемы с настройкой пула объектов. Я создал собственный класс "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;
    }
}
}

1 Ответ

0 голосов
/ 29 декабря 2011

Я думаю, что пул должен выпустить мяч, отдавая его обратно. Это не список со всеми вами шарами (извините), но это список с шарами, которые вы не используете в данный момент. Таким образом, ваша 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(), обработка списка отображения не является обязанностью класса пула.

...