摸索Flash移动开发 资源封装优化

嗯,没什么好说的。  ----我如是说

这一节主要是研究一下一些细节管理方面的东西。

首先,因为我们的项目需要管理很多个素材。

由于我们是小项目,所以我们只需要通过Embed嵌入资源就可以了。

我们新增了一个状态类,用来管理角色的各种状态信息:

package com.ado.res 
{
    /**
     * ...
     * @author Long.J.Du
     */
    public class RoleState 
    {
        /** 休息状态 */
        public static const BREAK_STATE:String = "break_state";
        /** 行走状态 */
        public static const WALK_STATE:String = "walk_state";
        /** 攻击状态 */
        public static const ATTACK_STATE:String = "attack_state";
    }
}

然后新增了一个info类来储存初始化好了的TextureAtlas,如下:

package com.ado.res 
{
    import flash.display.Bitmap;
    import starling.textures.Texture;
    import starling.textures.TextureAtlas;
    /**
     * ...
     * @author Long.J.Du
     */
    public class ResMapInfo 
    {
        private var walkTexture:Texture;
        private var breakTexture:Texture;
        private var attackTexture:Texture;
        
        private var walkConfig:XML;
        private var breakConfig:XML;
        private var attackConfig:XML;
        private var name:String = "";
        
        private var atlas:Object;
        public function ResMapInfo(name:String) 
        {
            this.name = name;
            atlas = { };
        }
        /**
         * 初始化各种状态
         * @param    walkT    行走的图片集
         * @param    walkC    行走的xml配置文件
         * @param    breakT
         * @param    breakC
         * @param    attackT
         * @param    attckC
         */
         public function initStates(walkT:Bitmap, walkC:XML, breakT:Bitmap, breakC:XML, attackT:Bitmap, attckC:XML):void
        {
            var texture:Texture = Texture.fromBitmap(walkT);
            atlas[RoleState.WALK_STATE] = new TextureAtlas(texture, walkC);
            texture = Texture.fromBitmap(breakT);
            atlas[RoleState.BREAK_STATE] = new TextureAtlas(texture, breakC);
            texture = Texture.fromBitmap(attackT);
            atlas[RoleState.ATTACK_STATE] = new TextureAtlas(texture, attckC);
        }
        /**
         * 根据状态取得对应的Atlas
         * @see AtlasState
         */
        public function getAtlasByState(state:String):TextureAtlas
        {
            if (atlas.hasOwnProperty(state))
            {
                return atlas[state] as TextureAtlas;
            }else {
                return null;
            }
        }
    }

}

其中,initStates用来初始化三种状态的TextureAtlas并存储在本地;

后续需要提取对应状态的atlas的时候我们只需要通过getAtlasByState就可以拿到对应的TextureAtlas了。

然后在Res里面粗略的粗暴的修改了一下,后续可以慎重的考虑这些东西,严谨的程序猿可以略过以下的代码:

