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
IVAR 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