GMBR
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
Entrar

Esqueci-me da senha

Últimos assuntos
» Colisões não funcionando
por RastaMaan Ontem à(s) 19:49

» Como ajustar velocidade de cada frame da animação no game maker
por pequetux Ontem à(s) 16:45

» Preciso de ajuda
por AftonDuGrau Dom 21 Abr 2024, 20:18

» Como faz o evento drawn GUI, não se repetir?
por aminaro Sex 19 Abr 2024, 20:30

» PROBLEMAS COM FÍSICAS DE ÁGUA
por aminaro Ter 16 Abr 2024, 10:07

» Retorno da GMBR!!!
por Ralphed Sex 12 Abr 2024, 22:45

» JOGADOR PARANDO NO AR QUANDO ATACA
por aminaro Qua 10 Abr 2024, 13:51

» Problemas com texto interativo
por Kaaru72 Dom 07 Abr 2024, 11:31

» Erro escondido e indecifrável
por dev_gabize.azv Qui 04 Abr 2024, 10:11

» Mudar cor de apenas uma palavra
por Ralphed Sáb 30 Mar 2024, 00:39

» Procuro Programador de game maker
por Wou Sex 15 Mar 2024, 10:27

» Mod APK
por gamerainha Qua 13 Mar 2024, 06:30

» Aceito pedidos de sprites (Com exemplos meus)
por Sevilha Qua 28 Fev 2024, 12:17

» Inventário simples
por Isquilo_Roedor Qui 22 Fev 2024, 15:18

» Problemas na programaçnao de inimigo [jogo DOOM LIKE]
por Black Mirror Dom 11 Fev 2024, 13:34

» ANDROID MULTI TOUCH
por DiegoBr Dom 04 Fev 2024, 12:13

» Servidor de Discord do fórum?
por Lighter Sáb 27 Jan 2024, 17:18

» Save e Load Json
por Klinton Rodrigues Qui 25 Jan 2024, 11:12

» Colisão com mais de um objeto
por aminaro Seg 22 Jan 2024, 15:02

» Oi sou novo aqui
por Thiago Silveira Alexandre Sáb 20 Jan 2024, 20:55

» Como acessar conteudo comprado no marketplace
por macmilam Sex 19 Jan 2024, 07:42

» Devlogs em vídeos do Block Room
por Joton Seg 15 Jan 2024, 16:56

» Alguém aqui já ganha dinheiro com seus games?
por Joton Seg 15 Jan 2024, 16:49

» ACERVO GMBR MAGAZINE
por Joton Qui 11 Jan 2024, 19:21

» como aumentar o obj sem aumentar a colisão??
por GabrielXavier Qua 10 Jan 2024, 07:21


[Tutorial] lengthdir_x e lengthdir_y

2 participantes

Ir para baixo

[Tutorial] lengthdir_x e lengthdir_y Empty [Tutorial] lengthdir_x e lengthdir_y

Mensagem por saim Ter 29 Nov 2011, 11:45

Nome: Usando lengthdir_x e lengthdir_y
Descrição: Algumas pessoas têm dificuldade com essas funções. Resolvi criar esse tutorial com a teria necessária pra compreendê-las
Nível de dificuldade: Pra programação, nenhum, mas pode requerer um pouco de entendimento em matemática.
Requerimentos: Primeiro grau completo. Noções em geometria
Desenvolvimento: Antes de entrar na teoria, farei como o método kumon: vou voltar um pouco na matéria, até a parte que você já domina, e começar daí.

Coordenadas cartesianas:

Você conhece e está acostumado com as coordenadas cartesianas. Localizar um ponto na tela quando eu te digo os valores de x e y é fácil, pra você. Mesmo que os valores de x e y NÃO estejam na tela.
Mas vamos rever um pouco essa teoria.[Tutorial] lengthdir_x e lengthdir_y PlanoCartesiano

O que te é fornecido pra que você localize um ponto? Além dos valores de x e y, temos a escala, em pixels (ou: quanto mede cada unidade) e a origem (onde, afinal, é o zero).
Com isso, você parte da origem e põe uma régua na vertical. Anda com ela pra esquerda ou direita, dependendo do sinal, ao longo do eixo x, e anda o número de unidades que corresponde ao valor de x dentro da escala usada. Repete o mesmo com o eixo y e, onde as duas réguas se cruzarem, lá estará seu ponto.
Como você consegue fazer tudo isso sem nem perceber?

Coordenadas polares:

