嗯,没什么好说的。 ----我如是说
这一节主要是研究一下一些细节管理方面的东西。
首先,因为我们的项目需要管理很多个素材。
由于我们是小项目,所以我们只需要通过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。