【问题标题】:BitmapData.draw() Matrix problemBitmapData.draw() 矩阵问题
【发布时间】:2010-10-15 13:39:20
【问题描述】:

我遇到了一个问题,即 BitmapData.draw() 方法不能准确地从使用透明度的 .png 中减去图像数据。

我整理了一个显示此行为的测试文件,它位于此处: http://www.filedropper.com/shield_1

简而言之,一个精灵从屏幕顶部掉落,当它与屏幕底部的精灵相交时,掉落的精灵会取出底部的一部分精灵。我已经完成了所有这些工作,除了当我在精灵与底部精灵相交后重置精灵的 x 和 y 位置并再次与底部精灵相交时,它不会从精灵中取出相同大小的块底部。

如果我解释得不够好,我深表歉意。如果您花点时间看一下我发布的文件,那将是有意义的。

这里的代码需要库中的两个 png 文件,其 Linkage 值为 ShieldBase 和 SnowBall。

package 
{

 import flash.display.Sprite;
 import flash.display.Bitmap;
 import flash.display.BitmapData;
 import flash.display.BlendMode;
 import flash.geom.Point;
 import flash.geom.Matrix;
 import flash.geom.Rectangle;
 import flash.events.Event;

 public class Shield extends Sprite
 {

  public var baseBmpData:BitmapData = new ShieldBase(0,0);
  public var baseBmp:Bitmap = new Bitmap(baseBmpData);
  public var missileBitmapData:BitmapData = new SnowBall(0,0);
  public var missileBitmap:Bitmap = new Bitmap(missileBitmapData);

  public var missileMatrix:Matrix = new Matrix();

  public function Shield()
  {

   baseBmp.y = 300;
   baseBmp.x = 40;
   stage.addChild(baseBmp);

   missileBitmap.x = 85;
   missileBitmap.y = 0;
   stage.addChild(missileBitmap);

   stage.addEventListener(Event.ENTER_FRAME, dropFromSky);

  }

  public function dropFromSky(e:Event)
  {

   for (var i:int=0; i<10; i++)
   {

    if (baseBmpData.hitTest(new Point(baseBmp.x,baseBmp.y),0x00,new Point(missileBitmap.x,missileBitmap.y)))
    {

     missileBitmap.y++;

     missileMatrix = new Matrix();
     missileMatrix.translate(baseBmp.x,baseBmp.y);
     missileMatrix.tx = (missileBitmap.x - baseBmp.x);
     missileMatrix.ty = (missileBitmap.y - baseBmp.y);

     // public function draw(source:IBitmapDrawable, matrix:Matrix = null, colorTransform:flash.geom:ColorTransform = null, blendMode:String = null, clipRect:Rectangle = null, smoothing:Boolean = false):void
     baseBmpData.draw(missileBitmap, missileMatrix, null, BlendMode.ERASE, null, true);

     missileBitmap.x = rand(60, 140);
     missileBitmap.y = 0;
    }
    else
    {
     missileBitmap.y++;
    }

   }

  }

  public function rand(low:Number=0, high:Number=1):Number
  {
   return Math.floor(Math.random() * (1+high-low)) + low;
  }


 }

}

我认为问题在于 hitTest 和/或 BitmapData.draw() 没有按预期工作。

非常感谢,

德文

【问题讨论】:

    标签: actionscript-3 matrix flash-cs4 bitmapdata hittest


    【解决方案1】:

    有两个问题。

    1) 您测试碰撞的位置;如果您使用球的中心而不是左上角,那么它可以正常工作。

    2) 盾牌上的投影:
    发生的情况是阴影边缘几乎不可见的像素导致 hitTest 成功;我建议您从图像中删除阴影并使用 Flash 中的实际阴影滤镜应用它。 为了让它与阴影一起工作,我将hitTest 中的 alpha 阈值更改为 128 以便忽略投影的半透明像素。 您可以将阈值设置为 0,但在开始时球似乎没有击中时看起来很奇怪。

    改变这个:

    baseBmpData.hitTest(new Point(baseBmp.x,baseBmp.y),0x00,new Point(missileBitmap.x,missileBitmap.y))
    

    到这里:

    baseBmpData.hitTest(new Point(baseBmp.x,baseBmp.y),128,new Point(missileBitmap.x+missileBitmap.width*0.5,missileBitmap.y+missileBitmap.height*0.5))
    

    【讨论】:

      猜你喜欢
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      相关资源
      最近更新 更多