2013-10-06 4 views
0

Я создаю игру в Starling и хочу использовать XML для сохранения всех сообщений, которые появляются в игре. Вот пример того, как он будет использоваться:ActionScript 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-х типов взаимодействия с элементом. изучать, говорить и действовать (например, pickup). Идентификатор состояния определяет состояние игры (насколько прогресс был достигнут в игре), это важно, поскольку сообщения могут меняться в зависимости от того, что произошло. Когда произошло событие, это обновляет все в игре. НАПРИМЕР.

Состояние 1:

«! Я не могу пикап этот пункт, пока я разговаривал с Роджером»

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

Государственных 2: «Я поднял предмет, потому что я говорил с Роджером»

Я создал класс называется окно сообщений, который извлекает XMLList, на основе состояния и currentTarget (пункт)

Что такое хороший способ получить только те узлы, я хочу:

Я хочу, чтобы получить :

<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> 

Я не хочу, чтобы выписать огромный, если заявление, чтобы вернуть узлы, которые я хочу:

//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.... 

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

UPDATE:

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

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

    } 

ответ

2

Вы снова оставляя много места для интерпретаций. Я имею в виду, что такое 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.

Дополнительную информацию о обработке XML см. В http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/XML.html.

+0

Извинения позвольте мне внести изменения в код для большей ясности. –

+0

Спасибо, что это прекрасно. –

Смежные вопросы