Ссылка на компоненты по id [0], id [1], id [2] (возможно, с использованием Repeater или DataGroup) - PullRequest
0 голосов
/ 13 августа 2011

Я пытаюсь портировать игру с чистого 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

Работает нормально, но у меня следующая проблема:

Я бы предпочел ссылаться на эти пользовательские компоненты user [0], user [1], user [2] .

И не user0, user1, user2, как в коде выше.

Как этого добиться? Возможно, мне нужно использовать Repeater или DataGroup (в чем разница), но как мне обрабатывать разные координаты?

Должен ли я ввести массив (или ArrayCollection? Или ArrayList? Это смущает меня во Flex) координат и каким-то образом его использовать?

UPDATE:

Я пробовал следующее:

<?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 голосов
/ 14 августа 2011

Как этого добиться?

Вы должны создать массив или 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 просто не очень хороший язык для зацикливания.

Группа данных предназначена для отображения объектов на основе указанных вами данных (dataProvider) и класса макета (вертикальный, горизонтальный или мозаичный). Для меня это звучит так, будто вы хотите нестандартный макет; поэтому я не уверен, что рекомендую использовать 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, поэтому его можно использовать в качестве dataProvider для DataGroup или других классов ListBase, таких как DataGrid.

Код, который вы разместили, не является подходом, который я бы рекомендовал. Если вы сделаете это в ActionScript, у вас будет гораздо более детальный контроль над расположением и расположением компонента. Вы можете извлечь пользу из чтения Flex Component LifeCycle. , чтобы понять, как компоненты UIC рисуют себя на экране; и как вы можете подключиться к этому, чтобы «заставить вещи работать». В этом случае «заставьте вещи работать» относится к вашему позиционированию.

Я пытаюсь портировать игру с чистого AS3 на Flex4.

Я знаю, что вы сказали это в начале своего поста, а не в конце, но я хотел задать вопрос "Почему?" Flex не был предназначен для игр; и я не уверен, что рекомендую петь как игровой движок. Я вижу, чем это может быть полезно для вас, если вы хотите создать меню или списки рекордов. Но вы должны достаточно легко использовать код AS3 и код Flex без необходимости переписывать / переделывать игру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...