Русская справка по Delphi 5
Мастерская Delphi программирования.
Главная Мастерская Архив Ссылки Отдых Для гостей  
Секреты VCL Секреты API Секреты ActiveX        

Использование Ms Agent в проектах Delphi.

При создании этого материала были использованы Microsoft Agent Control 2.0 (Version 2.0) и Персонаж Merlin. Необходимые компоненты можно загрузить сдесь.

Содержание:

Установка.

Установка Ms Agent не должна вызвать проблем. Распакуйте архив и запустите файл msagent.exe на выполнение. Далее следуйте инструкциям указаным при установке. Аналогичным образом действуйте при установке персонажа "Мерлин" из файла merlin.exe.

Наверх

Экспорт в Delphi.

Чтобы использовать Ms Agent в своих приложениях необнодимо импортировать ActiveX Control в среду Delphi. Воспользуйтесь приведенным ниже алгаритмом.
  1. В меню Component выберите Install ActiveX control ...
  2. В появившемся диалоговом окне, в списке, найдите Microsoft Agent Control 2.0 (Version 2.0). Если в списке такой строки нет, то нажмите кнопку Add и наидите файл Agentctl.dll.
  3. Выберете строку Microsoft Agent Control 2.0 (Version 2.0). В поле Class names должно появится слово TAgent, и загорется кнопка Install...
  4. Нажмите кнопку Install...
Проверте вкладку ActiveX. Там должен появится новый значек - .
Наверх

Об Ms Agent.

Ms Agent - это обычный ActiveX компонент с большим набором интерфейсов. Наиболее часто будут использоаваться следующе:
  • IAgentCtlCharacters - Используется для загрузки и выгрузки персонаей. Содержит список всех загруженных персонажей.
  • IAgentCtlCharacterEx - Самый основной интерфейс. Через него осуществляются все манипуляции с персонажем.
  • IAgentCtlRequest - Хранит в себе состояние персонажа. Часто используется для остановки действий персонажа и синхронизации действий нескольких персонажей между собой.

    Существуют и другие полезные интерфейсы:

  • IAgentCtlAnimationNames - осуществляет перебор всех анимаций реализованных в персонаже.
  • IAgentCtlBalloonEx - отвечает за область в которую выводится текст, когда персонаж разговаривает.
Более подробную информацию о интерфейсах реализованных в Ms Agent вы узнаете изучив модуль AgentObjects_TLB.pas, который создается при импортировании AcniveX в среду Delphi.
Наверх

Использование в своем приложении.

Рассмотрим небольшой пример приложения который раскрывает некоторые возможности предоставляемые Ms Agent. На рисунке показан внешний вид окна приложения.

Модуль Main

В верхней части окна расположены кнопки: "Показать", "Скрыть", "Домой". Действия осуществляемые при нежатии кнопок понятны из названий. "Домом" для персонажа служит панель расположенная ниже. При нажатии кнопки "Домой" персонаж перемещается на панель из любой точки экрана. Правее панели расположен список в котором перечислены все анимации реализованные в персонаже. При выборе пункта из списка персонаж проигрывает соответствующую анимацию. Если воспроизводится зацикленная анимация, ее можно остановить кликнув по персонажу. Воспроизведение остановится и персонаж вернется в исходное положение. Справа от списка анимаций расположена группа компонентов которая позволяет перемещать персонаж в заданную точку. Введите значенич координат X, Y и нежмите кнопку Go!. Персонаж переместится воспроизведя соответствующую анимацию. Персонаж переместится даже если он скрыт, только его не будет видно на экране. Ниже слева расположен компонент в котором отображается описание персонажа и его версия. Правее находится кнопка Think. При нажатии этой кнопки персонаж говорит запрограммированную фразу. Когда на персонже происходит щелчек правой кнопкой мыши вызывается Popup меню персонажа. В это меню добавлены две комманды: "Demo" и "Test". Сами по себе эти комманды бесполезны, они просто проигрывают анимации. Но мы имеем возможность задавать агенту собственные комманды.

Теперь разберемся как это все работает. Подготавливаем персонаж к работе. Для этого в обработчике onCreate пишем следуюший код:

procedure TForm1.FormCreate(Sender: TObject);
begin
 Agent1.Characters.Load('Char', 'merlin.acs'); //Загружаем персонаж из файла merlin.acs
 Character := Agent1.Characters.Character('Char') as IAgentCtlCharacterEx;
 //Присваеваем указатель на интерфейс IAgentCtlCharacterEx переменной
 AgentAnimationEnum; //Заполняем список анимаций
 ToolButton3Click(Sender); //Позиционируем персонаж в "Домашней позиции"
 Character.Commands.Add('Test', '&Test', 1, 1, True);
 Character.Commands.Add('Demo', '&Demo', 1, 1, True);// Добавляем в меню две комманды
 Memo1.Lines.Clear;
{ Показать опсиание персонажа }
 Memo1.Lines.Add(Character.Description);
 Memo1.Lines.Add('Version ' + Character.Get_Version);
end;
 
За заполнение списка анимациями отвечает процедура AgentAnimationEnum. Ниже представлен ее код.
procedure TForm1.AgentAnimationEnum;
var AEnum: IEnumVariant;
    Fetch: Cardinal;
    V: OleVariant;
begin
 AnimationNames := Character.AnimationNames;
 AEnum := AnimationNames.Enum as IEnumVariant;
 // Получаем интерфейс IEnumVariant для перебора анимаций
 AEnum.Reset;
 ListBox1.Items.Clear; // Подготавливаем IEnumVariant к перебору анимаций и список к их хранению
