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.