【问题标题】:ActionScript 3 BitmapData 的方法未实现。我如何访问它的方法?
【发布时间】:2021-09-04 01:44:42
【问题描述】:

最终,我要做的是对我在运行时加载的一些位图应用伽马校正。我能够创建一个BitmapData 对象,然后从BitmapData 创建一个Bitmap,并且我能够使用addChildBitmap 添加到舞台。到目前为止,一切都很好。但是,如果我尝试以任何方式更改 BitmapData(在创建 Bitmap 之前或之后),我会收到如下警告:

Warning: The method BitmapData::fillRect() is not implemented
Warning: The method BitmapData::paletteMap() is not implemented
Warning: The method BitmapData::clone() is not implemented

为了尽可能简化事情,让我们尝试在https://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#paletteMap()运行示例代码

我创建了一个空白的 ActionScript 3 文档,按 F9 键,然后将此代码复制并粘贴到时间线的 Layer_1:第 1 帧上:

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.geom.Point;

var myBitmapData:BitmapData = new BitmapData(80, 80, false, 0x00FF0000);
myBitmapData.fillRect(new Rectangle(20, 20, 40, 40), 0x0000FF00);

var redArray:Array = new Array(256);
var greenArray:Array = new Array(256);

for(var i:uint = 0; i < 255; i++) {
    redArray[i] = 0x00000000;
    greenArray[i] = 0x00000000;
}

redArray[0xFF] = 0x0000FF00;
greenArray[0xFF] = 0x00FF0000;

var bottomHalf:Rectangle = new Rectangle(0, 0, 100, 40);
var pt:Point = new Point(0, 0);
myBitmapData.paletteMap(myBitmapData, bottomHalf, pt, redArray, greenArray);

var bm1:Bitmap = new Bitmap(myBitmapData);
addChild(bm1);

这些都是直接从示例中复制而来的。当我尝试运行它时,日志告诉我 fillRectpaletteMap 没有实现。我在 Animate 19 和 Flash Pro CS6 中进行了尝试,在这两个地方都获得了相同的结果。

知道我做错了什么吗?为什么BitmapData的方法没有实现,如何实现?

【问题讨论】:

  • 好的,我将此代码示例复制粘贴到我的 CS6 中的空白 AS3 源代码中,它就可以正常工作(有一个小的红绿色彩色方块)。您可能应该引用完整的错误消息(带有 # 错误号)。在这一点上,我唯一的疯狂想法是 Flash EOL 会以某种方式影响您的结果。
  • 感谢您查看@Organis 当您告诉我它对您有用时,我认为我尝试运行/测试文件的方式一定有问题。我一直在 Animate 中使用 Scaleform Launcher。我下载了 Flash Player 内容调试器,并用它测试了我发布的文件,一切似乎都在工作。不过,为了将来参考,是否有更好的方法来测试我的文件和/或获取完整的错误号? Scaleform Launcher 没有提供太多调试信息。

标签: actionscript-3 flash actionscript


【解决方案1】:

问题出在我用来测试电影的 Scaleform 启动器上。不要使用 Scaleform Launcher 进行测试,而是转到 Control > Test。那里的一切似乎都运行良好。

很遗憾,如果您依赖 Scaleform 集成从游戏引擎内部与 Flash 进行交互,您将无法从 Flash 内部修改位图。 Scaleform 似乎遗漏了bitmapData 方法背后的所有代码。

而且我认为任何人都不太可能再次需要对 Flash 中的位图进行伽马校正,但以防万一,您可以这样做:

import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.geom.Point;

var bitmapData:BitmapData = new BeforeColorCorrection();

var rectangle:Rectangle = new Rectangle(0, 0, bitmapData.width, bitmapData.height);
var point:Point = new Point(0, 0);
var redGamma:Array = new Array(256);
var greenGamma:Array = new Array(256);
var blueGamma:Array = new Array(256);
var gamma:Number = 2.0;

var corrected:Number;
var i:int

for(i = 0; i <= 255; i++)
{
    corrected = 255 * Math.pow((i / 255.0), (1.0 / gamma));

    redGamma[i] = uint(corrected) << 16;
    greenGamma[i] = uint(corrected) << 8;
    blueGamma[i] = uint(corrected);
}

bitmapData.paletteMap(bitmapData, rectangle, point, redGamma, greenGamma, blueGamma);

var bitmap:Bitmap = new Bitmap(bitmapData);

addChild(bitmap);

BeforeColorCorrection 是我库中的一张图片,勾选了“Export for ActionScript”。如果 Scaleform 有效,我会在游戏过程中替换该图像并运行一个函数以通过伽马校正使其变亮。

【讨论】:

  • 也许不在 Flash(浏览器)中,但 AS3 本身仍然可以编译成原生应用。
猜你喜欢
  • 2019-03-05
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多