Coordenadas polares servem pra mesma coisa, porém os dados que você dispõe são diferentes. E se ao invés de termos duas réguas, tivéssemos uma régua e um transferidor (aquela regüinha circular que serve pra medir ângulos)? O ponto seria encontrado do mesmo jeito. Desde que se mantivessem os sinais, os valores e a escala.
Faríamos o seguinte: prenderíamos uma régua na origem e andaríamos pra esquerda ou direita, dependendo do sinal, o número de unidades na escala correspondente ao valor. Até aqui, tudo muito parecido. Agora é que vem o pulo do gato: ao invés de repetir tudo no outro eixo, nós giraríamos a régua. Como ela está presa na origem, giramos ela ao redor da origem em um número de graus que determinará o ângulo. E, assim, chegamos a um ponto a partir de dados diferentes das coordenadas (x, y)![Tutorial] lengthdir_x e lengthdir_y Polar_coordinates
Nesse sistema, o ângulo chama ângulo mesmo, mas a distância chama raio.
Esse sistema de coordenadas é corriqueiro, na matemática. Se você terminou o segundo grau, você conhece isso. Se terminou e não conhece, é porque não gosta da área de exatas e está perdendo tempo num fórum sobre produção de jogos (a menos que você seja desenhista ou sonoplasta, mas aí não precisa ler tutoriais sobre programação).
importante: No game maker, bem como na matemática em geral, o ângulo zero é aquele que aponta para a direita. Os ângulos crescem em sentido anti-horário e fecham-se num círculo de 360 graus.
menos importante, mas relevante: Podem ser usados valores negativos, tanto no ângulo quanto no raio. Um raio negativo significa que você deve andar pra esquerda, na régua. Um ângulo negativo significa que você deve girar a régua no sentido horário.

Transformação de coordenadas cartesianas para polares:

[Tutorial] lengthdir_x e lengthdir_y Coordonnees_polaires_plan
Não vou ensinar toda a trigonometria envolvida no conceito, mas pense no seguinte: um ponto depende do sistema de coordenadas que você está usando?
Não, não depende. Ele existe. Como você vai fazer pra chegar até ele é assunto seu. Então, logicamente, é possível chegar ao mesmo ponto usando qualquer sistema de coordenadas.
Por sorte, a única diferença que teremos é que um usa distâncias em x e y e o outro usa um raio e um ângulo. A escala e a origem serão iguais.

Pra transformar as coordenadas cartesianas em polares, no game maker, fazemos o seguinte:
pra achar o raio, usamos "raio=point_distance(0, 0, x, y)".
pra achar o ângulo, usamos "ângulo=point_direction(0, 0, x, y)".
Você tinha entendido que as coordenadas do origem são (0, 0), né? Se não, volte pro começo do tutorial e releia tudo até entender.

E o caminho inverso? Como achar os valores de x e y se eu tiver um raio e um ângulo. Uma dica: foi pra isso que eu fiz esse tutorial!

Usando lengthdir:
Lengthdir serve pra transformar coordenadas polares em cartesianas. Porque, muitas vezes, você acha mais fácil usar coordenadas cartesianas. Porque, às vezes, você só quer o valor em x ou em y. Porque, ora bolas, o game maker se baseia em coordenadas cartesianas e você pode precisar determinar a posição de um objeto em termos de X e Y.
O que você tem em coordenadas polares é um raio, ou seja, um comprimento - length - e um ângulo, ou seja, uma direção - direction. length+direction=lengthdir. Pra saber o valor em x correspondente àquele comprimento e àquela direção, use lengthdir_x. Em y, use lengthdir_y.
Pra achar o valor x, use "lengthdir_x(raio, ângulo)".
Pra achar o valor y, use "lengthdir_y(raio, ângulo)".
Saim, saim! Dá pra fazer isso usando seno e cosseno!
É, dá sim. Agora vai brincar de lego star wars, vai. Seu nerd!

Extrapolando: (se você teve dificuldade pra chegar até aqui, nem leia o resto)
Deixa eu diminuir a letra pra parte mais filosófica: Claro que nem sempre você quer a posição de um ponto com relação à origem da room. Raramente você quer isso. Normalmente você quer a posição de um ponto em relação a outro ponto, que você já conhece. Notou que point_distance e point_direction tem alguns argumentos que declaramos como (0, 0)? Essa é a origem da room. Podemos criar nosso próprio sistema de coordenadas se deslocarmos a origem pro ponto que quisermos e, aí, teremos maior facilidade em achar o próximo ponto. Podemos fazer isso quantas vezes quisermos.
O que estamos fazendo é deixar de encontrar a posição de um ponto com relação ao ponto "origem" e passaremos a encontrar a posição dele com relação a outro ponto. É só uma forma de organizar as informações na nossa cabeça.
Pra matemática, os pontos estão lá e eles existem ao mesmo tempo em relação a todos os pontos do plano e do espaço.
Então pegue um plano e desenhe os pontos 1 e 2. Olhe pra eles. Cada um tem as coordenadas (x, y), que serão (x1, y1) e (x2, y2). Cada um terá as coordenadas polares (raio, ângulo) que serão (raio1, ângulo1) e (raio2, ângulo2).
Qual é a distância entre esses pontos? Qual o ângulo entre esses dois pontos? Qual a diferença entre as coordenadas x e entre as coordenadas y?
distância, fácil: "distância=point_distance(x1, y1, x2, y2)".
ângulo, fácil: "ângulo=point_direction(x1, y1, x2, y2)".
Notou que só substituímos o ponto (0, 0) por (x1, y1)?
diferença entre coordenadas x (chamarei de "dx"), fácil: "dx=x2-x1"
MAS, se você só tiver a distância e o ângulo entre esses pontos, pode usar "dx=lengthdir_x(distância, ângulo)" - conforme aprendemos.
Pra dy, mesma coisa: ou "dy=y2-y1" ou "dy=lengthdir_y(distância, ângulo)".
Hei, mas não usamos raio1, ângulo1, raio2 nem ângulo2!!!
É. Em coordenadas polares, os dados relativos à origem não são muito úteis pra saber a relação entre os pontos. Na verdade, podem ser sim, mas isso é mais pra faculdade.