Repeat
 AEnum.Next(1,V,Fetch); //Начинаем перебор анимаций
  If VarToStr(V) <> EmptyStr Then // Пропускаем пустые строки
   ListBox1.Items.Add(V); // Добавляем имя анимации в список
until Fetch=0; //выходим из цикла если перебор закончен

end;
При нажатии на кнопку "Домой" позиционируем персонаж в центре панели. Ниже представлен код обработчика события.
procedure TForm1.ToolButton3Click(Sender: TObject);
var
 PanelPos : TPoint;
 Pos      : TPoint;
 X,Y      : Integer;
begin
 PanelPos.x := Panel1.Left;
 PanelPos.Y := Panel1.Top;
 Pos := ClientToScreen(PanelPos); // Переводим координаты панели в координаты экрана
 // Вычисляем координаты точки перемещения
 X := Pos.X+Panel1.Width DIV 2  - Character.Width DIV 2;
 Y := Pos.y+Panel1.Height DIV 2 - Character.Height DIV 2;
 Character.MoveTo(X,Y,1); // перемещаем Персонаж
end;
При выборе имени анимации из списка персонаж проигрывает ее. Метод play() возврашает указатель на IAgentctlRequest. Его необходимо сохранить если понадобится остановить ваоспризведение анимации.
procedure TForm1.ListBox1Click(Sender: TObject);
begin
 ListBox1.Hint := ListBox1.Items[Listbox1.ItemIndex];
 Req := Character.Play(WideString(ListBox1.Items[Listbox1.ItemIndex]));
 //Воспоризводим выбранную анимацию
end;
Если кликнуть мышкой на персонаже, будет прекращено воспроизведение анимации. Это достигается следующем кодом.
procedure TForm1.Agent1Click(Sender: TObject;
  const CharacterID: WideString; Button, Shift, x, y: Smallint);
begin
try
 Character.Stop(Req); // Останавливаем действие которое содержится в переменной Req
finally
 Req := Character.Play('RestPose'); // При любом исходе возвращаем персонаж в исходное состояние
end;
end;
Персонаж эффектно перемещается по экрану. Перемещение в заданные координаты осуществляется следующим кодом.
procedure TForm1.Button1Click(Sender: TObject);
var X,Y: Integer;
begin
try
 X := StrToInt(Edit1.Text);
 Y := StrToInt(Edit2.Text); // Преобразуем введенные координаты из стороки в число
 Character.MoveTo(X,Y,1); // перемещаем персонаж
except
 Toolbutton1click(nil); // При возникновении ошибки перемещаемся в "домашнее положение"
end;
end;
Персонаж можно заставить говорить заранее определенные фразы. Заставим его произнести "мысли вслух". Попробуем смоделировать поведение персонажа, как будто он думает. Получается довольно реалистично.
procedure TForm1.Button3Click(Sender: TObject);
begin
 Character.Play('Think'); // Проиграть анимацию задумчивости
 Character.Think('И что от меня хотят?'); // Произнести фразу
end;
Персонажу можно добавить собственные комманды управления. При создании окна приложения были добавлены две. Теперь рассмотрим как осуществить обработку соответствующей комманды.
procedure TForm1.Agent1Command(Sender: TObject;
  const UserInput: IDispatch);
var
 Cmd : IAgentCtlUserInput;
begin
 Cmd := UserInput as IAgentCtlUserInput;
 If Cmd.Name = 'Test' Then // Если выбрана комманда "Test"
 // Соответствующие действия
 begin
  Character.Speak('Вызвали команду Test','');
  req := Character.Play('Processing');
 end;
 If Cmd.Name = 'Demo' Then // Если выбрана комманда "Demo"
// Соответствующие действия
 begin
  Character.Speak('Вызвали команду Demo','');
  req := Character.Play('DoMagic1');
  req := Character.Play('DoMagic2');
  Req := Character.Play('RestPose');
 end;
end;
В этом примере не затронуты еше несколько возможностей Ms Agent. Например возможность манипулировать с областью вывода текста - Baloon, или возможность управлять агентом голосовыми коммандами. Также использование одновременно нескольких персонажей. Например можно заставить их ругаться между собой или поиграть в пятнажки. Возможностей еще много. Чтобы узнать больше почитайте документацию или посетите сайт Microsoft. Полностью исходник примера находится здесь.

Наверх

Использование в HTML

Сама идея Ms Agent достаточно необычна и привлекательна. Использование технологии ActiveX позволяет использовать персонаж при оформлении Web страниц. Получается довольно оригинально. Судите сами, вот страница используюшая Ms Agent. Она протестирована на Internet Explorer 5.0.

Наверх

Персонажи.

Помимо персонажей разработанных компанией Microsoft, у вас есть возможность создать собственный. Для этих целей служит редактор персонажей.
Microsoft Agent редактор персонажей.

Попробуйте, может у вас что-нибуть получится.

Наверх

Download

Microsoft Agent Control 2.0 (Version 2.0)
Персонаж "Merlin"
Microsoft Agent Character Editor
Наверх

Главная Мастерская Архив Ссылки Отдых Для гостей  
Секреты VCL Секреты API Секреты ActiveX        
Дизайн и программирование - Valler© ,2000,2001.
http://www.valler.narod.ru


Используются технологии uCoz