我在Embed& amp;中错过了什么?纹理创建代码?

时间:2017-02-16 16:46:46

标签: actionscript-3 embed embedded-resource

我正在尝试关注Hemanth Sharma的Starling视频教程。我已经按照他在第二个视频(linked here)上输入的代码输入了代码,但是我很难得到相同的结果。

首先,当我的代码与夏尔马先生相匹配并出现时:

var bitmap:Bitmap = new Assets[name]();
gameTextures[name] = Texture.fromBitmap( bitmap );

我使用此代码收到错误。错误表明我试图从非对象中实例化一个类。

我通过将其分解为步骤来跟踪代码过程。现在我的代码显示为:

trace( "Building for", name );
var classObj : Class = Assets[name];
trace( "Class", classObj );
var bitmap : Bitmap = new classObj() as Bitmap;
trace( "Bitmap", bitmap );
trace( "Assign value" );
Assets["gameTextures"][name] = Texture.fromBitmap( bitmap );
trace("Value assigned" );

使用此代码,我能够看到我与Sharma先生的代码出错的原因是Sharma先生使用classObj访问的Assets[name]初始化为{{1 }}

先生。 Sharma没有构造函数来设置静态变量的值,因此我假设Embed元标记与此字段的值赋值有关。

我将从该文件中复制我的代码并将其粘贴到下面。

  1. 有没有人知道我在哪里犯错?

  2. 任何人都可以解释一下Embed元标记是如何工作的,这样我就可以找到比现在更多技能的错误吗?

  3. Assets.as:

    null

2 个答案:

答案 0 :(得分:1)

您也可以尝试..立即诊断错误。

public static function getTexture(name:String):Texture
{
    if (!Assets.gameTextures[name])
    {
        try
        {
            var aClass:Class = Assets[name];
            var aRaster:Bitmap = new aClass();
            Assets.gameTextures[name] = Texture.fromBitmap(aRaster);
        }
        catch (fail:Error)
        {
            throw "There's no texture <" + name + "> in Assets.";
        }
    }

    return Assets.gameTextures[name];
}

答案 1 :(得分:0)

我目前正在开发一款游戏并拥有与您类似的设置,这是我成功使用的代码:

EmbeddedAssets.as(在名为utils的文件夹中):

package utils
{
    import starling.textures.Texture;

    public class EmbeddedAssets
    {
        [Embed(source = "./../assets/icons/stats.png")]
        private static const stats:Class;
        public static const statsButtonTexture:Texture = Texture.fromEmbeddedAsset(stats);

        Embed(source = "./../assets/icons/stats_down.png")]
        private static const stats_down:Class;
        public static const statsButtonDownTexture:Texture = Texture.fromEmbeddedAsset(stats_down);

    }
}

然后,在我的代码中的其他地方,我使用这些引用如下:

private function setStatsButtonStyles(button:Button):void
{
    var defaultICon:ImageLoader = new ImageLoader();
    defaultIcon.source = EmbeddedAssets.statsButtonTexture;
    defaultIcon.width = 60;
    defaultIcon.height = 60;

    var downIcon:ImageLoader = new ImageLoader();
    downIcon.source = EmbeddedAssets.statsButtonDownTexture;
    downIcon.width = 60;
    downIcon.height = 60;

    button.defaultIcon = defaultIcon;
    button.downIcon = downIcon;
    button.width = button.height = 60;
}

请注意,我使用的是Feathers UI按钮,而不是Starling按钮(Feathers按钮具有更多功能,但想法是相同的)。