我在容器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:我很抱歉,如果代码有一些拼写错误,我现在不在我的开发机器上,所以我不得不重写它,但从算法的角度来看,这正是我写的。答案 0 :(得分:1)
您似乎正在将数组displacementFilters
分配给构造函数中的filters
属性(在ExplosionManager
的设置中)。然后看起来您将在以后添加和修改该数组中的过滤器。
不幸的是,对上次用作源的数组中存储的过滤器所做的更改将不会应用于该对象。这是因为当您将数组分配给filters
时,实际上会创建并使用该数组的副本。来自文档:
要修改现有过滤器对象,必须使用以下技术 修改过滤器数组的副本:
- 将filters数组的值分配给临时数组,例如 一个名为myFilters。
- 使用临时数组修改属性, myFilters的。例如,要设置第一个的quality属性 在数组中过滤,您可以使用以下代码: myFilters [0] .quality = 1;
- 将临时数组的值分配给 过滤器阵列。
醇>
每当进行更改时,您都需要将更新后的displacementFilters
数组分配给filters
。