2013-06-30 22 views
2

我在创建和应用容器Sprite上的位移贴图过滤器时遇到了问题。该设置是这样的DisplacementMapFilter没有显示在闪存中

public class ExplosionManager 
{ 
    [Embed...] // this is an image I tested, basically a spherical displacement 
    private var explodeDisplaceAsset:Class; 
    private var explodeDisplace:Bitmap; 
    private var displacementFilters:Array = new Array(); 
    private var displacementMaps:Vector.<BitmapData> = new Vector.<BitmapData>(); 
    private var unusedFilters:Vector.<DisplacementMapFilter> = new Vector.<DisplacementMapFilter>(); 
    private var unusedMaps:Vector.<BirmapData> = new Vector.<BitmapData>(); 

    public function ExplosionManager(container:Sprite) 
    { 
     explodeDisplace = new explodeDisplaceAsset(); 
     container.filters = displacementFilters; 
    } 
    public function ExplodeAt(pos:Point, force:int) : void 
    { 
     var newDisplaceMap:BitmapData; 
     var newDisplaceFilter:DisplacementMapFilter; 
     if(unusedFilters.length == 0) 
     { 
      newDisplaceMap = new BitmapData(64,64,true, 0x808080); 
      newDisplaceMap.draw(explodeDisplace); 
      newDisplaceFilter = new DispalcementFilter(newDisplaceMap, pos, BitmapDataChannel.RED, BitmapDataChannel.GREEN, force, force); 
     } 
     else 
     { 
       newDisplaceMap = unusedMaps.pop(); 
       newDisplaceFilter = unusedFilters.pop(); 
       newDisplaceFilter.componentX = force; 
       newDisplaceFilter.componentY = force; 
       newDisplaceFilter.mapPoint = pos; 
       newDisplaceFilter.mapBitmap = newDisplaceMap; 
     } 
     displacementMaps.push(newDisplaceMap); 
     displacementFilters.push(newDisplaceFilter); 
    } 
} 

我试图做一个可重用,并根据需要创建过滤器,我最初的想法是,如果我有大约2-3爆炸上衣它会是更高效的自适应对象池有2-3个滤镜只适用于场景的一部分,而不是只有一个滤镜具有每帧更新的单个大位图。 问题是,无论我尝试使用什么参数组合,我都看不到任何位移,有没有我做错的事情?如果代码有一些错别字,我现在不在我的开发机器中,所以我不得不重写它,但是从算法的角度来看,这正是我写的。

+0

您是否在代码中应用了过滤器?你是否添加了Bitmap对象以在任何地方显示列表? – GeorgeCross

+0

我以为这行就足够了container.filters = displacementFilters; –

+0

我在爆炸管理器的构造函数中添加了过滤器,我并不知道有必要将位图添加到显示列表中,我跟随的在线教程仅将其添加为参考 –

回答

1

看起来好像您正在将数组displacementFilters分配给构造函数中的filters属性(设置为ExplosionManager)。然后它看起来像是在稍后的日期添加和修改该数组中的过滤器。

不幸的是,上次用作源的数组内存储的过滤器所做的更改将不会应用于该对象。这是因为当您将一个数组分配给filters时,实际上会创建并使用该数组的副本。从文档:

要修改现有的过滤器对象,则必须使用的 修改filters数组的副本的技术:

  1. 分配滤波器阵列的值设置为一个临时数组,如 一个名为myFilters。
  2. 通过使用临时数组, myFilters修改属性。例如,要设置数组中第一个 过滤器的质量属性,可以使用以下代码: myFilters [0] .quality = 1;
  3. 将临时数组的值分配给 filters数组。

您需要每当有更改了更新displacementFilters数组分配给filters

+0

就是这样,过滤器数组是当ti初始化时为空,非常感谢。 –