Actionscript 3 是否将beginBitmapFill与现有movieclip/shape一起使用?(制作CC动画)

Actionscript 3 是否将beginBitmapFill与现有movieclip/shape一起使用?(制作CC动画),actionscript-3,graphics,adobe-animate,Actionscript 3,Graphics,Adobe Animate,所有使用beginBitmapFill的教程似乎都以动态绘制对象为中心。是否可以简单地将位图填充应用于movieclip中的现有形状?我知道我可以通过在颜色面板中选择形状和位图手动完成此操作。。但是有可能用代码来实现吗?这就是我正在尝试的,它没有给出错误,但也不起作用: grl.tops.shapes.graphics.beginBitmapFill(new cubepattern(), null, true, false); 正如其他人所评论的,您可以分别使用readGraphicsData

所有使用beginBitmapFill的教程似乎都以动态绘制对象为中心。是否可以简单地将位图填充应用于movieclip中的现有形状?我知道我可以通过在颜色面板中选择形状和位图手动完成此操作。。但是有可能用代码来实现吗?这就是我正在尝试的,它没有给出错误,但也不起作用:

grl.tops.shapes.graphics.beginBitmapFill(new cubepattern(), null, true, false);

正如其他人所评论的,您可以分别使用readGraphicsData和drawGraphicsData。它甚至不太复杂。只需循环浏览所需形状的IGraphicsData,找到GraphicsBitmapFill类的实例后立即停止,使用另一个BitmapFill创建一个新实例,最后将更改应用于原始形状

一幅画抵得上千言万语。 这里有一个例子。这可能看起来有点长,但是有很多代码准备一个形状并加载图像以用作位图填充

将注意力放在进程()函数上

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);
        }
    }
}
包
{
导入flash.display.Sprite;
导入flash.display.Shape;
导入flash.display.Graphics;
导入flash.display.Loader
导入flash.display.LoaderInfo;
导入flash.display.IGraphicsData;
导入flash.display.GraphicsBitmapFill;
导入flash.display.Bitmap;
导入flash.display.BitmapData;
导入flash.events.Event;
导入flash.net.URLRequest;
导入flash.utils.getQualifiedClassName;
公共类Main扩展了Sprite
{
私有变量bitmapData1:BitmapData;
私有变量bitmapData2:BitmapData;
private var masterSprite:Sprite=new Sprite();
私有变量TextureLoaded:int=0;
私有变量加载器:加载器=新加载器();
公共函数Main():void
{
如果(阶段)
init();
其他的
addEventListener(Event.ADDED_TO_STAGE,init);
}
私有函数init(e:Event=null):void
{
removeEventListener(Event.ADDED_TO_STAGE,init);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);
loader.load(新的URLRequest(“textureA.jpg”);
addChild(masterSprite);
masterSprite.x=masterSprite.y=200;
}
完成私有函数(事件:事件):无效
{
开关(纹理加载)
{
案例0:
bitmapData1=位图(LoaderInfo(event.target).content).bitmapData;
loader.load(新的URLRequest(“textureB.jpg”);
打破
案例1:
bitmapData2=位图(LoaderInfo(event.target).content).bitmapData;
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,onComplete);
drawStar();
过程();
}
texturesLoaded++;
}
私有函数进程():void
{
var tempShape:Shape=Shape(masterSprite.getChildAt(0));
var graphicsData:Vector.=tempShape.graphics.readGraphicsData();
for(变量a:int=0;a
正如其他人所评论的,您可以分别使用readGraphicsData和drawGraphicsData。它甚至不太复杂。只需循环浏览所需形状的IGraphicsData,找到GraphicsBitmapFill类的实例后立即停止,使用另一个BitmapFill创建一个新实例,最后将更改应用于原始形状

一幅画抵得上千言万语。 这里有一个例子。这可能看起来有点长,但是有很多代码准备一个形状并加载图像以用作位图填充

将注意力放在进程()函数上

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);
        }
    }
}
包
{
导入flash.display.Sprite;
导入flash.display.Shape;
导入flash.display.Graphics;
导入flash.display.Loader
导入flash.display.LoaderInfo;
导入flash.display.IGraphicsData;
导入flash.display.GraphicsBitmapFill;
导入flash.display.Bitmap;
导入flash.display.BitmapData;
导入flash.events.Event;
导入flash.net.URLRequest;
导入flash.utils.getQualifiedClassName;
公共类Main扩展了Sprite
{
私有变量bitmapData1:BitmapData;
私有变量bitmapData2:BitmapData;