【问题标题】:How to get transparency to work on a bitmap in Actionscript如何获得透明度以在 Actionscript 中处理位图
【发布时间】:2011-08-11 14:55:32
【问题描述】:

对于一个班级项目,我正在制作“Pissed Off Pigs”(我想你明白了,猪会报仇,别担心,我不会发布它!)我想创建用位图填充的圆圈(圆圈是因为碰撞数学更容易)。这是它们现在的样子。

当然,白色是问题所在。下面是我的“猪”课。有任何想法吗?我尝试过 gif、png、8 位 png 等,但似乎没有什么区别。图像本身是 20px 正方形,圆的半径是 10px(所以直径是 20px)。这是我正在使用的图像:

而且我知道我可能应该在类之外加载图像,并在创建新猪时传递 BitmapData,这样我就不必每次创建新猪时都加载图像,但现在它可以工作了! (有点)。

矩阵是翻译问题吗?

哦,我检查了 bmpImage.transparent 并且它返回 true(即使我没有在构造函数中指定 true)。

` 包裹 { 导入 flash.display.; 导入 flash.net。; 导入 flash.events.; 导入 flash.geom。; 导入 flash.display.BitmapDataChannel;

public class pig extends Sprite {
    public var radius:uint;
    public var velocity:Vec2;
    public var tt:Sprite;
    public var pigLoader:Loader;
    public var bmpImage:BitmapData;
    public var framesAlive:uint;


    public function pig(xx:uint, yy:uint, radius:uint, vx:Number, vy:Number, sprite:String){
        this.x = xx;
        this.y = yy;
        this.radius = radius;

        this.velocity = new Vec2(vx, vy);

        pigLoader = new Loader();
        pigLoader.load(new URLRequest(sprite));
        pigLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, picLoaded);

    }
    private function picLoaded(event:Event):void {
        bmpImage = new BitmapData(pigLoader.width, pigLoader.height, true);
        bmpImage.draw(pigLoader);
        tt = new Sprite();
        var matrix:Matrix;
        matrix = new Matrix();
        matrix.translate( -10, -10);
        tt.graphics.beginBitmapFill(bmpImage, matrix, false, false);
        tt.graphics.drawCircle(0, 0, this.radius)
        tt.graphics.endFill();
        this.addChild(tt);
    }
}

}

`

【问题讨论】:

    标签: flash actionscript-3 bitmap transparency bitmapdata


    【解决方案1】:

    为了在您的 bitmapData 画布中拥有功能性 Alpha 通道,您需要在绘制之前为 BitmapData 对象的 fillColor 属性的 32 位十六进制值 (0x00FFFFFF) 设置零 Alpha。

    package
    {
    //Imports
    import flash.display.Sprite;
    import flash.display.Shape;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    
    //SWF Metadata Tag
    [SWF(width = "1000", height = "500", frameRate = "30", backgroundColor = "#000000")]
    
    //Class
    public class Test extends Sprite
        {
        //Constructor
        public function Test()
            {       
            var sh:Shape = new Shape();
            sh.graphics.beginFill(0xFF0000, 1.0);
            sh.graphics.lineTo(200, 200);
            sh.graphics.lineTo(0, 200);
            sh.graphics.lineTo(0, 0);
            sh.graphics.endFill();
    
            var shBitmapData:BitmapData = new BitmapData(sh.width, sh.height, true, 0x00FFFFFF); //32-bit Hex Value
            shBitmapData.draw(sh);
    
            addChild(new Bitmap(shBitmapData));
            }
        }
    }
    

    将其替换为默认值0xFFFFFFFF 以查看差异。

    【讨论】:

      【解决方案2】:

      你把问题复杂化了。当您想用平铺图案填充大面积区域时,通常使用位图填充,并且图案来自位图(想想壁纸),您不需要在这里使用它。您应该做的是使用 Loader.content 位图。您不需要 draw() 或矩阵,只需使用 .x 和 .y 移动以 Sprite 的 (0,0) 点为中心的猪位图,如果那是您用于碰撞检测的圆的中心。

      没有理由让您的猪精灵有一个视觉圆圈,以便您使用基于圆圈的碰撞检测。视觉表示对您的碰撞检测根本不重要。基于圆的碰撞检测通常只是毕达哥拉斯距离公式的应用,即如果中心之间的距离小于(或等于)被测圆的半径之和,则存在重叠(碰撞)。

      如果你用这个替换最后一个函数会怎样:

      private function picLoaded(event:Event):void
      {
          var pigPic:Bitmap = event.target.loader.content;
          pigPic.x -= 10;
          pigPic.y -= 10;
          this.addChild(pigPic);
      }
      

      【讨论】:

      • 感谢您添加代码!我看到了第一个版本,并尝试了我能想到的一切。我一直在尝试类似: var pigPic:Bitmap = pigLoader.content;但我得到了“隐式强制”错误。认为 pigLoader 是一个公共变量,所以我可以从任何地方访问它,但显然它不是参考。
      • 你认为我应该为每头猪使用这样的装载机吗?我不应该把那部分拿出来,然后将“pigLoader.content”作为参数传递给猪的构造函数吗?
      • 我个人不会像您那样为每个猪实例加载一个新实例。我要做的是一次从网络加载 GIF,然后在加载器的完整处理程序中保存对 BitmapData (loader.content.bitmapData) 的引用。您可以执行此操作,只要您在提供图像的服务器上拥有正确的 crossdomain.xml 策略文件以授予您访问位图数据的权限。然后,当您构造每个猪精灵时,将 bitmapdata 引用传递给它,并在内部执行一个新的 Bitmap(bitmapdata) 来创建您作为孩子附加的 Bitmap 显示对象。
      • 您不需要将GIF的加载移动到类之外,您可以将对bitmapData的引用设为猪类静态变量。第一次创建 pig 实例时,您将启动文件加载。您创建的每个后续猪都使用已加载的数据。只有你创建的第一头猪会创建一个加载器,但在这之后的任何时候,在它们完成构建之前可能仍然需要等待加载(即等待静态引用变为非空)。或者(更简单)在 pig 类之外加载文件,等待它加载,然后将其传递给 pig 构造函数。
      • P.S.你得到了隐式强制错误,因为编译器能够在编译时 typeCheck pigLoader.content (它知道它是一个 DisplayObject,但不是特别是一个位图)。我写的代码跳过了这一点,因为 event.target 是一个通用的动态对象,不能在编译时进行类型检查。但你可以这样做: var pigPic:Bitmap = pigLoader.content as Bitmap;强制转换让编译器清楚你的期望。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      相关资源
      最近更新 更多