Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 如何以正确的方式在Actionscript 3/Flex 3中嵌入图像?_Actionscript 3_Image_Flex3_Resources_Embedded Resource - Fatal编程技术网

Actionscript 3 如何以正确的方式在Actionscript 3/Flex 3中嵌入图像?

Actionscript 3 如何以正确的方式在Actionscript 3/Flex 3中嵌入图像?,actionscript-3,image,flex3,resources,embedded-resource,Actionscript 3,Image,Flex3,Resources,Embedded Resource,我正在创建一个游戏,其中Actionscript/Flex3(Flash)中使用了大量图像。现在我已经到了设计阶段,我必须找到一种使用嵌入图像的结构化方法(必须通过旋转、颜色等进行操作) 不幸的是,经过一点调查,看起来您必须手动嵌入图像才能使用它们。我目前有如下设置: Resource.as类文件: package { public final class Resource { [Embed (source="/assets/ships/1.gif" )]

我正在创建一个游戏,其中Actionscript/Flex3(Flash)中使用了大量图像。现在我已经到了设计阶段,我必须找到一种使用嵌入图像的结构化方法(必须通过旋转、颜色等进行操作)

不幸的是,经过一点调查,看起来您必须手动嵌入图像才能使用它们。我目前有如下设置:

Resource.as类文件:

package
{
    public final class Resource
    {
        [Embed (source="/assets/ships/1.gif" )]
        public static const SHIPS_1:Class;
    }
}
package
{
    public final class Resource
    {
        [Embed (source="/assets/ships/1.gif" )]
        public static const SHIPS_1:Class;
    }
}
因此,就一艘船而言,我必须:

将图像放入具有正确名称的正确文件夹中 在Resource.as文件中以相同的方式命名 在Resource.as文件中创建同名常量

即使这一切都可以通过简单地将文件放在指定的文件夹中实现

更糟糕的是,我还是要用以下方式来称呼它:

var test:Bitmap = new Resource.SHIPS_1();
在创建非常庞大的应用程序时,必须有更好的方法来处理资源?假设我需要数千张图像,这个系统根本不适合。

而不是

var test:Bitmap = new Resource.SHIPS_1();
使用

嵌入是正确的你使用它的方式是错误的:)


Adrian这才是Flash CS4真正的用途。尽管我不会对类名使用所有的大写字母,即使它是一个常量。只要把你的头放下来,得到复制粘贴


或者,您可以在运行时加载文件。

如果您需要处理大量资源,可以按照以下3个步骤操作:

  • 将它们放在未压缩的zip存档中

  • 将zip文件作为二进制数据嵌入:

    [嵌入(源='resources.zip',mimeType='application/octet stream')]

  • 使用

  • 如果您选择了一种包含加载外部文件的不同方法,请注意,某些flash游戏网站要求其托管的游戏包含在单个swf文件中。

    更好的方法

    这取决于您的单个图像有多大,但您可以将它们像精灵纸一样放在一张图像中。如果您想绘制一艘特定的飞船,请在该飞船的图像中使用正确的xy偏移量,并使用copyPixels将其绘制到位图中。

    这是很旧的,但由于我在搜索不同的东西时偶然发现了它,我将在这里为后代写下:)

    我使用不同的方法。我用FlashProfessional创建了一部swf电影,导入其中的所有图形,然后将它们全部标记为“ExportforActionScript”。 编译swf,在主项目中只嵌入swf并通过它访问所有图形


    我发现这种方法更有条理。既然可以通过正确导入文件来实现,为什么还要编写整个资源类呢?;)

    我喜欢这样上图书馆课

    我将GSkinners代码用于singleton:

    [Embed(source=“/assets/images/123.png”)]
    publicstaticconst类名称:Class

    我刚刚观看了关于Starling框架的精彩教程:

    听起来精灵表正是你想要的: 将所有单个纹理捆绑到一个称为“精灵表”的大纹理中,并创建一个xml文件,其中包含纹理在精灵表中的位置信息。为此,您可以使用此工具:

    我不确定你是否可以在商业项目中使用它,而且你所说的纹理数量听起来不像你只是一个爱好,所以你可能想检查一下许可证。也有一个专业版

    Texturepacker创建两个文件:spritesheet.png和spritesheet.xml。您只需将它们复制到您的项目中。 然后将此代码添加到一个类中

        private static var gameTextureAtlas:TextureAtlas;
    
        [Embed(source="../media/graphics/mySpriteSheet.png")]
        public static const AtlasTextureGame:Class;
    
        [Embed(source="../media/graphics/mySpritesheet.xml", mimeType="application/octet-stream")]
        public static const AtlasXmlGame:Class;
    
        public static function getAtlas():TextureAtlas
        {
            if(gameTextureAtlas==null)
            {
                var texture:Texture=getTexture("AtlasTextureGame");
                var xml:XML=XML(new AtlasXmlGame());
                gameTextureAtlas=new TextureAtlas(texture,xml);
            }
            return gameTextureAtlas;
        }
    
    现在,您可以通过调用

    YourClass.getAtlas().getTexture("name");
    
    简直太棒了。使用TexturePack时,捆绑到精灵表中的每个精灵的文件名都将成为其texturename

    这对您来说可能太晚了,但我希望未来的访问者能够从这个优雅的解决方案中获益

    我想强调的是,这个答案基本上是从莎玛的教程中摘录的。我甚至可以自由地复制他在屏幕上使用的代码。所有的功劳都归于他好主意,lhk

    这是一个很好的解决方案,就像带有vtf和vmt的源引擎一样 vtf=图像 vmt=脚本(如xml或javascript)

    很好,我想建议使用TexturePacker、TexturePath或TextureTarget:p

    谢谢你的小费

    例如: mytexture.js:

    xml或javascript:

    函数mytexture(){basedir=“/assets/mytexture.png”,normalmap= “/assets/mytexture_bump.png”,normalcube)[1,1,1]}

    我不认为因为默认纹理在mytexture.png不存在的地方出错,所以它会再次发生:)

    [Embed(source=“../assets/editors/error\u texture.png”)]公共静态 常量错误\u TEX:Class

    我怎么知道,因为ActionScript3应该“读取”像jsBirdge或ExternalInterface.call()这样的javascript


    有可能吗?

    但是这种嵌入方式会带来很多麻烦。难道没有更好的方法吗?编辑:当资源还没有定义时,Resource.SHIPS\u 1怎么可能是正确的?1。Resource.u 1必须在前面定义。2.没有别的办法了。。除了嵌入css文件,但更糟糕的是:(你不需要实例化资源,你将SHIPS_1定义为一个静态常量,所以你只需要像adrian指出的那样使用它作为源代码。你对游戏开发一无所知,但你真的需要嵌入成千上万的图像吗?看起来swf在运行时加载文件时会得到相当大的+1。否则,你可能会一个比你真正需要的更大的SWF。你是说我应该从Web服务器加载它们吗?这样做的(大)缺点是每个人都可以下载我所有的图形内容。每个人(拥有正确的工具和知识)都可以下载你的内容,“下载来显示你的方式。”
    package
    {
        import flash.display.Bitmap;
        import flash.display.BitmapData;
    
        public class Lib
        {
            /*
            Make this an Singleton, so you only load all the images only Once 
            */
    
            private static var instance:Lib;
            public static function getInstance():Lib {
                if (instance == null) {
                    instance = new Lib(new SingletonBlocker());
                }
                return instance;
            }
            public function Lib(p_key:SingletonBlocker):void {
                // this shouldn't be necessary unless they fake out the compiler:
                if (p_key == null) {
                    throw new Error("Error: Instantiation failed: Use Singleton.getInstance() instead of new.");
                }
            }
    
            /*
            The actual embedding 
            */
            [Embed(source="assets/images/someImage.png")]
            private var ImageClass:Class;
            private var _imageClass:Bitmap = new ImageClass() as Bitmap;
    
            [Embed(source="assets/images/someOtherImage.png")]
            private var OtherImageClass:Class;
            private var _otherImageClass:Bitmap = new ImageClass() as Bitmap;
    
            public function get imgClass():Bitmap{
                return _imageClass;
            }
            public function get imgClassData():BitmapData{
                return _imageClass.BitmapData;
            }
    
            public function get otherImageClass():Bitmap{
                return _otherImageClass;
            }
            public function get otherImageClassData():BitmapData{
                return _otherImageClass.BitmapData;
            }
        }
    }
    internal class SingletonBlocker {}
    
        private static var gameTextureAtlas:TextureAtlas;
    
        [Embed(source="../media/graphics/mySpriteSheet.png")]
        public static const AtlasTextureGame:Class;
    
        [Embed(source="../media/graphics/mySpritesheet.xml", mimeType="application/octet-stream")]
        public static const AtlasXmlGame:Class;
    
        public static function getAtlas():TextureAtlas
        {
            if(gameTextureAtlas==null)
            {
                var texture:Texture=getTexture("AtlasTextureGame");
                var xml:XML=XML(new AtlasXmlGame());
                gameTextureAtlas=new TextureAtlas(texture,xml);
            }
            return gameTextureAtlas;
        }
    
    YourClass.getAtlas().getTexture("name");