无论我做什么,图像仍然为空

Image remains null no matter what I do

我正在处理一个 Action Script 项目,但无论我做什么我都无法从 Atlas 中获取纹理,最后我不得不做一些我不愿保留的快速更改。有谁知道为什么我无法通过 createDiabloCrashArt 方法获取纹理:

package gameObjects
{
    import starling.core.Starling;
    import starling.display.Image;
    import starling.display.MovieClip;
    import starling.display.Sprite;
    import starling.events.Event;
    import starling.utils.deg2rad;

    public class Diablo extends Sprite
    {
        private var _type:int;
        private var _speed:int;
        private var _distance:int;
        private var _alreadyHit:Boolean;
        private var _position:String;
        private var _hitArea:Image;
        private var diabloImage:Image;
        private var diabloAnimation:MovieClip;
        private var diabloCrashImage:Image;

        public function Diablo(_ptype:int, _pdistance:int)
        {
            super();

            this._type = _ptype;
            this._distance = _pdistance;
            this._speed = GameConstants.DIABLO_SPEED;

            _alreadyHit = false;

            this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
        }

        private function onAddedToStage(e:Event):void
        {
            this.removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);

            createDiabloArt();
        }

        private function createDiabloArt():void
        { //Gets some other stuff using the same getAtlas but as MovieAnimation and works.
        }

        private function createDiabloCrashArt():void
        {
            // trace("diablo_chingo" + _type + "KO");

            if (diabloCrashImage == null)
            {
                diabloCrashImage = new Image(Assets.getAtlas().getTexture("diablo_chingo" + _type + "KO"));
                this.addChild(diabloCrashImage);
            }
            else
            {
                diabloCrashImage.texture = Assets.getAtlas().getTexture("diablo_chingo" + _type + "KO");
            }

            diabloCrashImage.visible = false;
        }

        private function hidePreviousInstance():void
        {
            if (diabloAnimation != null && _type <= GameConstants.DIABLO_TYPE_4)
            {
                diabloAnimation.visible = false;
                Starling.juggler.remove(diabloAnimation);
            }

            if (diabloImage != null) diabloImage.visible = false;
        }

        public function get type():int { return _type; }

        public function set type(value:int):void 
        {
            _type = value;
            resetForReuse();
            hidePreviousInstance();
            createDiabloArt();
        }

        public function get alreadyHit():Boolean { return _alreadyHit; }
        public function set alreadyHit(value:Boolean):void
        {
            _alreadyHit = value;

            if (value)
            {
                diabloCrashImage.visible = true;

                if (_type >= GameConstants.DIABLO_TYPE_1 || _type <= GameConstants.DIABLO_TYPE_4)
                {
                    diabloAnimation.visible = false;
                }
                else
                {
                    diabloImage.visible = false;
                    Starling.juggler.remove(diabloAnimation);
                }
            }
        }

        public function resetForReuse():void
        {
            this.alreadyHit = false;
            this.rotation = deg2rad(0);
        }
  }
 }

但它可以通过更改以下内容来工作:

private function onAddedToStage(e:Event):void
{
    this.removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);

    createDiabloArt();
    createDiabloCrashArt();
}

private function createDiabloCrashArt():void
{
    // trace("diablo_chingo" + _type + "KO");

    if (diabloCrashImage == null)
    {
        diabloCrashImage = new Image(Assets.getTexture("Diablo1"));
        this.addChild(diabloCrashImage);
    }
    else
    {
        diabloCrashImage.texture = Assets.getTexture("Diablo1");

        //Assets.getAtlas().getTexture("diablo_chingo" + _type + "KO");
    }

    diabloCrashImage.visible = false;
}

我一次又一次地使用调试器、跟踪等工具验证了正确的参数到达函数(如 _type),事实上,在长方法中我没有包括获取我需要的纹理使用上述语法效果很好。

我试过:

  1. 将图像更改为影片剪辑
  2. 在进入 createCrashArt 之前进行初始化
  3. 获取其他纹理,例如我已经可以显示的纹理(没用)
  4. 盯着它看真的很辛苦。
  5. 设置纹理的默认字符串。

None 产生了任何东西,直到我将代码更改为第二个片段中的样子,问题是我不明白为什么它不起作用,我宁愿不依赖于快速修复以后可能会或可能不会变成挫折。

说真的,任何有助于理解这一点的帮助都会很棒。我什至不在乎 ir 现在是否在工作,我只是终生无法弄清楚问题出在哪里。

提前致谢。

编辑:

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

    /**
     * Returns a texture from this class based on a string key.
     * 
     * @param name A key that matches a static constant of Bitmap type.
     * @return a starling texture.
     */

    public static function getTexture(name:String):Texture
    {

        if (gameTextures[name] == undefined)
        {

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

        //trace("Tomando textura!");
        return gameTextures[name];
    }

编辑:资产 class

package
{
    import flash.display.Bitmap;
    import flash.utils.Dictionary;

    import starling.textures.Texture;
    import starling.textures.TextureAtlas;

    public class Assets
    {

            /**
             * Atlas de texturas. 
             */

            [Embed(source="../Witchmedia/graphics/Spritesheet/ScarletWitch.png")]
            public static const AtlasTextureGame:Class;

            [Embed(source="../Witchmedia/graphics/Spritesheet/ScarletWitch.xml", mimeType="application/octet-stream")]
            public static const AtlasXmlGame:Class;

            /**
             *  Assets de Fondo y botones.
             */

            [Embed(source="../Witchmedia/graphics/bgLayer3.jpg")]
            public static const BgLayer1:Class;

            [Embed(source="../Witchmedia/graphics/Diablo1.png")]
            public static const Diablo1:Class;

            /**
             * Cache de Texturas 
             */

            private static var gameTextures:Dictionary = new Dictionary();
            private static var gameTextureAtlas:TextureAtlas;

            /**
             * Returna una instancia del atlas de texturas.
             * @return the TextureAtlas instance (Singleton)
             */

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

            /**
             * Returns a texture from this class based on a string key.
             * 
             * @param name A key that matches a static constant of Bitmap type.
             * @return a starling texture.
             */

            public static function getTexture(name:String):Texture
            {

                if (gameTextures[name] == undefined)
                {

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

                //trace("Tomando textura!");
                return gameTextures[name];
            }
        }
Can you check with this method, Give the texture declaration in a separate class, i guess it doesnt take the appropriate texture. 


public static function getAtlas(atlasNumb:uint = 1):TextureAtlas
        {
            if(sTextureAtlas[atlasNumb - 1] == null)
            {
                var texture:Texture = getTexture("AtlasTexture"+atlasNumb);
                var xml:XML = XML(create("AtlasXml"+atlasNumb));
                sTextureAtlas[atlasNumb-1] = new TextureAtlas(texture, xml);
            }
            return sTextureAtlas[atlasNumb - 1];
        }

        private static function create(name:String):Object
        {
            var textureClass:Class =  AssetEmbeds_2x;                
            return new textureClass[name];
        }


And define the textures .png and xml in a separate file called AssetEmbeds_2x.

while calling the texture define like 
Assets.getAtlas(1).getTextures("xxx"). I hope it wll