This repository has been archived by the owner on Jan 4, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ANIMATE.INC
345 lines (297 loc) · 11.8 KB
/
ANIMATE.INC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
; #########################################################################
; include files
; ~~~~~~~~~~~~~
;include C:\masm32\include\masm32.inc
include c:\MASM32\INCLUDE\windows.inc
include c:\MASM32\INCLUDE\gdi32.inc
include c:\MASM32\INCLUDE\user32.inc
include c:\MASM32\INCLUDE\kernel32.inc
include c:\MASM32\INCLUDE\Comctl32.inc
include c:\MASM32\INCLUDE\comdlg32.inc
include c:\MASM32\INCLUDE\shell32.inc
include C:\MASM32\INCLUDE\Msimg32.inc
; libraries
; ~~~~~~~~~
includelib c:\MASM32\LIB\gdi32.lib
includelib c:\MASM32\LIB\user32.lib
includelib c:\MASM32\LIB\kernel32.lib
includelib c:\MASM32\LIB\Comctl32.lib
includelib c:\MASM32\LIB\comdlg32.lib
includelib c:\MASM32\LIB\shell32.lib
includelib c:\MASM32\LIB\advapi32.lib
includelib C:\MASM32\LIB\Msimg32.lib
; #########################################################################
;=================
; Local prototypes
;=================
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
TopXY PROTO :DWORD,:DWORD
FillBuffer PROTO :DWORD,:DWORD,:BYTE
ThreadProc PROTO :DWORD
; nossas funções
desenharFlappy PROTO :DWORD
voltaCanos PROTO
canoAndar PROTO
calculaPos PROTO
podeIrPraPos PROTO
subir PROTO
irDescendo PROTO
graficoDeY PROTO
recomecar PROTO
;wsprintfA PROTO C :DWORD, :DWORD, :VARARG
;wsprintf equ <wsprintfA>
;=============
; Local macros
;=============
szText MACRO Name, Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM
szDWORD MACRO Name
LOCAL lbl
jmp lbl
Name db DWORD,0
lbl:
ENDM
m2m MACRO M1, M2
push M2
pop M1
ENDM
return MACRO arg
mov eax, arg
ret
ENDM
;/////////////////////////////////
;/////////////////////////////////
;/////////////////////////////////
; /* método divide registradores de 16 bits, para DWords */
dividir MACRO primeiro, segundo
mov eax, primeiro
mov ecx, segundo
xor edx, edx ;coloca 0 no EDX para não haver erros
idiv ecx
ENDM
; /* método divide registradores de 8 bits, para DBytes */
dividir_oito MACRO primeiro, segundo
mov ah, primeiro
mov al, segundo
mov bx, 0
@loop:
.if ah <= al
jmp @fim
sub ah, al
inc bx
@fim:
ENDM
;/////////////////////////////////
;/////////////////////////////////
;/////////////////////////////////
; /* Coloca em EAX o valor multiplicado */
; /* Altera ECX também */
multiplicar MACRO primeiro, segundo
mov ecx, primeiro
mov eax, segundo
imul ecx ; estou multiplicando os dois(ecx*EAX), será guardado em EAX o valor(e em EDX se muito grande) por default
ENDM
;/////////////////////////////////
;/////////////////////////////////
;/////////////////////////////////
; /* Coloca em DX o valor multiplicado */
; /* Altera CX e AX também */
aleatorio MACRO intervalo, resultado
mov ah, dh
xor dh, dh
mov ch, 1
add ch, intervalo
div ch ; here dh contains the remainder of the division - from 0 to intervalo
mov word ptr[resultado], dx
.while resultado > intervalo
sub resultado, intervalo+1
.endw
ENDM
;/////////////////////////////////
;/////////////////////////////////
;/////////////////////////////////
; /* Coloca em EAX o valor do quadrado */
quadradoDe MACRO base
mov eax, base ; colocando o valor de 'base' em EAX
imul eax ; estou multiplicando o valor por si mesmo(EAX*EAX), será guardado em EAX o valor(e em EDX se muito grande) por default
ENDM
;/////////////////////////////////
;/////////////////////////////////
;/////////////////////////////////
; /* Coloca em EAX o valor do RGB desejado */
RGB MACRO red,green,blue
xor eax,eax
mov ah,blue
shl eax,8
mov ah,green
mov al,red
ENDM
RGB_b MACRO red,green,blue
xor ebx,ebx
mov bh,blue
shl ebx,8
mov bh,green
mov bl,red
ENDM
;/////////////////////////////////
;/////////////////////////////////
;/////////////////////////////////
; /* Macro para escrever um texto baseando-se no contexto(hDC) e as coordenadas */
ESCREVE_TEXTO MACRO FontName, hDC, hfont, texto, x, y
invoke CreateFont,24,16,0,0,400,0,0,0,OEM_CHARSET,\ ;// cria a fonte
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,\
DEFAULT_QUALITY,DEFAULT_PITCH or FF_SCRIPT,\
ADDR FontName
invoke SelectObject, hDC, eax ;// coloca a fonte em hDC
mov hfont,eax ;// obtemos a fonte
RGB 200,200,50 ;// setamos em eax a cor desejada
invoke SetTextColor,hDC,eax ;// colocamos a cor no hDC para texto
RGB 0,160,192 ;// setamos em eax a cor desejada
invoke SetBkColor,hDC,eax ;// colocamos a cor no hDC para background
invoke TextOut,hDC,x,y,ADDR texto,SIZEOF texto ;// escrevemos o texto na tela
invoke SelectObject,hDC, hfont ;// juntamente com a fonte escolhida
ENDM
;/////////////////////////////////
;/////////////////////////////////
;/////////////////////////////////
; /* Função que escreve um número(DByte) na tela, com um background padrão de números */
ESCREVE_PONTUACAO MACRO FontName, hDC, hfont, number, x, y, planodefundo
invoke CreateFont,24,16,0,0,400,0,0,0,OEM_CHARSET,\
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,\
DEFAULT_QUALITY,DEFAULT_PITCH or FF_SCRIPT,\
ADDR FontName
invoke SelectObject, hDC, eax
mov hfont,eax
mov bl, number
intToStr number
.if planodefundo == 0
RGB 0,255,0
invoke SetTextColor,hDC,eax
RGB 0,0,0
invoke SetBkColor,hDC,eax
.else
RGB 200,200,50 ;// setamos em eax a cor desejada
invoke SetTextColor,hDC,eax ;// colocamos a cor no hDC para texto
RGB 0,160,192 ;// setamos em eax a cor desejada
invoke SetBkColor,hDC,eax ;// colocamos a cor no hDC para background
.endif
invoke TextOut,hDC,x,y,ADDR number,SIZEOF number
invoke SelectObject,hDC, hfont
mov number, bl
ENDM
;/////////////////////////////////
;/////////////////////////////////
;/////////////////////////////////
; /* Função que escreve um número(DWord) na tela, com um background padrão de números */
ESCREVE_PONTUACAO_D MACRO FontName, hDC, hfont, number, x, y
invoke CreateFont,24,16,0,0,400,0,0,0,OEM_CHARSET,\
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,\
DEFAULT_QUALITY,DEFAULT_PITCH or FF_SCRIPT,\
ADDR FontName
invoke SelectObject, hDC, eax
mov hfont,eax
mov bl, number
intToStr number
RGB 0,255,0
invoke SetTextColor,hDC,eax
RGB 0,0,0
invoke SetBkColor,hDC,eax
invoke TextOut,hDC,x,y,ADDR number,SIZEOF number
invoke SelectObject,hDC, hfont
mov number, bl
ENDM
;/////////////////////////////////
;/////////////////////////////////
;/////////////////////////////////
; /* Macro para criar Threads, baseando-se no ID, no Handler e no procedimento dela */
CRIAR_THREAD MACRO ThreadProc, ThreadID, hThread
mov eax, OFFSET ThreadProc
invoke CreateEvent, NULL, FALSE, FALSE, NULL
mov hEventStart, eax
mov eax, OFFSET ThreadProc
invoke CreateThread, NULL, NULL, ThreadProc, eax, 0, ADDR ThreadID
invoke CloseHandle, eax
mov hThread,eax
ENDM
;/////////////////////////////////
;/////////////////////////////////
;/////////////////////////////////
; /* transforma uma variável numérica(entre 0-9) e transforma em letra('0'-'9')(suponto DByte 1 bytes) */
intToStr MACRO valor
mov ah, valor
add ah, '0'
mov valor, ah
ENDM
;/////////////////////////////////
;/////////////////////////////////
;/////////////////////////////////
.data?
ranNum DWORD ?
.data
CommandLine dd 0
hWnd dd 0
hWin2 dd 0
hInstance dd 0
hIcon dd 0
hBmp dd 0
hFlappy dd 0 ; Handler para bitmap do flappy com asa para baixo
hFlappy2 dd 0 ; Handler para o bitmap do flappy com a asa para cima
hCanoC dd 0 ; Handler para o Bitmap representativo do cano de cima
hCanoB dd 0 ; Handler para o Bitmap representativo do cano de baixo
hFundo dd 0 ; Handler para o bitmap do fundo azul
szDisplayName db "Flappy Bird",0
contagemAsa DWORD 0 ; variável que determina qual bitmap do pássaro será desenhado na tela
posx SDWORD 0 ; posição x do flappy no cálculo(negativa)
posy SDWORD 0 ; posição y do flappy no cálculo(negativa)
posxA SDWORD 0 ; posição x do flappy na tela(negativa)
posyA SDWORD 0 ; posição y do flappy na tela(negativa)
canoCx SDWORD 0 ; posição x do cano de cima na tela(negativa ou positiva)
canoCy SDWORD 0 ; posição y do cano de cima na tela(negativa ou positiva)
canoBx SDWORD 0 ; posição x do cano de baixo na tela(negativa ou positiva)
canoBy SDWORD 0 ; posição y do cano de baixo na tela(negativa ou positiva)
DcanoCy SDWORD 200 ; posição default das alturas dos canos
DcanoBy SDWORD -350
indiceProX dd 1 ; indice para a função utilizada no cálculo da posição do flappy
pontos db 0,0 ; variável que guarda os pontos feitos pelo usuário
pontos2 db 0,0
pontos3 db 0,0
random db 1,0
somaRandom dd 0
randomOrdem dd 0
ExitCode dd 0
hThread dd 0
hEventStart dd 0
EventStop BOOL FALSE
perdeu db 0,0
textoPerdeu db " ACABOU, PRESSIONE [c]",0
textoPerdeu2 db " PARA RECOMECAR",0
textoPerdeu3 db "Pontos: ",0
inicio db 1,0
vai db 0,0
velocidade dd 4
textoInicio db " PRESSIONE A TECLA [b] PARA",0
textoInicio2 db " INICIAR SUA AVENTURA",0
FontName db "Consolas",0
.const
IDM_TEST equ 1
IDM_HELLO equ 2
IDM_GOODBYE equ 3
IDM_EXIT equ 4
FLAPPY_ALTURA DWORD 30
FLAPPY_LARGURA DWORD 59
FLAPPY_BITMAP equ 200
FLAPPY2_BITMAP equ 210
CANO_ALTURA DWORD 450
CANO_LARGURA DWORD 50
FUNDO_BITMAP equ 110
CANOB_BITMAP equ 120
CANOC_BITMAP equ 130
WM_FINISH equ WM_USER+100h ; determina o fim da thread
IDM_CREATE_THREAD equ 1
; ########################### Inserted modules ############################
; #########################################################################