Показать сообщение отдельно
Старый 05.06.2010, 14:25
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 8  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Механизм в бета-тестировании, ногами не пинать ))


Код AS3:
package main {
    import flash.display.*;
	import flash.text.*;
	import flash.events.*;	
	import main.*;	
 
	public class AppQuester extends Sprite {
 
		private var questStep;
		private var questContent:XMLList;
		private var questName:String;
		private var questWaitingAction:String;
		private var questWaitingParameter:String;
		private var questStepNumber:int;
		private var containers:Object;
 
		public function AppQuester(_containers,questInfo) {
 
			// Для последующей передачи ссылки на враппер при необходимости
			containers = _containers;
 
			// Получаем данные по квесту			
			var questArr:Array = questInfo.split("|");
			questName = questArr[0];
			questStepNumber = int(questArr[1]);
			questContent = GlobalQuestData.elements(questName);
 
			// Если квест есть и шаг требует вывода на экран - выводим
			if (questContent!=null) {					
				var action:String = questContent.step[questStepNumber].attribute("action");
				switch(action) {
					case "viewImmediately": showQuestStep(); break;
				}
			}
		}
 
		public function checkEvent(eventData) {
			if (eventData.action.toString()==questWaitingAction && eventData.parameter.toString()==questWaitingParameter) {	// получили ожидаемое действие пользователя
 
				// Если было открыто - убираем с экрана (позже поставим нормальное удаление)
				if (questStep) questStep.y = -2000;
 
				// Переходим к следующему шагу
				// и выполняем действие, заложенное на этом шаге
				questStepNumber++;
				showQuestStep();
 
			}
		}
 
 
 
		private function showQuestStep() {
 
			// Запоминаем действие и параметр, который ждем
			questWaitingAction = questContent.step[questStepNumber].attribute("waitingAction");
			questWaitingParameter = questContent.step[questStepNumber].attribute("waitingParameter");
 
			// Если требуется закрыть все окна - закрываем
			if (questContent.step[questStepNumber].attribute("closeBefore").toString()=="closeAllComplexInterfaces") {
				var appEvent = new AppEvent("closeAllComplexInterfaces","",true)
				dispatchEvent(appEvent);	
			}
			// Если требуется записать статус - записываем
			if (questContent.step[questStepNumber].attribute("saveStatus").toString()!="") {
				var requestData = { questStatus : questContent.step[questStepNumber].attribute("saveStatus") };
				var connDB = new DataConnectorDB(containers.wrapper,"saveQuestStatus",requestData);
			}
 
			// Открываем лопух правильной формы и ориентации
			var windowsVariant:String = questContent.step[questStepNumber].attribute("windowVariant").toString();
			switch(windowsVariant) {
				case "flipX" : 	questStep = new QuestStepFlipX();
								break;
				case "info" : 	questStep = new QuestInfo();
								break;
				case "title" : 	questStep = new QuestTitle();
								break;
				default: 	questStep = new QuestStep();		
			}
 
			// Позиционируем лопух и заполняем контентом
			questStep.x = questContent.step[questStepNumber].attribute("mousePositionX");
			questStep.y = questContent.step[questStepNumber].attribute("mousePositionY");
			questStep.stepTitle.htmlText = "<b>" + questContent.step[questStepNumber].stepTitle + "</b>";
			questStep.stepText.htmlText = questContent.step[questStepNumber].stepText;
 
			questStep.btnClose.addEventListener(MouseEvent.CLICK,closeStep);
 
			addChild(questStep);			
		}
 
		private function closeStep(e:Event) {
			removeChild(e.target.parent);
		}		
 
 
	}
}
Квест прописан в таблице пользователя в виде тесковой строки questName|questStep. GlobalQuestData - это глобальный объект вида:

Код AS3:
 
package {
    public var GlobalQuestData:XML = 
		<quests>
 
			<startQuest>
 
				<step stepNumber="0" mousePositionX="165" mousePositionY="215" 
						action="viewImmediately" condition="noCondition" item="noItem"
						waitingAction="openObjectControlInterface"
						waitingParameter="Farm" 	>
					<stepTitle>Приветствуем Вас в игре "Поездатый товарняк"!!!</stepTitle>
					<stepText>Сейчас Вам нужно произвести первый товар. Нажмите здесь, чтобы запустить производство.</stepText>
				</step>
 
				<step stepNumber="1" mousePositionX="655" mousePositionY="220" 
						windowVariant="flipX"
						waitingAction="startManufacture"
						waitingParameter="" 	>
					<stepTitle>Всю эту продукцию Вы можете производить</stepTitle>
					<stepText>Нажмите здесь, чтобы начать производство риса.</stepText>
				</step>
 
...
 
 
 
			</startQuest>
 
 
 
		</quests>	;
}

При загрузке приложения, смотрим, нет ли у пользователя активного квеста и на каком шаге. Если есть - порождаем объект класса AppQuester.

В необходимых точках приложения, вызываем метод checkEvent, который проверяет, не ожидает ли квест этого события.


Последний раз редактировалось mikhailk; 05.06.2010 в 14:31.