Res
package com.ado.res
{
    import flash.display.Bitmap;
    import flash.utils.Dictionary;
    import starling.textures.TextureAtlas;
    /**
     * ...
     * @author Long.J.Du
     */
    public class Res 
    {
        [Embed(source="http://www.cnblogs.com/../res/texture/Beauty.png")]
        public static var Beauty:Class;
        [Embed(source="http://www.cnblogs.com/../res/texture/Beauty.xml",mimeType="application/octet-stream")]
        public static var Beauty_Config:Class;
        
        [Embed(source="http://www.cnblogs.com/../res/texture/Beauty_Walk.png")]
        public static var Beauty_Walk:Class;
        [Embed(source="http://www.cnblogs.com/../res/texture/Beauty_Walk.xml",mimeType="application/octet-stream")]
        public static var Beauty_Walk_Config:Class;
        
        [Embed(source="http://www.cnblogs.com/../res/texture/Beauty_Attack.png")]
        public static var Beauty_Attack:Class;
        [Embed(source="http://www.cnblogs.com/../res/texture/Beauty_Attack.xml",mimeType="application/octet-stream")]
        public static var Beauty_Attack_Config:Class;
        
        [Embed(source="http://www.cnblogs.com/../res/texture/pt.jpg")]
        public static var MAP_0:Class;
        private static var atlasMap:Dictionary = new Dictionary();
        public  static function initAtlas():void
        {
            var beauty:ResMapInfo = new ResMapInfo("beauty");
            beauty.initStates(new Beauty_Walk as Bitmap, 
            XML(new Beauty_Walk_Config),
            new Beauty as Bitmap, 
            XML(new Beauty_Config), 
            new Beauty_Attack as Bitmap,
            XML(new Beauty_Attack_Config));
            atlasMap["beauty"] = beauty;
        }
        /**
         * 根据名字和状态取得纹理数据
         * @param    key
         * @param    state
         */
        public static function getAltas(key:String, state:String):TextureAtlas
        {
            if (atlasMap.hasOwnProperty(key))
            {
                var target:ResMapInfo = atlasMap[key];
                return target.getAtlasByState(state);
            }
            return null;
        }
    }

}

其次,如果是做游戏的话,我们需要封装一下角色的类,因为我们需要管理显示和数据之间的关系,这个类会简单的实现角色的状态切换。如下:

BaseCharacter
 1 package com.ado.objects 
 2 {
 3     import com.ado.res.RoleState;
 4     import com.ado.res.Res;
 5     import flash.display.Bitmap;
 6     import flash.display.BitmapData;
 7     import starling.events.Event;
 8     import starling.textures.Texture;
 9     import starling.core.Starling;
10     import starling.display.Image;
11     import starling.display.MovieClip;
12     import starling.display.Sprite;
13     import starling.textures.TextureAtlas;
14     
15     /**
16      * ...
17      * @author Long.J.Du
18      */
19     public class BaseCharacter extends Sprite 
20     {
21         private var mc:MovieClip;
22         //0 休息 1 行走 2 攻击
23         private var status:int = 0;
24         private var breakXml:XML;
25         private var breakTexture:Texture;
26         private var walkXml:XML;
27         private var walkTexture:Texture;
28         private var attackXml:XML;
29         private var attackTexture:Texture;
30         
31         private var antlas:TextureAtlas;
32         
33         private var walkMc:MovieClip;
34         private var breakMc:MovieClip;
35         private var attackMc:MovieClip;
36         public function BaseCharacter() 
37         {
38             addEventListener(Event.ADDED_TO_STAGE, onAdded);
39         }
40         private function onAdded(e:Event):void
41         {
42             removeEventListener(Event.ADDED_TO_STAGE, onAdded);
43             antlas = Res.getAltas("beauty", RoleState.BREAK_STATE);
44             breakMc = new MovieClip(antlas.getTextures("sprite 44"), 24);
45             Starling.juggler.add(breakMc);
46             breakMc.play();
47             breakMc.x = breakMc.width >> 1;
48             breakMc.y = -breakMc.height;
49             addChild(breakMc);
50         }
51         private var flag:Boolean;
52         public function setStatus(value:int):void
53         {
54             flag = !flag;
55             if (flag)
56             {
57                 antlas = Res.getAltas("beauty", RoleState.BREAK_STATE);
58                 breakMc = new MovieClip(antlas.getTextures("sprite 44"), 24);
59             }else {
60                 antlas = Res.getAltas("beauty", RoleState.ATTACK_STATE);
61                 breakMc = new MovieClip(antlas.getTextures("sprite 85"), 16);
62             }
63         }
64         public function goto(_tx:Number,_ty:Number):void
65         {
66             
67         }
68     }
69 
70 }

做完以上事情,我们基本上算是封装完成了。

下一节我们将学习事件,所以大家记得预先温习一下api。

原文地址:https://www.cnblogs.com/adoontheway/p/2970676.html