Entrar
Últimos assuntos
» player não consegue andarpor lovn7 Qui 21 Nov 2024, 13:33
» É possível fazer istó no game maker
por William Lima Qui 21 Nov 2024, 10:56
» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por Lua Sáb 16 Nov 2024, 20:22
» (Resolvido) Cenario longo x Texture Pages
por josuedemoraes Sáb 16 Nov 2024, 15:31
» Kids' band
por Adilson Lucindo Santos Sex 15 Nov 2024, 12:23
» (RESOLVIDO) Engasgos-Troca de Sprites/animações
por josuedemoraes Ter 12 Nov 2024, 01:49
» Block Room - DEMO
por Joton Qua 06 Nov 2024, 22:58
» Game Infinito vertical (subindo)
por macmilam Sáb 26 Out 2024, 12:36
» Retorno da GMBR!!!
por Dancity Ter 22 Out 2024, 16:36
» Máquina de estados
por aminaro Qui 10 Out 2024, 13:33
» como faço pra um objeto colidir com o outro e diminuir a vida do player ?
por josuedemoraes Qui 03 Out 2024, 16:51
» RESOLVIDO: Colisão com objetos moveis
por josuedemoraes Qua 02 Out 2024, 20:28
» Crypt of the Blood Moon
por divin sphere Qua 11 Set 2024, 18:18
» como fazer um objeto seguir?
por divin sphere Dom 18 Ago 2024, 18:08
» Procuro de alguém para Modelar/Texturizar/Animar objetos 3D
por un00brn Dom 11 Ago 2024, 11:10
» Destruição de cenário (estilo DD Tank)
por CoronelZeg Sex 09 Ago 2024, 17:16
» RESOLVIDO-Como destruir uma instancia especifica de um objeto
por josuedemoraes Ter 23 Jul 2024, 00:40
» Automatizar a coleta de id
por GabrielXavier Seg 22 Jul 2024, 18:01
» Preciso de ajuda para concluir um pequeno projeto
por lmoura Qui 27 Jun 2024, 15:45
» ANGULO ACOMPANHAR O OBJETO
por Klinton Rodrigues Qui 27 Jun 2024, 08:34
» Musica reinicia quando sala reinicia
por GabrielXavier Ter 18 Jun 2024, 07:28
» como fazer uma copia de gd
por generico_cube Sex 14 Jun 2024, 15:48
» Square Adventure
por guilherme551 Ter 11 Jun 2024, 09:54
» como posso definir limite de uma variavel
por GabrielXavier Sex 07 Jun 2024, 14:14
» [Resolvido] Dúvida, colisão única de objeto
por vdm842 Sex 24 maio 2024, 09:50
[Tutorial] lengthdir_x e lengthdir_y
2 participantes
Página 1 de 1
[Tutorial] lengthdir_x e lengthdir_y
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.
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)!
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:
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:
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.
Lengthdir! Lengthdir(ângulo, raio)!
Quase. Lengthdir(raio, ângulo). A ordem dos argumentos é importante.
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.
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
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.
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)!
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:
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;
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;
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);
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);
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- Games Ranking :
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios :
x 1 x 6 x 0
x 1 x 0 x 3
x 0 x 0 x 0
Re: [Tutorial] lengthdir_x e lengthdir_y
Ó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!
GameMakerTutoriais- Data de inscrição : 29/01/2011
Reputação : 26
Número de Mensagens : 800
Prêmios :
x 0 x 4 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Tópicos semelhantes
» Oi Galerinha, aqui um tutorial básico de um jogo de luta que eu fiz! [TUTORIAL]
» [Tutorial] 39dll Tutorial - Part II(Final)
» [Tutorial] 39dll Tutorial - Part I
» Como fazer com que a view siga 2 ou mais objeto?
» tutorial de mmo
» [Tutorial] 39dll Tutorial - Part II(Final)
» [Tutorial] 39dll Tutorial - Part I
» Como fazer com que a view siga 2 ou mais objeto?
» tutorial de mmo
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos