现在最新版本可以支持starling+ feathersjs了吗

Starling-Feathers中设立单个组件对象的样式
Starling-Feathers中设立单个组件对象的样式
发布时间: 11:37:35
编辑:www.fx114.net
本篇文章主要介绍了"Starling-Feathers中设立单个组件对象的样式",主要涉及到Starling-Feathers中设立单个组件对象的样式方面的内容,对于Starling-Feathers中设立单个组件对象的样式感兴趣的同学可以参考一下。
Starling-Feathers中设立单个组件对象的样式Starling-Feathers中设置单个组件对象的样式
关于基于Starling的Feathers组件库,版本号比较小,是个比较新的东西,所以,可能并不是太完善,并且API文档中介绍的其实并不够详细在使用例如Button的selectedDownSkin或者其他组件的****Skin来设置组件的某种状态样式API文档中介绍了,set方法的参数是一个DisplayObject,再就没有更详细的了,而Texture并不是基于DisplayObject的,所以,不能直接用Texture好在还有Starling官方的Wiki来说明这些http://wiki.starling-framework.org/feathers/button?s[]=skin这里面可以使用new Image()来实现还有一种方法就是类似于写样式类一样的去实现,不过写起来就繁琐不少了要写样式的初始化方法,写样式的对应值和状态选择器等参考:http://wiki.starling-framework.org/feathers/extending-themes
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:Feathers基础知识
时间: 22:38:02
&&&& 阅读:329
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&12.a&&1 等效于a/213.如果一个显示对象被scale,bitmapdata.draw的时候并不是使用它缩放后的内容。需要这么做:_local4.draw(_local3,_fadeOutMatrix);14。mask最好addChild到容器里。因为如果不addChild,parent缩放的时候,只缩放了MC,而没有缩放mask
1.Category是类别的意思
//设置鼠标移出移入时设设置样式var touch:Touch = e.getTouch(e.target as DisplayObject, TouchPhase.HOVER);if (touch) {Mouse.cursor = MouseCursor.HAND; //手掌型样式。} else {Mouse.cursor = MouseCursor.AUTO;}
2.json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构
1、对象:对象在js中表示为&{}&扩起来的内容,数据结构为 {key:value,key:value,&}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。
2、数组:数组在js中是中括号&[]&扩起来的内容,数据结构为 [&java&,&javascript&,&vb&,&],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。
3.服务器数据通信采用JSON的格式
4、Assets工程包括了所有游戏素材
5、DisplayUtil中copyPixelArea可以把纯色背景的图片剪裁成最小区域
6、LayerManager是管理游戏显示层的类。一共有三层,从低往高分别是:
_mapLevel:地图层
_appLevel:用来装UI界面的
_noticeLevel:系统通知层
它们都是Starling的sprite
7.animation.FrameSprite是一个基于Starling的动画类
8.org.ly.manager.GeneralResourceManager是一个用于资源加载的类
9.GeneralResourceManager.getResource(_url,onComHandler,&&,ResourceLevel.LEVEL_2);可以加载未存在的资源
10.AssetsManager主要是提供一些方法取到已有资源
11.AttributeManager管理人物、怪物、物品的属性
12、animation.MoveSprite 提供一个方法让显示对象从一个位置移动到目标位置,移动完成后会自动把它从显示列表删除
13、取得舞台的宽度:StarlingManager.stageWidth
14、NoticeManager.showAlert:显示上移的文字提示(技能冷却中)
15、AnimationManager调用Starling.current.juggler.add(starling.display.MovieClip)播放动画,它被FrameSprite调用
16、org.ly.loader.BinaryLoader二进制类型加载器
17、flash.display.BitmapData.setPixels(rect:Rectangle, inputByteArray:ByteArray):void
将字节数组转换为像素数据的矩形区域。对于每个像素,将调用 ByteArray.readUnsignedInt() 方法并将返回值写入像素。如果字节数组在写入整个矩形之前结束,将返回函数。字节数组中的数据应该是 32 位 ARGB 像素值。在读取像素之前或之后,不会对字节数组执行搜索。
18、用户的flash player 未启用硬件加速:_stage3d.context3D.driverInfo.indexOf(&Software Hw_disabled=userDisabled&) != -1
19、由于 Starling 中的全部 DisplayObject 都具有 pivotX 及 pivotY 属性,我们可以非常便捷地在
运行时改变其注册点
20、Starling 中的 DisplayObject 的 rotation 属性是以弧度为单位的,而非原生
Flash 中的以角度为单位
将角度转换为弧度:sprite.rotation = deg2rad(Math.random()*360);
21、Starling中,即使将对象从显示列表中移除了,它的事件侦听器依然残留着。为了更加安全、彻底
地移除一个对象,我们需要给 removeChild 方法设置其第二个参数 dispose 为 true
removeChild(clicked, true);
22、flatten: 如果你想尽可能地提高存在大量嵌套的Sprite对象的话,调用此方法可以让你
达到满意效果,它和 cacheAsBitmap的效果一样
23、Starling中的Button类是DisplayObjectContainer类的子类,
一个 Button 对象将会在你点击它的时候派发一个特殊的事件:Event.TRIGGERED
24、Staring 只会创建一个原生 TextField 对象作为文字源,该文字源将为多个
starling.text.TextField 对 象 提 供 文 字 纹 理
25、Quad(width:Number, height:Number, color:uint = 0xffffff, premultipliedAlpha:Boolean = true)
根据指定的尺寸和颜色创建一个四边形。 最后一个参数决定是否在渲染的时候预乘透明度值,从而影响混合输出的颜色值,大多数情况下可以使用默认值。
26、要调用starling.start();后才会响应事件
27、触摸结束判断:if(touch.phase != TouchPhase.ENDED)
1.popups包下有三个类一个接口,对来实现弹出层
2.CalloutPopUpContentManager 比较简单,open方法里直接使用Callout.show(content, source)进行弹出
3.Callout控件功能类似于tip。它能弹出一个带箭头的指向指定displayobject的tip,并且你可以设置它的指向方向。好像会自动在舞台能显示的范围内调整位置.callout.show方法其实也是调用PopUpManager.addPopUp()来弹出提示的
4.PopUpManager在feathers.core包下。这个包里其实是具体控件的接口和管理类
5.PopUpManager.addPopUp方法不需设置弹出的显示对象的parent,因为它直接stage.addChild到顶层
6.VerticalCenteredPopUpContentManager用于居中弹出,它的open(content:DisplayObject, source:DisplayObject):void方法中的source没有被用到。就是说弹出的层的parent直接是stage
7.app.xml中的landscape是让应用横向
8.DropDownPopUpContentManager是在指定的displayobject的上方或下方弹出一个层。它会根据displayobject的Y坐标来决定是在上还是在下。和Callout类似。但它没没箭头
9.PickerList相当于一下拉选择控件。它包含了一个button和一个List,点击按钮,popup弹出list让你选择。至于用哪种popup方式,是由当前的主题设置的
10.9.PickerList的labelField用于设置button的文本值用的是dataProvider item的哪个键
11.9.PickerList.listProperties.@itemRendererProperties.labelField = &text&;用于设置list中item的文本值用的是dataProvider item的哪个键
12.自定义list的itemrender要新建 一个类,继承自DefaultListItemRenderer然后this._list.itemRendererType = TestItemR
13.需要在Main(Game)里new 一个主题进行初始化,这是必须的,主题里会设置list的DefaultListItemRenderer
14.FeathersControl.validate会触发重绘draw
_btn.upSkin =new Image( upTexture );正常状态
_btn.hoverSkin = new Image( downTexture );鼠标经过
_btn.downSkin = new Image( upTexture );鼠标按下
1.starling textfield 水平、垂直对齐方式设置:
tf.vAlign = VAlign.TOP;
tf.hAlign = HAlign.LEFT;
2、feathers的textInput是一个starling对象,但是它里边的TextField是flash.text.TextField的。
所以就算你把它放到其它Starling显示对象的下面,文字还是不会在下面的
但这个TextField会随着textInput的移动而移动
3、feathers的Panel是一个可以设置标题、布局的,带滚动条的面板。
设置标题:panel.headerProperties.title = &Is it time to party?&;
设置布局:var layout:VerticalLayout = new VerticalLayout();
layout.gap = 20;
layout.padding = 20;
panel.layout =
4.Panel&〉ScrollContainer&〉Scroller&〉FeathersControl&〉starling.display.Sprite
5.Panel不启用水平滚动条:panel.horizontalScrollPolicy = Panel.SCROLL_POLICY_OFF;
Panel.SCROLL_POLICY_AUTO和Panel.SCROLL_POLICY_ON:启用6、panel.scrollBarDisplayMode = Panel.SCROLL_BAR_DISPLAY_MODE_FIXED;一直显示滚动条
panel.scrollBarDisplayMode = SCROLL_BAR_DISPLAY_MODE_FLOAT;拖动的时候才显示滚动条
panel.scrollBarDisplayMode = SCROLL_BAR_DISPLAY_MODE_NONE不显示滚动条,但仍可以拖动
7、想使用滚动条,用ScrollContainer就可以了,没有必要用Panel,Panel只是加了标题标尾的功能8、panel滚动条是不可以拖动的,可能拖动里面的内容。滚动条滚动方向和手势方向相反。适合在手机上用ScrollContainer则和网页上的普通滚动条一样9.ScrollContainer的滚动条不会超出你设置的width
10、设置label的属性:
container.addChild(label);
label.textRendererProperties.textFormat = new TextFormat( &宋体&, 20, 0xff0000 );
label.text = &I am the feathers label!&当Feathers的Label被添加到舞台上的时候会对Label进行默认的字体设置,啊哦&&所以大家都明白是怎么回事了吧,把顺序换一下就可以起作用了
label.textRendererProperties.textFormat,.textFormat其实是label类里textRenderer实例的属性:
const factory:Function = this._textRendererFactory != null ? this._textRendererFactory : FeathersControl.defaultTextRendererF
this.textRenderer = ITextRenderer(factory());
1.由于aeonDesktopTheme主题中有代码:
protected static function textRendererFactory():ITextRenderer
return new TextFieldTextRenderer();
所以调用label.textRendererProperties=&&后最终会调用label.refreshTextRendererStyles
最终会设置textRenderer的属性(textRenderer即TextFieldTextRenderer),从而达到改变label文字属性的作用
2、thickness 厚度
measure 测量
3、feathers的label设置HTML格式字体:starling的textField不支持HTML格式
label.text=&I am the feathers label!&;
label.textRendererProperties.isHTML =
4、label.textRendererProperties.wordWrap =让文本自动换行
label.textRendererProperties.background =显示文本背景
label.textRendererProperties.border =显示边框
label.textRendererProperties.displayAsPassword =作为密码文本
5、ScrollText是一个自带滚动条的文本组件。它的textfield不是starling的,所以会一直在starling显示对象的下面。label的textfield默认是starling的
6、textinput适合单行输入,textarea自带滚动条适合多行输入
7、buttonGroup.buttonFactory可以设置ButtonGroup中生成的按钮,但类型只能是Button
buttonGroup.buttonInitializer = function(btn:Button,data:Object):void{
btn.width = 200;
};可以对每个按钮在初始化时进行一些操作
8、ButtonGroup使用buttonFactory后,就不能在dataProvider的数据中设置triggered点击事件响应函数了
9、PageIndicator是一个单纯的页数显示的控件
pageIndicator.pageCount = 3;
pageIndicator.selectedIndex = 2;//显示当前是第3页。从0开始
pageIndicator.normalSymbolFactory设置页码未被选中的显示对象
pageIndicator.selectedSymbolFactory设置页码已被选中的显示对象
10、pickerList就是一个 combobox:下拉选择菜单
11、PickerList是由一个有特殊皮肤的Button+List组成,List的弹出由DropDownPopUpContentManager弹出
12、更换一个按钮皮肤:
var btn:Button = new Button();
btn.nameList.add(NumericStepper.DEFAULT_CHILD_NAME_INCREMENT_BUTTON);
container.addChild(btn);
13、自定义一个按钮皮肤:
(1)_theme.setInitializerForClass( Button, myCustomButtonInitializer, &my-custom-button& ;
private function myCustomButtonInitializer( button:Button ):void
button.defaultSkin = new Image( upTexture );
button.downSkin = new Image( downTexture );
button.hoverSkin = new Image( hoverTexture );
button.defaultLabelProperties.textFormat = new TextFormat( &fontName&, 18, 0xffffff );
(2)var btn:Button = new Button();
btn.nameList.add(&my-custom-button&);
container.addChild(btn);
14、和starling的image一样,feathers的imageloader上存在一个 color 属性值得大家记住,该属性允许你为一个图片指定一个颜
色值。在 Image 对象中,每个像素的颜色值都是由其纹理的颜色值和你指定的 color 颜色值
混合的结果。
15、在函数内部写侦听函数时,要注意先定义函数数再侦听,否则为空
16、当你用一个imageLoader作为一个Button的皮肤时,只有此按钮的状态对应,才会去加载这个图片
17、starling.textures.RenderTexture API 允许开发者在 Starling 中实现无损绘画功能
mRenderTexture = new RenderTexture(stage.stageWidth, stage.stageHeight);
var canvas:Image = new Image(mRenderTexture);
addChild(canvas);
mRenderTexture.draw(DisplayObject);
18、当自定义按钮皮肤时,myCustomButtonInitializer函数里,btn.defaultSkin不能=imgageLoader。因为这样的话,会导致鼠标移上去不会切换到hover状态,只能用一个已存在的图片。
各种状态也是不能用未完成加载的imgageLoader
19、Callout 的使用:
Callout 是在一个目标显示对象的周围弹出一个自定义的显示对象,但它的弹出位置只是固定上下左右,不会随着鼠标动而动
btn.addEventListener(TouchEvent.TOUCH,function(e:Event):void{
var callout:Callout = Callout.show(tip,btn);
callout.disposeContent =// 不写这句,弹出一次第二次就不见了
1.ButtonGroupvar group:ButtonGroup = new ButtonGroup();addChild(group);group.gap = 50; //必须要放在addChild()方法后面才生效group.lastGap = 100; //可不放在addChild()方法之後
2.Starling.juggler.add(dc);add函数里有这行代码:if (dispatcher)dispatcher.addEventListener(Event.REMOVE_FROM_JUGGLER, onRemove);所以只要dc dispatchEventWith(Event.REMOVE_FROM_JUGGLER);就可以将动画停止
3.AppModuleManager管理所有模块的加载AppModule,加载和表示一个模块(一个SWF)
4.结Feathers 输入文本设置焦点:_ui.textUserName.setFocus();
5.FeathersControl的name属性有特别的地方它用一个_nameList:TokenList 来保存组件的名字,所以一个组件可以有多个名增加名字:feathersControl.nameList.add(&btn_name_2&);但feathersControl.name = &XX&;会清空之前的nameListnameList和组件的皮肤有很大关系
6.Sector是一个flash.displayobject.sprite的子类。它可以画任意百分比的圆用于技能冷却效果
7.var resultCls:Class = getDefinitionByName(&skill.result.Result_&+skillId) as C动态取得一个类
8.技巧:取得一个元素也可以通过删除它来取得:var index:int = uint((e.currentTarget as RadioButton).name.split(&_&).pop());
9.AIR文件拖放:
this.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER,onDragIn);//拖动的文件被拖到目标上的时候触发
this.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP,onDrop);//拖动的文件在拖到目标上,并且松开的时候触发
this.addEventListener(NativeDragEvent.NATIVE_DRAG_EXIT,onDragExit);//拖动的文件离开目标的时候触发
获取被拖进来的文件:
public function onDrop(e:NativeDragEvent):void{var dropfiles:Array = e.clipboard.getData(ClipboardFormats.FILE_LIST_FORMAT) as Aif(dropfiles.length & 0){var file:File = dropfiles[0] as F}}
10.flash.filesystem.File.separator():String
[只读] 主机操作系统的路径组件分隔符。
在 Mac OS 和 Linux 中,这是正斜杠 (/) 字符。在 Windows 中,它是反斜杠 () 字符。注意:当在字符串中使用反斜杠时,请记住键入该字符两次(例如&directory\file.ext&)
11.GeneralResourceManager也可以加载本地文件(AIR中),它都是以二进制的形式进行加载的
12.打包工具把XML、图片、JSON都写成一个二进制文件。并进行压缩:
flash.press(algorithm:String=&zlib&):void
压缩字节数组。将压缩整个字节数组。读取文件的时候,再解压
13.打包图片的规则是:
A、写入图片数据长度
B、写入图片数据
C、写入图片宽
D、写入图片高
14.BinaryLoader使用URLStream来加载文件
URLStream 类提供对下载 URL 的低级访问。数据一下载,便可随即为应用程序使用,这和使用 URLLoader 时需要等到整个文件下载完不同。并且 URLStream 类还允许在完成下载前关闭流。已下载文件的内容将作为原始二进制数据提供。
加载完成后使用public function readBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void得到ByteArray
15.加载文件时GeneralResourceManager会
info = new GeneralResourceInfo();
info.url =//通过URL确定文件类型
加载完成后BinaryLoader会调用info.resource方法,判断资源类型进行对应的解析
如果资源是.fa.pa.ba的文件,就会生成BAAnimationInfo、PAAnimationInfo、FAAnimationInfo类来进行解析
11、Feathers PanelScreen一般不进行实例化,而是与ScreenNavigator配合一起使用
this._navigator = new ScreenNavigator();
this._navigator.addScreen(BUTTON, new ScreenNavigatorItem(ButtonScreen,
complete: MAIN_MENU,
showSettings: BUTTON_SETTINGS
12、progressBar.direction = ProgressBar.DIRECTION_VERTICAL;
确定进度条填充的方向为竖直的,但是你得设置progressBar的宽高看起来像竖直的
13、feathers.core.ToggleGroup:控制选择中的两个或更多个iToggle的情况下,只有一个可被选择
14、Screen,ScreenNavigato,ScreenNavigatorItem这3个组合一起使用来实现手机页面的功能
15.Feathers ScrollBar和SimpleScrollBar的区别:
ScrollBar是一个普通的平常在网页上常见的滚动条
SimpleScrollBar是一个只有一个滑块,没有背景,没有上下按钮的滚动条,适合手机上用
Feathers Scroller
不会被作为一个独立的容器或组件。通常意味着另一个组件的超类需要支持滚动
比如ScrollText&&Scroller、ScrollContainer&&Scroller
17、直接btn.defaultSkin = new Image(Texture.fromBitmapData((new BtnClass1).bitmapData));
btn.defaultSelectedSkin = new Image(Texture.fromBitmapData((new BtnClass2).bitmapData));
给换钮换肤是不生效的。
实际上是因为Button在addChil的时候会把theme中的默认皮肤方法赋值给stateToSkinFunction,
所以要使我们设置生效的方法就是在addChild我们的button之后将stateToSkinFunction赋值为null
18、clearInitializerForClass可以清除setInitializerForClass引起的引用
19、会先执行tabBar.tabFactory函数,才执行主题中的tabInitializer,所以在tabBar.tabFactory所设置的皮肤都被覆盖无效了
CalloutPopUpContentManager其实是简单的调用封装了Callout,它的open方法不是静态方法。它可以在一个显示对象的四周弹出另一个显示对象
DropDownPopUpContentManager.open方法其实是调用PopUpManager.addPopUp(this.content, false, false);只能在一个显示对像的上方或下方弹出,并且它还侦听舞台的变化来调整在上还是在下
VerticalCenteredPopUpContentManager.open方法也是调用PopUpManager.addPopUp(this.content, true, false);来顶层居中弹出
2、feathers.core.DisplayListWatcher.setInitializerForClass(type:Class, initializer:Function, withName:String=null):void
这是主题类中要调用的方法。它的功能是为指定的类和该类指定的实例名(可选)绑定初始化函数initializer
比如,AeonDesktopTheme主题中为PickList指定了INIT函数
this.setInitializerForClass(PickerList, pickerListInitializer);
protected function pickerListInitializer(list:PickerList):void
list.popUpContentManager = new DropDownPopUpContentManager();
初始化函数为PickerList弹出下LIST的管理器为DropDownPopUpContentManager;
3、VerticalCenteredPopUpContentManager、DropDownPopUpContentManager、CalloutPopUpContentManager都继承自EventDispatcher实现了IPopUpContentManager接口
4、Callout弹出的显示对像会默认有背景。PopUpManager.addPopUp则没有
5、dropDownPopUpContentManager.open两次同一个tip会出错。可以先close再
6、PopUpManager与VerticalCenteredPopUpContentManager的区别:PopUpManager弹出的显示对像不会自动关闭,而VerticalCenteredPopUpContentManager会
7、Check&&Button&&FeathersControl&&starling.display.Sprite
Check就是一个Button,一个isToggle的Button。只是它的皮肤变了
8、GroupedList是一个可分组的LLIS类似日历界面&今日可做今日已做&模块
9、var list:Vector.&= new Vector.();
list.push(backBtn);
可以简写为: list = new&[backBtn];
10、Header是一个手机屏幕页导航。有一个居中的标题和可以放在左右两边的按钮集合
11、List需要的dataProvider是一个ListCollection。默认数据中的label为LIST中显示的文本,iconSource为显示的图标
如果要改需要写代码:
list.itemRendererFactory = function():IListItemRenderer
var renderer:DefaultListItemRenderer = new DefaultListItemRenderer();
renderer.labelField = &text&;
renderer.iconSourceField = &thumbnail&;
12、自定义ListItemRenderer:
a.要继承FeathersControl
b.实现IListItemRenderer接口
c.override protected function draw():void
setSizeInternal(100,20,false);
}标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:/fancyzhen/p/3948180.html
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!3452人阅读
游戏开发及技术(65)
设计 & 架构(6)
web技术(32)
说在前头:楼主之前没有任何flash开发经验,只是从一次尝试中总结自己的理解和经验而已。如果有写的不对的地方,欢迎大家指正。
前一段时间尝试想用flash(as3)重新制作一下之前做的一个游戏,作为从来没有接触过flash开发的我来说,花了一些时间研究现有的一些框架。虽然现在我已经放弃了使用flash来开发(后面会说原因),但我觉得还是有必要总结一下这个过程中对于flash、starling、starling mvc的一些理解。
因为一开始我是使用silverlight开发游戏的,它有一个极大的便利是微软提供了强大好用的Microsoft Blend Expression。可以很好的、所见即所得用它来制作UI。自然而然,我很想在flash的开发环境下找一个替代品。但很遗憾,最后我自己得出的结论是:没有。
1、flex和blend有点像,但flex(后来叫flash builder)貌似某个版本以后就不提供图形编辑器了。并且通过网上大家的讨论得出,flex性能特别差,几乎无法在手机上运行。果断弃坑。
2、flash cs可以制作游戏UI,但给我的感觉是提供的功能特别基础,也不甚符合程序员的逻辑思维。
3、还有一些其他的第三方或者个人提供的UI库、编辑工具,如flexlite等——不敢用,怕有大坑。而且翻了一下代码更新日志,也是好久都没动过了——更加怕。
4、starling貌似是大家比较推崇的flash移动端解决方案,大概看了一下,从原理上来说肯定是性能比传统的flash要好得多。
通过一番调研,决定用starling试试。
很自然的,游戏需要比较好的扩展性的话,我们需要一个好的代码框架,找了一圈找到starling MVC。大概看了一下功能介绍,感觉和j2ee的spring MVC有一点像。
starling MVC是一个IOC框架,提供以下特性:
依赖注入(DI)/控制反转(IOC)视图仲裁(View Mediation)事件处理不影响原生的Starling游戏代码简易配置易扩展提供一些实用工具
我翻译了一部分它的介绍,有兴趣的同学可以看我的github上的starling MVC的一个branch:()
我到网上翻了一些关于starling MVC编写的游戏例程,怎么说呢,我感觉是没一个靠谱的。。大部分人都是浅尝辄止,而且都是生搬硬套。想把游戏逻辑拼命的塞到starling MVC中,而不是真正的用它来做代码的整理、规划,没有理解MVC、IOC、DI等思想,于是我索性自己开始琢磨。
我整理的starling MVC的调用逻辑关系如下:
1、启动时初始化各个bean(包括model、mediator、controller、view我认为都应该实例化为bean)
2、starling MVC提供方法将bean依赖注入([Inject]等标签)
3、MVC的连接方式为:
controller中注册EventHandler,接收消息。然后直接调用ViewManager的addView/removeView方法,来修改元素。调用了addView/removeView实际上会被相关的Mediator拦截到,在Mediator中编写界面展示的逻辑。(调用view的修改方法,调用Model的逻辑)Model中提供业务逻辑方法View中定义界面元素
实际上是把传统的MVC中的“C”分成了两个部分:controller和mediator,controller负责消息接收和路由、mediator负责衔接M和C
开发过程中逻辑还是比较顺畅的,不过后来我一直没去搞清楚比如要实现场景切换的过渡特效,在starling MVC中怎么实现……因为每次都是直接addView、removeView,木有一个中间状态啊。不过还没等我去研究,我就弃坑了……呵呵呵呵呵呵……
另外提一下starling feathers这个东东。
starling没有可视化的UI开发工具(拖界面的工具),那么意味着你需要手动在代码里去写x、y坐标,写width、height等属性(我了个擦,坑爹啊!)——当然,如果你说你可以自己开发一个可视化的工具,那么,我只能说:祝你好运……
OK,那么我先硬着头皮写一下用代码来布局的UI吧……
var stateBackground : ImageLoader = new ImageLoader();
stateBackground.source = assets.getTexture(&nick&);
stateBackground.x = 0;
stateBackground.y = -12;
stateBackground.width = 200;
stateBackground.height = 70;
stateCanvas.addChild(stateBackground);
_nickLabel = ComponentFactory.getSmallFontLabel(&初出茅庐&, 0xEF5E00, true, 20);
_nickLabel.x = 62;
_nickLabel.y = -4;
stateCanvas.addChild(_nickLabel);
_gameModeLabel = ComponentFactory.getSmallFontLabel(&难度:普通&, 0xFFFFFF, true, 12);
_gameModeLabel.x = 61;
_gameModeLabel.y = 24;
stateCanvas.addChild(_gameModeLabel);
_zhujueHead = new ImageLoader();
_zhujueHead.x = 4;
_zhujueHead.y = -4;
_zhujueHead.width = 40;
_zhujueHead.height = 49;
_zhujueHead.source = assets.getTexture(&zhujue&);
stateCanvas.addChild(_zhujueHead);
_descCanvas = new Sprite();
_descCanvas.x = 100;
_descCanvas.y = 100;
_descCanvas.visible =
this.addChild(_descCanvas);
var descBackground : Scale9Image = ComponentFactory.getScale9Image(&info&, new Rectangle(7,9,360,87));
descBackground.x = 0;
descBackground.y = 0;
descBackground.width = 377;
descBackground.height = 103;
descBackground.alpha = 0.8;
_descCanvas.addChild(descBackground);
_descImage = new ImageLoader();
_descImage.x = 14;
_descImage.y = 14;
_descImage.width = 80;
_descImage.height = 80;
_descImage.maintainAspectRatio =
_descCanvas.addChild(_descImage);
_descLocationLabel = ComponentFactory.getSmallFontLabel(&&, 0xffffff, true, 18);
_descLocationLabel.x = 104;
_descLocationLabel.y = 6;
_descLocationLabel.filter = BlurFilter.createDropShadow(4,0.7,0x.8,0.5,1);
_descCanvas.addChild(_descLocationLabel);
_descInfoLabel =
ComponentFactory.getSmallFontLabel(&&, 0xffffff, false, 12);
_descInfoLabel.x = 104;
_descInfoLabel.y = 40;
_descInfoLabel.width = 250;
_descInfoLabel.height = 56;
_descInfoLabel.filter = BlurFilter.createDropShadow(2,0.7,0x.8,0.5,1);
_descCanvas.addChild(_descInfoLabel);
上面这一段截取于我刚开始写的一个布局view,实在是蛋疼至极有木有!!!
于是楼主愤怒的自己写了一个布局基类,可以实现成下面这样的写法了……
this.initComponents([
{type:Scale9Image, source:&UI-kuang&, rect:new Rectangle(15,40,315,328), width:500, height:585},
{type:RoleUI, id:&roleUI&, x:80, id:&roleUI&},
{type:Label, text:&当前队伍&, color:0xffffff, fontSize:14, width:110, x:25, y:73},
{type:ScrollContainer, width:80, height:435, x:25, y:108, id:&teamlist& },
{type:ImageLoader, source:&back&, width:20, height:20, x:470, y:5, id:&close&},
自己感觉好多了……但还是很蛋疼有木有
这里奉上基类BaseUI,有兴趣拿走~
package cn.hanjiasongshu.ponents
import com.creativebottle.starlingmvc.views.ViewM
import flash.geom.R
import flash.utils.D
import cn.hanjiasongshu.jygame.core.assets.A
import cn.hanjiasongshu.jygame.ponentF
import feathers.controls.ImageL
import feathers.controls.L
import feathers.controls.ScrollC
import feathers.core.FeathersC
import feathers.display.Scale9I
import feathers.textures.Scale9T
import feathers.dragDrop.DragDropM
import starling.display.S
import starling.textures.T
* @author cg
public class BaseUI extends FeathersControl
private static const ANONYMOUS_PREFIX:String = &__&;
public function BaseUI()
_components = new Dictionary();
_autoId = 0;
public function get assets():Assets
return Assets.
* 初始化组件
* @param componentsArray
protected function initComponents(componentsArray:Object):void
this.addComponents(componentsArray, this);
* 为一个组件添加孩子
* @param componentsArray
* @param parent
private function addComponents(componentsArray:Object, parent:Sprite):void
for each(var c:Object in componentsArray)
if(c.type == null)
trace(&[error]undefined component type:& + c);
var type:String = c.
var id:String = &&;
if(c.id != null)
id = String(ANONYMOUS_PREFIX + _autoId + &:& + String(c.type));
_autoId++;
var component:Sprite =
switch(c.type)
case Label:
var text:String = c.text==null?&&:c.
var color:int = c.color==null?0:c.
var bold:Boolean = c.bold==null?true:c.
var fontSize:int = c.fontSize==null?11:c.fontS
if(c.align != null && c.align == &center&)
component = ComponentFactory.getCenterAlignedFontLabel(text,color,bold,fontSize);
component = ComponentFactory.getSmallFontLabel(text,color,bold,fontSize);
case ImageLoader:
var tmp:ImageLoader = new ImageLoader();
tmp.maintainAspectRatio =
var source:String = c.source==null?&&:c.
tmp.source = c.source==null?&&:assets.getTexture(source);
component =
case Scale9Image:
component = ComponentFactory.getScale9Image(c.source, c.rect);
case ScrollContainer:
component = ComponentFactory.generateVerticalScrollContainer(c.layout, c.backgroundSkin);
case ToolTipUI:
component = new ToolTipUI(parent);
var clz:Class = c.
var instance:Object = new clz();
if(instance is Sprite)
component = instance as S
trace(&[error]invalid component type:& + c.type);
if(component != null)
this.setIfExist(c, component, [&x&,&y&,&width&,&height&,&visible&]);
_components[id] =
parent.addChild(component);
if(c.children != null) //遍历孩子组件
this.addComponents(c.children, component);
* 通过ID获取组件
* @param id
public function getComponentById(id:String):Sprite
if(_components[id] == null)
trace(&[error]get undefined component id:&+id);
return _components[id];
public function getLabel(id:String):Label
return this.getComponentById(id) as L
public function getImageLoader(id:String):ImageLoader
return this.getComponentById(id) as ImageL
private function setIfExist(dataSource:Object, obj:Sprite, params:Array):void
for each(var p:String in params)
if(dataSource[p]!=null)
obj[p]=dataSource[p];
private var _components:D
private var _autoId:
public override function dispose():void
for each(var key:String in _components)
var sprite:Sprite = _components[key] as S
sprite.removeFromParent(true);
_components =
你可以修改addComponent函数来自己添加控件类型,支持控件的组合等等。
啰啰嗦嗦说了这么多,发几个最终做出来的效果的图吧……还是很丑……
算是写了一些代码,但越做越不对头,因为UI这东西还真不是写写控件布局就能做好的,没有一个很好的可视化的编辑工具,我也越来越力不从心。
之后出于多方考虑,还是弃坑投入了unity3d的怀抱。
最后总结一下吧:
1、用starling这一系列东西开发的过程中到是没遇到太多框架性的BUG,已有的特性和功能都可以用。
2、starling等提供的功能还是比较原始,我觉得用来开发小游戏可能还不错,规模稍微大一点,就需要好好考量了。
3、PC上性能还OK,但最后貌似我也没上手机真机调试,这个我没有发言权。
4、as3还是比较灵活,写代码也有挺爽快的感觉,给我留下的印象仅次于c#。如果以后有机会开发flash游戏,我还是挺乐观的。
5、Adobe对于这块的投入貌似很萎缩,flash开发者们以及社区都不够繁荣。
6、开发手机游戏的话,还是用专业的引擎吧。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:732908次
积分:9140
积分:9140
排名:第1797名
原创:244篇
评论:359条
(1)(1)(1)(1)(3)(1)(2)(2)(2)(3)(2)(2)(3)(2)(1)(2)(2)(1)(2)(4)(5)(2)(1)(1)(1)(1)(3)(1)(1)(1)(1)(1)(3)(1)(1)(2)(2)(2)(3)(3)(3)(3)(4)(1)(8)(8)(5)(5)(9)(8)(5)(6)(5)(10)(7)(17)(25)(16)(11)(8)(2)(7)}

我要回帖

更多关于 starling 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信