我正在尝试将游戏从纯AS3移植到Flex4。
首先,我想尽可能少地修改代码。
所以我有一个包含3个用户头像的比赛场地:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:comps="*">
<comps:User id="user0" x="20" y="20"/>
<comps:User id="user1" x="250" y="20"/>
<comps:User id="user2" x="125" y="250"/>
</s:Application>
它运作正常,但我有以下问题:
我更愿意通过用户[0],用户[1],用户[2] 来引用这些自定义组件。
而不是上面代码中的user0,user1,user2。
如何实现这一目标?我可能需要使用Repeater或DataGroup(有什么区别),但是如何处理不同的坐标呢?
我应该在坐标中引入一个数组(或者ArrayCollection?或ArrayList?这让我在Flex中迷惑)并以某种方式使用它?
更新
我尝试了以下内容:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:comps="*">
<fx:Declarations>
<s:ArrayCollection id="myAC" source="{myDP}"/>
</fx:Declarations>
<fx:Script>
<![CDATA[
[Bindable]
public var myDP:Array = [
{ x: 20, y: 20 },
{ x: 250, y: 20 },
{ x: 120, y: 250 },
];
]]>
</fx:Script>
<mx:VBox>
<mx:Repeater id="r" dataProvider="{myAC}">
<comps:User id="user" x="{r.currentItem.x}" y="{r.currentItem.y}"/>
</mx:Repeater>
</mx:VBox>
</s:Application>
但是组件被绘制在错误的位置(垂直行)......
答案 0 :(得分:0)
如何实现这一目标?
您应该创建一个用户元素的数组或ArrayCollection;概念上是这样的:
var user : Array = new Array();
// create user1
var user1 : userType = new userType();
// set properties on user1
// .....
user.push(user1);
// create user2
var user2 : userType = new userType();
// set properties on user2
// .....
user.push(user2);
// create user3
var user3 : userType = new userType();
// set properties on user3
// .....
user.push(user3);
您可以编写创建用户对象所需的任何逻辑。从概念上讲,这正是我用Flextras日历创造的日子。根据显示的日历月,我们决定创建多少天,创建它们并将它们存储在一个数组中。您可以使用任何逻辑来创建适合您游戏的用户。
I probably need to use Repeater or DataGroup (what's the difference), but how do I handle the differing coordinates?
Repeater和DataGroup都不是数组。它们不会为您创建数组或dataProvider,并且不允许您像访问数组那样访问元素。
转发器基本上是循环的MXML版本,我相信应该不惜一切代价避免它们。 MXML不是一个很好的循环语言。
DataGroup旨在根据您指定的数据(dataProvider)及其布局类(Vertical,或Horizontal或Tile)显示内容。听起来像你想要一个自定义布局;所以我不确定我是否建议使用DataGroup进行显示。
Should I introduce an array (or ArrayCollection? or ArrayList? this confuses me in Flex) of coordinates and somehow use it?
是的,我会使用一个数组。 ArrayCollection只是一个数组的包装器,它提供了对数据进行过滤和排序的API。 ArrayList只是一个实现IList接口的数组,因此它可以用作DataGroup或其他ListBase类(如DataGrid)的dataProvider。
您发布的代码不是我推荐的方法。如果在ActionScript中执行此操作,您将对组件的定位和布局进行更精细的控制。您可以通过阅读Flex Component LifeCycle.来了解UIComponents如何在屏幕上绘图;以及你如何能够把它变成“让事情发挥作用”。在这种情况下,“制作东西与你的定位有关。
我正在尝试将游戏从纯AS3移植到Flex4。
我知道你在帖子开头而不是结尾时说过这个,但我想问一个问题“为什么?” Flex不是为游戏而设计的;而且我不确定我是否会建议把它作为游戏引擎。如果你想创建菜单或高分榜,我可以看到它可能对你有什么好处。但是,您应该能够轻松地并排使用AS3代码和Flex代码,而不必重新编写/重做游戏。