2013年7月4日 星期四

CitrusEngine使用SimpleCitrusSolver(碰撞檢查),無法檢查PoolObject裡Class的問題

CitrusEngine的SimpleCitrusSolver物件可以很方便的幫你作碰重檢查。
如果你想要檢查Hero與Enemy之間是否有碰撞,只要這樣做就可以了。
var simpleCitrusSolver:SimpleCitrusSolver = new SimpleCitrusSolver ("citrus solver");
simpleCitrusSolver.overlap(Hero,Enemy);
add(simpleCitrusSolver);
但是如果要檢查的物件是使用了PoolObject,就會無法檢查到碰撞。
進去看了一下程式做法才知道他是用_ce.state.getObjectsByType(Class)的方法抓出場景上的各個物件來作比對,不過如果你的物件放在PoolObject裡面,getObjectsByType就會什麼都抓不到
解決方法就是傳入的PoolObject物件改用poolObject.foreachRecycled()來取得pool裏面的各個物件就可以了。
以下直接寫個繼承SimpleCitrusSolver的Class並加上這個功能
package  
{
 import citrus.core.CitrusObject;
 import citrus.datastructures.PoolObject;
 import citrus.objects.CitrusSprite;
 import citrus.physics.simple.SimpleCitrusSolver;
 
 /**
  * 使用PoolObject作碰撞檢查
  * Use PoolObject to collision checking
  * @author cainmaila@gmail.com
  */
 public class PoolCitrusSolver extends SimpleCitrusSolver 
 {
  private var _poolChecks:Array = [];
  /**
   * Simple collision checking
   * @param name
   * @param params
   */
  public function PoolCitrusSolver(name:String, params:Object = null)
  {
   super(name, params);
  }
  /**
   * 使用PoolObject作檢查
   * @param typeA PoolObject
   * @param typeB CitrusObject Class
   */
  public function poolChk(typeA:PoolObject, typeB:Class):void 
  { 
   _poolChecks.push( { a:typeA, b:typeB } );
  }
  
  override public function update(timeDelta:Number):void 
  {
   super.update(timeDelta);
   
   var pair:Object;
   var groupB:Vector.;
   var itemB:CitrusSprite;
   var j:int;
   //增加一個遍歷PoolObject各個物件的邏輯
   for each (pair in _poolChecks)
   {
    PoolObject(pair.a).foreachRecycled(function (itemA:CitrusSprite):void 
    {
     groupB = _ce.state.getObjectsByType(pair.b);
     for (j = 0; j < groupB.length; ++j) 
     {
      itemB = groupB[j] as CitrusSprite;
      overlapOnce(itemA, itemB);
     }
    });
   }
  }
 }

}
你可以直接下載我寫好的物件
新增了一個poolChk方法,使用方法只要把PoolObject物件傳入就好了

var poolCitrusSolver:PoolCitrusSolver = new PoolCitrusSolver("citrus solver");
poolCitrusSolver.poolChk(poolObject,Class);
add(simpleCitrusSolver);

沒有留言: