通过id [0],id [1],id [2]引用组件(可能通过使用Repeater或DataGroup)

时间:2011-08-13 18:59:00

标签: arrays flex flex4 repeater

我正在尝试将游戏从纯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>

enter image description here

它运作正常,但我有以下问题:

我更愿意通过用户[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>

但是组件被绘制在错误的位置(垂直行)......

1 个答案:

答案 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,或Horizo​​ntal或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代码,而不必重新编写/重做游戏。