Jump to content
Sign in to follow this  
Luigi

Fazendo a "coisa" se mexer...

Recommended Posts

Ficou curioso com o título né?
Aposto que pensou besteira! ashiaushiaush

 

Mas neste post vou tentar explicar algo que eu descobri meio por acidente, e espero conseguir explicar de uma forma fácil, talvez seja útil para você que deseja desenvolver um "joginho" ou dar movimento para as "coisas", então, a razão do título: Fazendo a "coisa" se mexer...

 

Vamos partir do básico, e para isso, preciso que você tenha um pouco de imaginação, e lembre um pouco da matemática também, mas vamos pensar somente em 2D (duas dimensões), ok? Esse negócio de terceira dimensão é maior viagem, então esse papo fica pra outra hora.

 

Considerando duas dimensões, temos os eixos 'x' (horizontal) e eixo 'y' (vertical).

Se a coisa se movimenta pra cima ou pra baixo, é no eixo 'y' que devemos alterar o valor.

Se a coisa se movimenta pra esquerda ou pra direita, é no eixo 'x' que devemos alterar o valor.

 

Exemplo 1:

movimento_01.au3

 

A intenção do "Exemplo 1", é fazer a coisa se mexer, de forma básica, há duas instruções principais na função movimento:

A cada 20 milisegundos, $xx é adicionado de um pixel

$xx = $xx + 1

É avaliado se $xx é maior do que a largura da janela, se for, $xx é zerado (poderia ser outro valor).

If $xx > $aGuiSize[0] Then $xx = 0

Move a "coisa" de lugar.

ControlMove($hGui, "", $iCoisa, $xx, $yy, 32, 32)

 

Fácil né?

Aqui nesse exemplo, estou usando apenas um botão para movimentar, mas poderia ser um gráfico de GDI.

 

Exemplo 2:

Agora a intenção é fazer a coisa ficar em zig-zag.

movimento_02.au3

O código não mudou muito, eu incluí a variável $velocidade, e mudei um pouco a função Movimento.

Na verdade, toda vez que a função movimento é chamada, ele avalia se $xx é maior do que $aGuiSize[0] ou menor do que zero, caso atenda uma ou outra condição, a velocidade é multiplicada por -1, fazendo ela se tornar positiva ou negativa, enfim, andando em zig-zag.

 

Como faço para aumentar a velocidade?

Bem, ao invés de usar velocidade = 1, use velocidade = 2.

Outra forma, mas não recomendo, é diminuir o tempo do AdLibRegister de 20 milisegundos para 10.

Mas sabe porque isso não é recomendável?

Pois acredito que seu código terá outras coisas para fazer, outras coisa para movimentar, e talvez fique sem tempo de refazer tudo, antes da próxima cena.

Acho que não foi uma boa explicação, mas deixe o script com folga.

 

Outra coisa, você consegue perceber os limites de movimento da "coisa"?

De onde até onde que a coisa se move?

Ah tá...

Qual é o $xx e o $yy cada vez que ela muda de direção?

Mudança de direção 1:

$xx = 400 e $yy = 20

 

Mudança de direção 2:

$xx = 0 e $yy = 20

 

Isso é importante, pois perceba que temos um array:

Global $aCaminho[2][2] = [ _
    [400, 20], _
    [0, 20] _
    ]

Percebeu?

Esse array, de dois pontos cartesianos, é apenas uma linha reta...

Mas a linha poderia estar inclinada...

Poderia haver mais pontos no array $aCaminho! E a coisa, ao invés de se mover em uma reta, seguiria um caminho! Um caminho pré-determinado, seguiria os pontos do array...

 

Logicamente, a implementação desse tipo de código é um pouco mais complicada, mas é possível!

 

Por isso os exemplos em 2D, e a minha tentativa de explicação também vai em 2D:

cartesiano.jpg

Se você está no ponto A, e quer mover a coisa para o ponto B, é fácil, você precisa apenas alterar os valores no eixo y, correto?

Se você está no ponto B, e quer ir para C, basta apenas alterar os valores do eixo x!

Se você está no ponto C, e quer ir para A, xi! Agora você precisa alterar valores nos eixos x e y!

Se que aqui está a parte complicada, precisa ser um valor adequado para cada eixo, que dê a impressão que está se movendo em linha reta!

 

Parece complicado né?

Vamos por partes, o segredo é saber que você está em um plano cartesiano A(x1,y1) e quer ir para outro ponto B(x2,y2) no mesmo plano, e para isso, precisa saber o angulo entre A e o ponto B.

Falando em código, segue alguns exemplos:

movimento_02.au3

Nesse script, marque os box SENO e COSSENO.

Xi, trigonometria? Sim! Sem ela, eu não consigo pensar em como resolver essa questão, mas pense, você não vai precisar desenvolver nada, estou apenas compartilhando o código com você! 8D

A questão fundamental aqui, é entender o movimento composto do eixo x e eixo y!

Para que a coisa se movimente de forma inclinada, ela precisa se mover nos eixos x e y, mas o quanto que tem que se mover, é o que o gráfico mostra...

https://github.com/chechelaky/AutoIt/blob/master/Diversos/Angulos/Angulos.au3

 

 

[CONTINUA]

 

Execute o script Angulos.au3, marque seno e cosseno.

Se você deixar o angulo em 0º (ou 360º), você terá uma única reta no eixo x.

 

Baixe e execute o seguinte exemplo:

 

https://www.youtube.com/watch?v=qo8Xt80bpXk

 

https://github.com/chechelaky/AutoIt/blob/master/GameStudy/TowerDefense.au3

  • Like 2

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

×