对现有 movieclip/shape 使用 beginBitmapFill? (动画 CC)
Use beginBitmapFill with existing movieclip/shape? (Animate CC)
所有使用 beginBitmapFill 的教程似乎都以动态绘制对象为中心。是否可以简单地将位图填充应用于动画片段内的现有形状?我知道我可以通过选择形状并在“颜色”面板中选择位图来手动执行此操作。但是可以用代码来完成吗?这就是我正在尝试的,它没有给出错误,但它也不起作用:
grl.tops.shapes.graphics.beginBitmapFill(new cubepattern(), null, true, false);
正如其他人评论的那样,您可以分别使用 readGraphicsData 和 drawGraphicsData。它甚至并不过分复杂。只需循环遍历所需形状的 IGraphicsData,在找到 GraphicsBitmapFill class 的实例后立即停止,使用另一个 BitmapFill 创建一个新实例,最后将更改应用到原始形状。
好吧,一图胜千言。
这是一个例子。这可能看起来有点长,但只有一大堆代码来准备形状和加载图像以用作位图填充。
关注 process() 函数。
package
{
import flash.display.Sprite;
import flash.display.Shape;
import flash.display.Graphics;
import flash.display.Loader
import flash.display.LoaderInfo;
import flash.display.IGraphicsData;
import flash.display.GraphicsBitmapFill;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.Event;
import flash.net.URLRequest;
import flash.utils.getQualifiedClassName;
public class Main extends Sprite
{
private var bitmapData1:BitmapData;
private var bitmapData2:BitmapData;
private var masterSprite:Sprite = new Sprite();
private var texturesLoaded:int = 0;
private var loader:Loader = new Loader();
public function Main():void
{
if (stage)
init();
else
addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
loader.load(new URLRequest("textureA.jpg"));
addChild(masterSprite);
masterSprite.x = masterSprite.y = 200;
}
private function onComplete(event:Event):void
{
switch (texturesLoaded)
{
case 0:
bitmapData1 = Bitmap(LoaderInfo(event.target).content).bitmapData;
loader.load(new URLRequest("textureB.jpg"));
break;
case 1:
bitmapData2 = Bitmap(LoaderInfo(event.target).content).bitmapData;
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onComplete);
drawStar();
process();
}
texturesLoaded++;
}
private function process():void
{
var tempShape:Shape = Shape(masterSprite.getChildAt(0));
var graphicsData:Vector.<IGraphicsData> = tempShape.graphics.readGraphicsData();
for (var a:int = 0; a < graphicsData.length; a++)
{
if (getQualifiedClassName(graphicsData[a]) == "flash.display::GraphicsBitmapFill")
{
var bitmapFill:GraphicsBitmapFill = new GraphicsBitmapFill(bitmapData2);
graphicsData[a] = bitmapFill; break;
}
}
tempShape.graphics.drawGraphicsData(graphicsData);
}
private function drawStar():void
{
var angles:Array = new Array(0, 36, 72, 108, 144, 180, 216, 252, 288, 324, 360);
var innerRadius:int = 40;
var outerRadius:int = 80;
var shape:Shape = new Shape();
shape.graphics.beginBitmapFill(bitmapData1);
shape.graphics.moveTo(0 + Math.cos(angles[a] * (Math.PI / 180)) * outerRadius, 0 + Math.sin(angles[a] * (Math.PI / 180)) * outerRadius);
for (var a:int = 0; a < angles.length; a++)
{
angles[a] -= 90;
if (a % 2 == 0)
{
shape.graphics.lineTo(0 + Math.cos(angles[a] * (Math.PI / 180)) * outerRadius, 0 + Math.sin(angles[a] * (Math.PI / 180)) * outerRadius);
}
else
{
shape.graphics.lineTo(0 + Math.cos(angles[a] * (Math.PI / 180)) * innerRadius, 0 + Math.sin(angles[a] * (Math.PI / 180)) * innerRadius);
}
}
shape.graphics.endFill();
masterSprite.addChild(shape);
}
}
}
所有使用 beginBitmapFill 的教程似乎都以动态绘制对象为中心。是否可以简单地将位图填充应用于动画片段内的现有形状?我知道我可以通过选择形状并在“颜色”面板中选择位图来手动执行此操作。但是可以用代码来完成吗?这就是我正在尝试的,它没有给出错误,但它也不起作用:
grl.tops.shapes.graphics.beginBitmapFill(new cubepattern(), null, true, false);
正如其他人评论的那样,您可以分别使用 readGraphicsData 和 drawGraphicsData。它甚至并不过分复杂。只需循环遍历所需形状的 IGraphicsData,在找到 GraphicsBitmapFill class 的实例后立即停止,使用另一个 BitmapFill 创建一个新实例,最后将更改应用到原始形状。
好吧,一图胜千言。 这是一个例子。这可能看起来有点长,但只有一大堆代码来准备形状和加载图像以用作位图填充。
关注 process() 函数。
package
{
import flash.display.Sprite;
import flash.display.Shape;
import flash.display.Graphics;
import flash.display.Loader
import flash.display.LoaderInfo;
import flash.display.IGraphicsData;
import flash.display.GraphicsBitmapFill;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.Event;
import flash.net.URLRequest;
import flash.utils.getQualifiedClassName;
public class Main extends Sprite
{
private var bitmapData1:BitmapData;
private var bitmapData2:BitmapData;
private var masterSprite:Sprite = new Sprite();
private var texturesLoaded:int = 0;
private var loader:Loader = new Loader();
public function Main():void
{
if (stage)
init();
else
addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
loader.load(new URLRequest("textureA.jpg"));
addChild(masterSprite);
masterSprite.x = masterSprite.y = 200;
}
private function onComplete(event:Event):void
{
switch (texturesLoaded)
{
case 0:
bitmapData1 = Bitmap(LoaderInfo(event.target).content).bitmapData;
loader.load(new URLRequest("textureB.jpg"));
break;
case 1:
bitmapData2 = Bitmap(LoaderInfo(event.target).content).bitmapData;
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onComplete);
drawStar();
process();
}
texturesLoaded++;
}
private function process():void
{
var tempShape:Shape = Shape(masterSprite.getChildAt(0));
var graphicsData:Vector.<IGraphicsData> = tempShape.graphics.readGraphicsData();
for (var a:int = 0; a < graphicsData.length; a++)
{
if (getQualifiedClassName(graphicsData[a]) == "flash.display::GraphicsBitmapFill")
{
var bitmapFill:GraphicsBitmapFill = new GraphicsBitmapFill(bitmapData2);
graphicsData[a] = bitmapFill; break;
}
}
tempShape.graphics.drawGraphicsData(graphicsData);
}
private function drawStar():void
{
var angles:Array = new Array(0, 36, 72, 108, 144, 180, 216, 252, 288, 324, 360);
var innerRadius:int = 40;
var outerRadius:int = 80;
var shape:Shape = new Shape();
shape.graphics.beginBitmapFill(bitmapData1);
shape.graphics.moveTo(0 + Math.cos(angles[a] * (Math.PI / 180)) * outerRadius, 0 + Math.sin(angles[a] * (Math.PI / 180)) * outerRadius);
for (var a:int = 0; a < angles.length; a++)
{
angles[a] -= 90;
if (a % 2 == 0)
{
shape.graphics.lineTo(0 + Math.cos(angles[a] * (Math.PI / 180)) * outerRadius, 0 + Math.sin(angles[a] * (Math.PI / 180)) * outerRadius);
}
else
{
shape.graphics.lineTo(0 + Math.cos(angles[a] * (Math.PI / 180)) * innerRadius, 0 + Math.sin(angles[a] * (Math.PI / 180)) * innerRadius);
}
}
shape.graphics.endFill();
masterSprite.addChild(shape);
}
}
}