【问题标题】:DisplacementMapFilter not showing up in flashDisplacementMapFilter 未显示在 Flash 中
【发布时间】:2013-07-01 06:41:07
【问题描述】:

我在容器 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:对不起,如果代码有一些错别字,我现在不在我的开发机器上,所以我不得不重写它,但从算法的角度来看,这正是我写的。

【问题讨论】:

  • 您是否在代码中应用了过滤器?您是否添加了 Bitmap 对象以在任何地方显示列表?
  • 我认为这一行就足够了 container.filters =displacementFilters;
  • 我是在爆炸管理器的构造函数中添加过滤器,不知道需要将位图添加到显示列表中,我遵循的在线教程仅添加它以供参考跨度>

标签: actionscript-3 flashdevelop


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 就是这样,初始化ti的时候filter数组是空的,非常感谢。
猜你喜欢
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 2015-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多