2011-12-28 2 views
0

개체 풀을 설정하는 데 문제가 있습니다. 풀링 로직을 처리하기 위해 "BallPoll"사용자 정의 클래스를 작성했습니다. fillPool()을 먼저 호출하여 20 개의 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

어떤 부분이 작동하지 않습니까? 문제가 정확히 무엇입니까? – Cadin

+0

getBall 함수가 작동하지 않습니다. 난 STOREDBALLS 배열을 통해 반복하고 무대에있는 볼을 결정하는 방법을 알아낼 수 없습니다. 또한, 부모 문서 클래스에서 공을 적절히 재활용하십시오. 감사합니다 – user1114288

답변

0

풀을 가져올 때 풀에서 풀을 놓아야한다고 생각합니다. 모든 볼 (미안)이있는 목록이 아니지만 지금은 사용하지 않는 볼이있는 목록입니다. 따라서 getBall() 함수는 새 Ball을 반환하고 STOREDBALLS에서 참조를 제거해야합니다. 이 작업을 수행하는 가장 좋은 방법은 pop() 또는 shift()을 사용하는 것입니다.이 방법은 Array에서 마지막 요소를 제거하고 해당 요소의 값을 반환합니다.

카운터가 잘못되었습니다 (항상 0입니까?) 그런 식으로 사용하면 안됩니다.

나는 이런 식으로 할 것 : BTW

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(), 디스플레이의 처리를 사용해야합니다 -list는 pool-class의 책임이 아닙니다.

+0

응답 해 주셔서 감사합니다! 마지막 질문 하나만하십시오. 나는 당신의 새로운 getBall 함수를 구현했다. 공은 완벽하게 내리지 만 어떻게 배열로 되돌려 보내야합니까? 풀에서 풀을 가져올 때이 볼을 내 문서 클래스의 "ballArray"라는 Array에 저장합니다. "Pool"은 내 "BallPool.as"클래스의 인스턴스입니다. 나는 "Pool.STOREDBALLS.push (ballArray [i]);"라고 불렀다. 그러나 그것은 작동하지 않았다. 그래서 요약하면 STOREDBALLS 배열에 사용자 정의 클래스에있는 공을 어떻게 보낼 수 있습니까? 어떻게 문서 클래스의 사용자 정의 클래스에서 객체를 배열에 푸시합니까? – user1114288

+0

답변을 업데이트했습니다. 도움이 되었기를 바랍니다. –

관련 문제