Microsoft Agent. Часть II
03.12.2007 от Иван Ширко AnEnum: IEnumVariant;
flag: Cardinal;
V: OleVariant;
begin
//получаем интерфейс анимаций агента
AnEnum := (Character.AnimationNames.Enum) as IEnumVariant;
//Сбрасываем указатель списка на начало
AnEnum.Reset;
//перебираем все анимации и добавляем их в наш список
repeat
AnEnum.Next(1, V, flag);
if (VarToStr(V) <> '') then
st.Add(V);
until (flag = 0);
end;Давайте проверим работоспособность данной процедуры. Добавьте на форму кнопку Button1 и список ListBox1. Дайте заголовок кнопке «Список анимаций» и запишите процедуру обработки её нажатия:procedure TForm1.Button1Click(Sender: TObject);
begin
GetAgentAnim(ListBox1.Items);
end;Данная процедура записывает список анимаций загруженного персонажа в компонент ListBox1. А теперь сделаем так, чтобы при двойном щелчке мышкой по ListBox’у Джин проигрывал выбранную анимацию:
procedure TForm1.ListBox1DblClick(Sender: TObject);
begin
Request := Character.Play(ListBox1.Items[ListBox1.ItemIndex]);
end;
Теперь посмотрим, зачем нам переменная Request (её мы объявили как глобальную). Именно она служит для синхронизации действий персонажа (либо персонажей, если их несколько). Интерфейс IAgentCtlRequest имеет одно очень полезное свойство – Status. В зависимости от состояния запроса, который в данный момент выполняет персонаж, это свойство принимает следующие значения:
Status | Пояснения
0 Запрос успешно выполнен
1 Запрос «провалился»
2 Запрос не выполняется, т.к. ждёт завершения обработки других запросов
3 Запрос прерван
4 Запрос обрабатывается
На основе этой таблички легко написать процедуру, которая будет дожидаться выполнения всех запросов к персонажу, а затем вернёт программе управление:
procedure WaitFor(Request:IAgentCtlRequest);
begin
repeat
Application.ProcessMessages;
Status := Request.Status;
until (Request.Status <> 2) and (Request.Status <> 4);
end;
Для примера добавьте на форму кнопку «Пример WaitFor»:
procedure TForm1.Button3Click(Sender: TObject);
begin
//Джин произносит фразу
Request := Character.Speak('Доброе утро', EmptyParam);
{waitfor(Request);}
//Показываем сообщение
ShowMessage('Всё');
end;
05.06.2008 в 05:31
Просто превосходно!
17.07.2008 в 17:36
Конкретно и понятно.