Esses dados (dx e dy) são suficientes pra encontrar um ponto no planos?
NÃO
Eles são suficientes pra encontrar um ponto no plano desde que você tenha o outro ponto a que ele se refere. "x2=x1+dx" e "y2=y1+dy".

Então, finalmente, se você quer colocar um objeto numa posição relativa à posição de outro objeto, numa distância e ângulo já determinados, você precisa ter
- as coordenadas do outro objeto (x1, y1)
- a distância a ser usada (raio, em coordenadas polares)
- o ângulo entre os objetos (ângulo mesmo)
Como o game maker só trabalha com cartesianas, você TEM que definir a posição (x2, y2) do seu objeto. Você já sabe como fazer isso:
Código:
//primeiro, os dados que você tem:
distancia=valor dado;
angulo=valor dado;
x1=outroObjeto.x;
y1=outroObjeto.y;
//agora, calculando as distâncias em x e y do seu objeto:
dx=lengthdir_x(distancia, angulo);
dy=lengthdir_y(distancia, angulo);
x2=x1+dx;
y2=y1+dy;
Voilà, você achou as coordenadas do seu objeto!

Exemplo: Fazendo um objeto orbitar o outro

Suponha que você esteja fazendo um mago num jogo tpo-down. Esse mago tem esferas de energia que ficam rodando ao redor dele. Como determinar a posição das bolas sem trocadilho?
Você, primeiro, define a que distância elas estarão do mago. Uma vez definido isso, basta saber que ela estará num ângulo em relação a ele.
Então, a posição da bo... da esfera será igual à posição do mago + um raio e um ângulo.
Código:
esfera.x=mago.x+algo;
esfera.y=mago.y+algo;
E esse "algo" é...
Lengthdir! Lengthdir(ângulo, raio)!
Quase. Lengthdir(raio, ângulo). A ordem dos argumentos é importante.
Código:
esfera.x=mago.x+lengthdir_x(raio, angulo);
esfera.y=mago.y+lengthdir_x(raio, angulo);
Notou algum erro no código? Eu deixei lá de propósito.
Vai lá, leia de novo.
O segundo lengthdir tá "x"!
Isso. Isso sempre acontece quando usamos ctrl+c, ctrl+v. Tomem cuidado.
Bom, a esfera ainda não está rodando. Está acompanhando o mago, paradinha. Pra ela rodar, ela precisa mudar o ângulo. Então criamos mais uma variável, a velocidade angular, ou velocidade de giro, ou torque, ou rotação, ou...
Vou simplesmente chamá-la de "giro".
A cada step, o ângulo deve ser somado ao "giro". Depois, re-atualizamos a posição da esfera.
Código:
angulo+=giro;
esfera.x=mago.x+lengthdir_x(raio, angulo);
esfera.y=mago.y+lengthdir_y(raio, angulo);
Simples, não é?
Agora brinquem um pouco com os valores de raio e giro DURANTE o jogo pra ver que efeitos legais você cria!

Beijo!

Até o próximo tutorial!

PS: esse tutorial já tinha sido postado, mas perdeu-se no último ataque hacker ao fórum
saim
saim

Games Ranking : Nota B

Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios : [Tutorial] lengthdir_x e lengthdir_y Empty

Medalhas x 1 Tutoriais x 6 Moedas x 0

Ouro x 1 Prata x 0 Bronze x 3

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

[Tutorial] lengthdir_x e lengthdir_y Empty Re: [Tutorial] lengthdir_x e lengthdir_y

Mensagem por GameMakerTutoriais Dom 27 maio 2012, 12:48


Ótimo tutorial! Adorei a explicação sobre o sistema de coordenadas polares. É uma coisa que acaba "passando batido" mas é interessante demais. Em modelagem 3d, por exemplo, essa conversão de coordenadas é muito útil na aplicação de texturas em formas arredondadas, porque embora o sistema seja um pouco mais complexo, o conceito de "coordenada e ponto" funciona sempre do mesmo jeito.

Tá de parabéns, tutorial fino.

Flws!
avatar
GameMakerTutoriais

Data de inscrição : 29/01/2011
Reputação : 26
Número de Mensagens : 800
Prêmios : [Tutorial] lengthdir_x e lengthdir_y Empty

Medalhas x 0 Tutoriais x 4 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

Ir para o topo

- Tópicos semelhantes

 
Permissões neste sub-fórum
Não podes responder a tópicos