Ну вот не так уж и много времени прошло после первой статьи про ms agent в Delphi. Как я бы хотел бы поговорить о продолжении. А точнее в этой статье хотел бы рассмотреть анимации своих персонажей, а также хотел рассказать как можно добавить в меню своему персонажу новые команды. Меню персонажа — когда нажимаете правой кнопкой мыши и появляется контекстное меню, по умолчанию там один пункт — «Скрыть», по нажатию на который скрывается наш персонаж, как скрыть персонаж еще и программного мы также здесь рассмотрим, это можно отнести также как еще одному виду анимации нашего персонажа. Давайте сперва поговорим о добавлении новых команд в меню нашего персонажа. За добавление новых команд в меню нашего персонажа отвечает объект Commands, обращаться к нему можно следующем образом.
procedure TForm1.Button5Click(Sender: TObject);
begin
Agent1.Characters.Character('ROCKY').Commands.Add('Test','&Test',1,1,True);
end;
Кроме этого можно обращаться к данному объекту и добавлять в меню новые команды не напрямую через компонент, а через объекты, которые отвечают за хранение персонажа и за хранение его действий, вот на событие OnClick напишем следующий код
procedure TForm1.Button6Click(Sender: TObject);
begin
Chrr.Commands.Add('Test2','&Test2',1,1,True);
end;
Тут думаю все понятно, Commands отвечает за объект команд, Add - добавляет новую команду, первый параметр название нашей команды, а второй параметр — название, которое непосредственно будет отображаться в меню нашего персонажа. Теперь можете в этом сами убедиться, запустить приложения и как только появиться наш персонаж вызовите контекстное меню нажав по персонажу правой кнопкой мыши и Вы увидите Ваш пункт меню. Теперь как бы этот пункт нам нужен для того, чтобы выполнять какие-либо действия. Теперь давайте сделаем обработку нашей команды, для этого выделим наш компонент TAgent и перейдем в список событий данного компонента. Найдем событие OnCommand - данное событие отвечает за выполнения всех списка команд, а чтобы конкретной командой управлять, нам необходимо сделать проверку на выбранную пользователем команду. Для этого на событие OnCommand напишем следующий код
procedure TForm1.Agent1Command(ASender: TObject;
const UserInput: IDispatch);
var
cmd:IAgentCtlUserInput;
begin
cmd:=UserInput as IAgentCtlUserInput;
if cmd.Name='Test' then
ShowMessage('Test run');
end;
То есть тут все понятно, просто делаем проверку на имя нажатой команды, если это было Test, то выполняем одно действие, можно добавить проверку на Test2 и вывести, например, другое сообщение. Вот так делается обработка команд в контекстном меню нашего помощника.
Теперь приступим к рассмотрению анимаций нашего персонажа. В прошлой статье про ms agent мы рассматривали некоторые анимации персонажа, а точнее перемещение его по экрану, это в какой-то степени тоже является анимаций. А сейчас рассмотрим более подробный список анимаций и вообще как его получить для каждого персонажа именно свой список. Вообще чтобы проиграть анимацию необходимо воспользоваться методом Play, чтобы остановить соответственно воспользоваться методом Stop. В параметрах указывается название анимации. Вообще чтобы получить список анимаций можно, например, скачать программу Agent Viewer. Через данную программу можно загружать вашего персонажа и в текстовом поле появляются весь список анимаций, который можно проиграть для данного персонажа. Проиграть анимацию можно следующим образом
procedure TForm1.Button7Click(Sender: TObject);
begin
req:=Chrr.Play('Greeting');
end;
Данную анимацию — Greeting, я получил с помощью программы — Agent Viewer и просто написал сюда, данная анимация будет проигрываться только для моего персонажа.Кроме того, сделать анимацию можно еще с помощью одного метода — GestureAt.
procedure TForm1.Button3Click(Sender: TObject);
begin
req:=chrr.GestureAt(100,20);
end;
Ну теперь бы хотел приступить к получению списка анимаций еще одним способ, это с из своего приложения. Сделать это можно следующим образом
procedure TForm1.Button4Click(Sender: TObject);
var
ANames : IAgentCtlAnimationNames;
Enum : IEnumVariant;
V : OLEVariant;
Fetched : cardinal;
S : TStringList;
begin
S.Clear;
ANames := Chrr.AnimationNames;
Enum := ANames.Enum as IEnumVariant;
Repeat
Enum.Next(1, V, Fetched);
If VarToStr(V) <> '' Then
S.Add(V);
Until Fetched = 0;
ListBox1.Items := S;
end;
Здесь перебор идет с помощью интерфейса IAgentCtlAnimationNames, а Enum - это указатель на один из интерфейсов IEnumXXX, в нашем случае IEnumVariant, который содержит элемент коллекции анимаций в данном случае.
Как видите работа с ms agent не такая уж и сложная, так что вполне можно украшать Ваши приложениями такими персонажами. И в добавок хотелось сказать, что пользуйтесь программой — Microsоft Agent Character Editor, которая позволила бы Вам создавать своих собственных персонажей.
Исходник статьи можно скачать тут