Звуковий файл,
який будемо використовувати для анімації помістимо в папку з програмою і
назвемо наприклад arash.mp3, в програмі визначимо назву музичного файлу
MUZIKA db
"play arash.mp3",0
та запустимо
call
mciSendStringA,offset MUZIKA,0,0,0
Під музику персонаж буде виконувати задану послідовність дій. Список можливих дій персонажу наведено нижче: 'Acknowledge','Alert','Announce','Blink','Confused','Congratulate','Congratulate_2','Decline','DoMagic1','DoMagic2','DontRecognize','Explain','GestureDown','GestureLeft','GestureRight','GestureUp','GetAttention','GetAttentionContinued','GetAttentionReturn','Greet','Hearing_1','Hearing_2','Hearing_3','Hearing_4','Idle1_1','Idle1_2','Idle1_3','Idle1_4','Idle1_5','Idle1_6','Idle2_1','Idle2_2','Idle2_3','Idle3_1','Idle3_2','LookDown','LookDownBlink','LookDownReturn','LookLeft','LookLeftBlink','LookLeftReturn','LookRight','LookRightBlink','LookRightReturn','LookUp','LookUpBlink','LookUpReturn','LookUpLeft','LookUpLeftBlink','LookUpLeftReturn','LookUpRight','LookUpRightBlink','LookUpRightReturn','MoveDown','MoveLeft','MoveRight','MoveUp','Pleased','Process','Processing','Read','ReadContinued','ReadReturn','Reading','RestPose','Sad','Search','Searching','StartListening','StopListening','Suggest','Surprised','Think','Thinking','Uncertain','Wave','Write','WriteContinued','WriteReturn','Writing','Hide','Show'.
Висновок
В даному
курсовому проекті було описано специфічний спосіб створення програми для
анімації музичного твору. Для анімації було обрано казковий персонаж Microsoft Agent “Чарівник”.
Список
літературних джерел
1. Приклади використання функцій
(електронна база) ASM_EXAMPLES
2. Методичні вказівки з курсу
“Сиcтемне програмування та операційні системи” ЗБІРНИК ЛАБОРАТОРНИХ РОБІТ
3. Довідка по АРІ функціях “Borland
C++ v.6.0”
4. Методичні вказівки для виконання
курсової роботи Kurs_IIT.doc
5. Пирогов В. Ю. Ассемблер для
Windows. — М.: Издатель Молгачева С.В., 2002. —552 с.: ил.
6. Зубков С. В. Assembler для DOS,
Windows и UNIX. - М: ДМК. Пресс, 2000. - 608 с.: ил.
7. Магда Ю. С. Ассемблер. Разработка
и оптимизация Windows-приложений. - БХВ-Петербург, 2003. - 544 с.: ил.
Додаток
Код програми
486
model
flat,stdcall
extrn
ExitProcess:Proc, MessageBoxA:Proc, CoInitialize:Proc
extrn
CoCreateInstance:Proc, MultiByteToWideChar:Proc
extrn
SysAllocString:Proc, SysFreeString:Proc, OpenFile:Proc
extrn
_wsprintfA:Proc,MessageBoxW:proc
extrn Sleep:Proc,
mciSendStringA:Proc
extrn
GetCursorPos: Proc
VT_BSTR equ 8
OF_EXIST equ
4000h
data
Coord:
XX dd 0
YY dd 0
MUZIKA db
"play arash.mp3",0
HKEY_CLASSES_ROOT\CLSID\{D45FD2FC-5C6E-11D1-9EC1-00C04FD7081F}
[по умолчанию] = Microsoft Agent Server 2.0
CLSID_AgentServer dd
0d45fd2fch ; Microsoft Agent Server 2.0
dw 5c6eh, 11d1h
db 9Eh,0C1h, 00h,
0C0h,4Fh,0D7h,08h,1Fh;
МЕТОДИ
AgentServer:
Load = 1Ch
GetCharacterEx =
2Ch;
-------------------------------------------------------------------------------------------;
HKEY_CLASSES_ROOT\Interface\{48D12BA0-5B77-11D1-9EC1-00C04FD7081F} [по
умолчанию] = IAgentEx;
HKEY_LOCAL_MACHINE\Software\CLASSES\Interface\{48D12BA0-5B77-11D1-9EC1-00C04FD7081F}
[по умолчанию] = IAgentEx
IID_IAgentEx dd
48d12ba0h ; IAgentEx dw 5b77h,11d1h
db
9Eh,0C1h, 00h,0C0h,4Fh,0D7h,08h,1Fh;
МЕТОДИ IAgentEx:
SetLanguageID =
0C4h
SetSize = 28h
MoveTo = 70h
Show = 64h
Speak = 6Ch
GetAnimationNames
= 0Ech
hide = 68h;
--------------------------------------------------------------------------------------------
IID_IEnumVARIANT dd
00020404h; IEnumVARIANT
dw 0000h,0000h
db 0C0h,00h,
00h,00h,00h,00h,00h,46h;
МЕТОДИ
IEnumVARIANT:
Reset = 14h
Next = 0ch;
--------------------------------------
TITLE1 db
"Виконує дiю:",0
NUM1 dd 0
IUNKNOWN dd
0
------------------------------------------------------------------------------------------
hAgent dd
0
hAgentObject dd
0
IChrID dd
0
IReqID dd
0
hAgentChar dd
0
Var1 dd
0
ADR1 dd
0
TYPE_AGENT dd
0;
Вимовляння фрази:
BUF1 db
"Танцюють всі!!!",0
ACS db
"robby.acs",0 ; Варiант агента
FORMAT1 db
"Кiлькiсть дiй: %ld",0
NAME1 db
"Play",0.data?
OFSTRUCT db 8
dup(?)
FullName db 260
dup(?)
BUF2 dw 500
dup(?)
TEXT1 db
1000 dup(?)
_esp dd ?
FETCHED dd ?
MAS1 db
20000 dup(?);
--------------------------------------------------------------------------------------------
code
Start:
Call
CoInitialize,0 ; Initializes the COM library on the current thread
Call
CoCreateInstance, offset CLSID_AgentServer, 0, 5, offset IID_IAgentEx, offset
hAgentObject
test eax, eax
js STOP
call
OpenFile,offset ACS,offset OFSTRUCT,OF_EXIST
cmp eax,-1
jz NOT_ACS
call
MessageBoxA,0,offset FullName,offset ACS,0
Call
MultiByteToWideChar,0,0,offset FullName,-1,offset BUF2,500
Call
SysAllocString,offset BUF2
mov ADR1,eax
mov
TYPE_AGENT,VT_BSTR NOT_ACS:
;----------------------------------------------------------------
mov
edx,hAgentObject
mov edx,[edx] ;
Load Agent:
call
[edx+Load],hAgentObject,TYPE_AGENT,0,ADR1,0,offset IChrID,offset IReqID
Call
SysFreeString,ADR1
test eax, eax
js STOP
mov
edx,hAgentObject
mov edx,[edx]
; 2ch = Get the
Agent Character (GetCharacterEx)
call
[edx+GetCharacterEx],hAgentObject,IChrID,offset hAgentChar ; Get the Agent
Character
test eax, eax
js STOP
;====================================================
mov
edx,hAgentChar
mov edx,[edx]
; 0c4h =
SetLanguageID ; 409-English, 419-Russian, 422-Ukrain
call
[edx+SetLanguageID],hAgentChar,409h ; Set Language
test eax, eax
js STOP
;------------------------------
mov
edx,hAgentChar
mov edx,[edx]
call
[edx+SetSize],hAgentChar,250, 270 ; Розмір персонажу
;--------------------------------
mov edx,
hAgentChar
mov edx,[edx]
call
[edx+MoveTo],hAgentChar,100,200,1,offset Var1 ; MoveTo X,Y,Speed,Id
;--------------------------------
mov edx,
hAgentChar
mov edx,[edx]
call
[edx+show],hAgentChar,0,offset Var1 ; show
;--------------------------------
Call
MultiByteToWideChar,0,0,offset BUF1,-1,offset BUF2,500
Call
SysAllocString,offset BUF2
mov ADR1,eax
mov
edx,hAgentChar
mov edx,[edx]
call
[edx+speak],hAgentChar,eax,0,offset Var1 ; speak
Call
SysFreeString,ADR1
;--------------------------------
mov
edx,hAgentChar
mov edx,[edx]
call
[edx+GetAnimationNames],hAgentChar,offset IUNKNOWN ; GetAnimationNames
test eax, eax
js STOP
mov edx,IUNKNOWN
mov edx,[edx]
call
[edx+0],IUNKNOWN,offset IID_IEnumVARIANT,offset IVAR ; QueryInterface
mov edx,IVAR
mov edx,[edx]
call
[edx+Reset],IVAR ; Reset
test eax, eax
js STOP
mov edx,IVAR
mov edx,[edx]
call
[edx+Next],IVAR,200,offset MAS1,offset FETCHED ; Next
test eax, eax
js STOP
mov eax,FETCHED
call
_wsprintfA,offset TEXT1,offset FORMAT1,eax
add esp,12
;call
MessageBoxA,0,offset TEXT1,offset TEXT1,0
call Sleep, 7000
call
mciSendStringA,offset MUZIKA,0,0,0
call dija,13
call dija,14
call dija,13
call dija,22
call dija,14
call dija,13
call dija,29
call dija,30
call dija,14
call dija,13
call dija,14
call dija,13
call dija,30
call dija,11
call dija,11
call dija,11
call dija,32
call dija,11
call dija,11
call dija,11
call dija,54
call dija,25
call dija,25
call dija,25
call dija,54
call dija,23
call dija,23
call dija,23
call dija,11
call dija,23
call dija,23
call dija,23
call dija,11
call dija,11
call dija,11
call dija,32
call dija,11
call dija,11
call dija,11
call dija,54
call dija,30
call dija,36
call dija,37
call dija,14
call dija,13
call dija,22
call dija,36
call dija,37
call dija,14
call dija,13
call dija,22
call dija,36
call dija,11
call dija,11
call dija,11
call dija,32
call dija,11
call dija,11
call dija,11
call dija,12
call dija,14
call dija,13
call dija,14
call dija,13
call dija,14
call dija,13
call dija,22
call dija,27
call
ExitProcess,0
;----------------------------------
mov edx,IVAR
mov edx,[edx]
call [edx+8],IVAR ;
Release
test eax, eax
js STOP
;--------------------------------
mov
edx,hAgentChar
mov edx,[edx]
call
[edx+hide],hAgentChar,0,offset Var1; hide
call
MessageBoxA,0,offset BUF1,offset BUF1,0
STOP: call ExitProcess,0
;===============================================
Do_Gesture: ;
eax = address
;-----------------------------------------------------------
push eax
mov
edx,hAgentChar
mov edx,[edx]
call
[edx+58h],hAgentChar,1; Stop play
Call
SysAllocString; eax
mov ADR1,eax
mov
edx,hAgentChar
mov edx,[edx]
call
[edx+50h],hAgentChar,eax,offset Var1 ; gesture
Call
SysFreeString,ADR1
ERR1: ret
;----------------------------------
dija Proc
p1:dword
call
GetCursorPos, offset Coord
mov edx,
hAgentChar
mov edx, [edx]
call
[edx+MoveTo], hAgentChar, XX, YY, 1, offset IVAR
mov esi,offset
MAS1+8
mov ecx,p1
LL1: push ecx
mov eax,[esi]
add esi,16
pop ecx
loop LL1
push eax
call Do_Gesture;
eax - address
pop eax
; call MessageBoxW,0,eax,eax,0h
call Sleep,2500
ret
endp
end Start