Actionscript XML - получение списка выбранных узлов

Я создаю игру в Starling и хочу использовать XML, чтобы сохранить весь диалог сообщений, который появляется в игре. Вот пример того, как это будет использоваться:

<?xml version="1.0" encoding="utf-8" ?>
<data>
    <items>
        <bottle>
            <interact>
                <examine>
                    <state id="1">
                        <message id="1">This is the first time I have seen this bottle</message>
                        <message id="2">This is the first time I have seen this bottle 2</message>
                        <message id="3">This is the first time I have seen this bottle 3</message>
                        <message id="4">This is the first time I have seen this bottle 4</message>
                    </state>

                    <state id="2">
                        <message id="1">This is the second time I have seen this bottle</message>
                        <message id="2">This is the second time I have seen this bottle 2</message>
                        <message id="3">This is the second time I have seen this bottle 3</message>
                        <message id="4">This is the second time I have seen this bottle 4</message>
                    </state>

                    <state id="3">
                        <message id="1">This is the third time I have seen this bottle</message>
                        <message id="2">This is the third time I have seen this bottle 2</message>
                        <message id="3">This is the third time I have seen this bottle 3</message>
                        <message id="4">This is the third time I have seen this bottle 4</message>
                    </state>    
                </examine>
                <chat>
                    <state>
                        <message id="1">I cannot talk to a bottle</message>
                        <message id="2">I cannot talk to a bottle 2</message>
                        <message id="3">I cannot talk to a bottle 3</message>
                        <message id="4">I cannot talk to a bottle 4</message>
                    </state>
                </chat>

                <action>
                    <state>
                        <message id="1">I picked up the bottle</message>
                        <message id="2">I picked up the bottle 2</message>
                        <message id="3">I picked up the bottle 3</message>
                        <message id="4">I picked up the bottle 4</message>
                    </state>
                </action>
            </interact>
        </bottle>

        <item2>
            <interact>
                <examine>
                    <state id="1">
                        <message id="1">This is the first time I have seen item 1</message>
                        <message id="2">This is the first time I have seen item 2</message>
                        <message id="3">This is the first time I have seen item 3</message>
                    </state>

                    <state id="2">
                        <message id="1">This is the second time I have seen item 1</message>
                        <message id="2">This is the second time I have seen item 2</message>
                        <message id="3">This is the second time I have seen item 3</message>
                    </state>

                    <state id="3">
                        <message id="1">This is the third time I have seen item 1</message>
                        <message id="2">This is the third time I have seen item 2</message>
                        <message id="3">This is the third time I have seen item 3</message>
                    </state>    
                </examine>
                <chat>
                    <state>
                        <message id="1">I cannot talk to a item</message>
                        <message id="2">I cannot talk to a item 2</message>
                        <message id="3">I cannot talk to a item 3</message>
                        <message id="4">I cannot talk to a item 4</message>
                    </state>
                </chat>

                <action>
                    <state>
                        <message id="1">I picked up the item</message>
                        <message id="2">This may be useful</message>
                        <message id="3">I will use this for something</message>
                        <message id="4">I have put it in my pocket</message>
                    </state>
                </action>
            </interact>
        </item2>
    </items>

    <characters></characters>

    <backgrounds></backgrounds>

</data>

Как видите, есть структура для 3 типов взаимодействия с предметом. исследовать, говорить и действовать (например, пикап). Идентификатор состояния определяет состояние игры (какой прогресс был достигнут в игре), это важно, поскольку сообщения могут меняться в зависимости от того, что произошло. Когда событие произошло, это обновляет все в игре. НАПРИМЕР

Состояние 1:

"Я не могу забрать этот предмет, пока не поговорю с Роджером!"

Поговорите с Роджером и перейдите к состоянию 2:

Состояние 2:

"Я взял предмет, потому что я говорил с Роджером!"

Я создал класс с именем message box, который извлекает XMLList на основе состояния и currentTarget (item)

Какой хороший способ получить ТОЛЬКО те узлы, которые я хочу:

Я хочу получить:

<message id="1">I picked up the item</message>
<message id="2">This may be useful</message>
<message id="3">I will use this for something</message>
<message id="4">I have put it in my pocket</message>

Я не хочу выписывать огромное выражение if для возврата нужных мне узлов:

//get a list
if (item2 && state == 1) {
var message:XMLList = messageXML.items.item2.interaction.action.state.text();
}

else if(item2 && state = 2) {
var message:XMLList = messageXML.items.item2.interaction.action.state.text();
}

etc....

Большая проблема, любая помощь будет принята с благодарностью.

ОБНОВИТЬ:

Я хочу, чтобы он возвращал XMLList со строками, переданными в методе, подобном этому:

private function searchForMessages(message:XML, target:String, state):XMLList 
    {

    }

1 ответ

Решение

Вы снова оставляете много места для интерпретаций. Я имею в виду, что это item2 в вашем if условия? String, Boolean, XMLNode, так далее? Возможно, вам также нужно получить доступ к examine а также chat узлы в некоторых ситуациях? Ваш код доступа action независимо от state, но в вашем примере XML есть только одно состояние действия?

В любом случае, вот базовый пример стиля E4X для динамического доступа к узлам по их имени и их id атрибуты:

var itemName:String = 'item2';
var interactionType:String = 'examine';
var stateId:uint = 1;
var messageId:uint = 2;

var message:XMLList = messageXML.items[itemName].interact[interactionType].state.(@id == stateId).message.(@id == messageId);

Это равняется следующему "статическому" пути

messageXML.items.item2.interact.examine.state.(@id == 1).message.(@id == 2)

так message будет содержать узел с текстом This is the first time I have seen item 2,

См. http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/XML.html для получения дополнительной информации об обработке XML.

Другие вопросы по тегам