13

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

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

Resource.as 类文件:

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();

在创建非常庞大的应用程序时,必须有更好的方法来处理资源吗?想象一下,我需要数千张图像,这个系统根本不适合。

4

12 回答 12

16

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

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

  2. 将 zip 文件嵌入为二进制数据:

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

  3. 使用FZip访问资源

如果您选择涉及加载外部文件的其他方法,请注意某些 Flash 游戏网站要求将其托管的游戏包含在单个 swf 文件中。

于 2009-06-28T21:53:14.773 回答
6

代替

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

采用

myImage.source = Resource.SHIPS_1;

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

阿德里安

于 2009-06-27T20:36:46.063 回答
5

这确实是 Flash CS4 的用途。不过,您的方式对我来说似乎很好-尽管即使它是常量,我也不会将所有大写字母用于类名。只需低下头并复制粘贴!

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

于 2009-06-27T22:33:56.153 回答
2

这是旧的,但因为我偶然发现它寻找不同的东西,所以我会在这里为后代写:)

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

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

于 2011-10-19T16:16:30.003 回答
2

我刚刚看了这个关于 Starling 框架的精彩教程: http ://www.hsharma.com/tutorials/starting-with-starling-ep-3-sprite-sheets/

听起来 spritesheet 正是您要寻找的:您将所有单独的纹理捆绑到一个称为 spritesheet 的大纹理中,并创建一个 xml 文件,其中包含纹理在 spritesheet 中的位置信息。为此,您可以使用此工具: http: //www.codeandweb.com/texturepacker

我不确定您是否可以将它用于商业项目,并且您所说的纹理数量听起来不像您只是出于爱好,因此您可能需要检查许可证。还有一个专业版可用。

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;
    }

现在您可以通过调用访问 spritesheet 的所有纹理

YourClass.getAtlas().getTexture("name");

这简直太棒了。当您使用 texturepacker 时,捆绑到 spritesheet 中的每个精灵的文件名将成为其纹理名。

这可能为时已晚,无法帮助您,但我希望未来的访问者可以从这个优雅的解决方案中受益。

我想强调一下,这个答案基本上是 sharma 教程的摘录。我什至可以随意复制他在截屏视频中使用的代码。所有的功劳都归于他

于 2012-10-13T14:24:20.490 回答
1

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

于 2011-06-11T18:15:12.480 回答
1
package
{
    public final class Resource
    {
        [Embed (source="/assets/ships/1.gif" )]
        public static const SHIPS_1:Class;
    }
}
于 2012-02-20T05:06:39.873 回答
0
[Embed (source="/assets/ships/1.gif" )]
    public static const SHIPS_1:Class;
于 2012-03-05T12:53:34.753 回答
0

我喜欢这样做我的图书馆课程。

我为单身人士获取了 GSkinners 代码:http: //gskinner.com/blog/archives/2006/07/as3_singletons.html

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 {}
于 2012-03-29T14:49:36.480 回答
0

[嵌入 (source="/assets/images/123.png" )] public static const className:Class;

于 2012-04-02T07:35:30.300 回答
0

好主意,lhk

这是一个不错的解决方案,例如带有 vtf 和 vmt vtf = image vmt = script 的 Source-Engine(如 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 不存在的地方出现错误,而不是再次发生:)

[嵌入(source=".​​./assets/editors/error_texture.png")] public static const ERROR_TEX:Class; ...

我怎么知道,因为 Actionscript 3 应该“读取”到 jsBirdge 或 ExternalInterface.call() 等 javascript;

是否可以?

于 2012-11-20T21:40:11.580 回答
-1

更好的方法 http://itfailed.blogspot.com/2011/02/howt-o-embed-images-in-actionscript-3.html

于 2011-02-06T19:27:24.647 回答