2

我在容器 Sprite 上创建和应用置换贴图过滤器时遇到问题。设置是这样的

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 个过滤器只会更有效场景的一部分,而不是有一个过滤器和一个大位图,每一帧都会更新。问题是无论我尝试什么参数组合,我都看不到任何位移,我做错了什么吗?

PS:如果代码有错别字,我很抱歉,我现在不在我的开发机器上,所以我不得不重写它,但从算法的角度来看,这正是我写的。

4

1 回答 1

1

似乎您正在将数组分配给构造函数displacementFilters中的filters属性(在设置时ExplosionManager)。然后看起来您稍后会在该数组中添加和修改过滤器。

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

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

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

每当进行更改时,您都需要将更新的displacementFilters数组分配给。filters

于 2013-06-30T22:41:07.230 回答