zoukankan      html  css  js  c++  java
  • 摸索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。

  • 相关阅读:
    docker 笔记
    XML解析
    P1047 校门外的树
    4829 [DP]数字三角形升级版
    1996 矿场搭建
    5524 割点
    4817 江哥的dp题d
    4809 江哥的dp题c
    4816 江哥的dp题b
    4815 江哥的dp题a
  • 原文地址:https://www.cnblogs.com/adoontheway/p/2970676.html
Copyright © 2011-2022 走看看