Página 1 de 1

[PROG] [Tutorial] Usando MOD e DIV

Enviado: Sex Abr 29, 2016 11:51 am
por Tutoriais & Aulas
Autor original: Kabeção
As expressões mod e div fazem parte de qualquer boa linguagem de programação, e assim como os loops que fazem basicamente a mesma coisa mas podem ter utilidades diferentes esses dois operadores podem facilitar nossa vida em alguns casos.

Embora simples, esse tutorial requer um nível intermediario pois você precisa estar acostumado ao modo que o GM trabalha e saber GML.

Módulo

Módulo é o resto da divisão.
Quando você calcula:

Código: Selecionar todos

a = 2 mod 2;
O resultado será 0 pois 2 divido por 2 não tem resto.

Quando você calcula:

Código: Selecionar todos

a = 3 mod 2;
O resultado será 1 pois 3 divido por 2 é 1 e o resto da divisão é 1.
Agora, pra que serve isso?

Saber o resto da divisão pode ser mais útil do que parece

A mais simples utilidade do mod é formar ciclos, por exemplo:
Você tem que fazer a sprite de um objeto girar então o que você faz?

Código: Selecionar todos

image_angle += 15;
Mas ângulos vão de 0 a 360.
Quando image_angle passar de 360 a sprite continuara a girar normalmente mas a variável continuará a aumentar infinitamente e quando atingir o limite o jogo vai travar.
Normalmente para evitar isso poderiamos fazer:

Código: Selecionar todos

if image_angle > 360 image_angle -= 360;
Isso resolveria o problema mas não é nada funcional pois pode gerar muitos bugs.

Então ao invés dessa gambiarra usamos mod para fazer um ciclo facilmente independente do valor atual de image_angle:

Código: Selecionar todos

image_angle = (image_angle mod 360);
Agora a variável nunca passará de 360 mas por que?
Abra um jogo no modo debug do GM apertando F6, naquele janela clique no icone "+" e digite:

Código: Selecionar todos

50 mod 360
O resultado é 50 certo?

Código: Selecionar todos

17 mod 360
Agora o resultado é 17.
E:

Código: Selecionar todos

370 mod 360
Agora o resultado é 10!
O resto da divisão de 370 por 360 é 10 e é exatamente o valor correspondente ao angulo apos passar de 360.

Código: Selecionar todos

720 mod 360
720 é o dobro de 360.
O resto dessa conta é 0 e também é o valor correspondente ao angulo apos passar de 360.

Dá até para saber se um número é par ou ímpar!
Todo número par divido por 2 não tem resto e todo número ímpar divido por dois sobra 1, então fazer um script que retornar se o número é par ou ímpar não tem segredo:

Código: Selecionar todos

// par_impar(x)
// Retorna:
// 0 = par
// 1 = ímpar

return argument0 mod 2;

Muito conveniente não acha?

Divisão inteira

Divisão inteira é uma divisão que não tem fração ao decimal, ou seja, 2 / 3 é 0.666... mas 2 div 3 é apenas 0.
É o mesmo que usar floor(x).
Bem simples.

A conversão de tempo para fazer um relógio ilustra perfeitamente a utilidade de div e mod.
A variável current_time retorna o tempo em milisegundos desde de quando o computador foi reiniciado.
Como posso converter isso em horas, minutos e segundos?

1000 milisegundos são um segundo, e no relógio eles vão de 0 a 60 então:

Código: Selecionar todos

segundos = (current_time div 1000) mod 60;
1 minuto são 60 segundos e eles vão de 0 a 60 também:

Código: Selecionar todos

minutos = ((current_time div 1000) div 60) mod 60;
Com "(current_time div 1000)" transforma em segundos, com "div 60" transforma em minutos e com "mod 60" faz o ciclo para o valor corresponder a limitação de 0 a 60.

1 hora são 3600 segundos:

Código: Selecionar todos

horas = (current_time div 1000) div 3600;
E é isso!
Desenhe na tela e agora você sabe a quado tempo seu computar esta ligado.

Código: Selecionar todos

draw_text(8,8,string(horas)+':'+string(minutos)+':'+string(segundos));
Há também o ciclo de animação do image_index, ou seja:

Código: Selecionar todos

image_speed = 0.25;
... e ...

Código: Selecionar todos

velocidade = 0.25;
image_index = floor((image_index+velocidade) mod image_number);
São a mesma coisa!

Provavelmente é assim que o GM trabalha internamente com a variável image_index.


Bom, sabemos isso é só aproveitar.
Divirtam-se e até outro tutorial. :blz: