Obrigado por visitar a The Game Makers Brasil 😁 Use o fórum de Dúvidas para fazer perguntas. Se está em busca de aprender dê uma olhada nos tutoriais.

[Problema] Velocidade Diagonal mais rapida!

Perguntas? A comunidade te ajuda a resolver.
Avatar do usuário
Rafael2313
Novato
Novato
Reações: 0
Mensagens: 5

[Problema] Velocidade Diagonal mais rapida!

Mensagem por Rafael2313 » Qua Mar 08, 2017 6:32 pm

Fala glr tudo bom? Entao, estou tendo um problema no gamer maker em que meu personagem esta andando mais rapido para as diagonais e nao estou conseguindo fazer a velocidade diagonal ficar a msm q as outras.

Código: Selecionar todos

//Direita
     
if (botao_direito) {
   phy_position_x += 2 ;
}

//Esquerda
   
if (botao_esquerdo) {
   phy_position_x -= 2 ;
}

//Cima

if (botao_cima) {
   phy_position_y -= 2 ;
}

//Baixo

if (botao_baixo) {
   phy_position_y += 2 ;
}   

//Diagonal Direita

if (botao_direito) and (botao_cima) {
   phy_position_x += 1 ;
   phy_position_y -= 1 ;
}

if (botao_esquerdo) and (botao_baixo) {
   phy_position_x -= 1;
   phy_position_y += 1 ;
}   
   
//Diagonal Esquerda   

if (botao_direito) and (botao_baixo) {
   phy_position_x += 1;
   phy_position_y += 1 ;
}

if (botao_esquerdo) and (botao_cima) {
   phy_position_x -= 1 ;
   phy_position_y -= 1 ;
}

A velocidade normal era pra ser 2 entao tentei botar o comando ´and´ para verificar quando por exemplo , os botoes direito e cima estivessem sido apertados simultaneamente para fazer a soma x = 1 + y = 1 dar 2 ,mas ainda continua indo mais rapido para a diagonal como se a velocidade fosse 4. Nao sei se consegui explicar meu problema direito kkkkkkk ,mas é isso.
Obg pela ajuda!

Avatar do usuário
Koreha
Novato
Novato
Reações: 0
Mensagens: 17

Re: [Problema] Velocidade Diagonal mais rapida!

Mensagem por Koreha » Qua Mar 08, 2017 10:47 pm

Assim, não sei se você já estudou física ou se ainda é muito novo, mas o que acontece é que a movimentação é feita por vetores. Quando você aperta pro lado ele vai pra esse lado com velocidade 2. Se você apertar pra baixo e pro lado ele vai pra ambas as direções com velocidade 2. Isso faz com que a velocidade diagonal seja a soma desses vetores, que tem módulo maior que dois. Acho que uma boa maneira de resolver isso seria botando direction ao invés de ir somando valores a x e y. Outra seria usar as componentes verticais e horizontais da velocidade diagonal, que no caso daria raiz de 2. Espero ter ajudado.

Avatar do usuário
itallo
Membro
Membro
Reações: 0
Mensagens: 22

Re: [Problema] Velocidade Diagonal mais rapida!

Mensagem por itallo » Qui Mar 09, 2017 6:48 am

Pelo seu código o personagem está andando na velocidade 3 para cada direção (quando na diagonal).

Vamos supor que pressionei a seta para cima e para a direita.
log botao_direito e botao_cima serão true;

Quando passar por este trecho:

Código: Selecionar todos

//Cima

if (botao_cima) {
   phy_position_y -= 2 ;
}

//Baixo

if (botao_direito) {
   phy_position_x += 2 ;
}   
será adiciona do 2 para x e 2 para y.

Ao chegar neste trecho:

Código: Selecionar todos

if (botao_direito) and (botao_cima) {
   phy_position_x += 1 ;
   phy_position_y -= 1 ;
}
Será adicionado mais 1 ao x e y.

Tenho duas alternativas para você,
1° Exclua a parte do código que faz as verificações de movimento diagonal, seu personagem continuará a se movimentar pela diagonal.

2° Utilize o código abaixo no lugar do seu atual.

Código: Selecionar todos

angulo = 0;

//Direita
     
if (botao_direito) {
   angulo = 0;
}

//Esquerda
   
if (botao_esquerdo) {
   angulo = 180;
}

//Cima

if (botao_cima) {
   angulo = 90;
}

//Baixo

if (botao_baixo) {
   angulo = 270;
}   

//Diagonal Direita

if (botao_direito) and (botao_cima) {
   angulo = 45;
}

if (botao_esquerdo) and (botao_baixo) {
   angulo = 225;
}   
   
//Diagonal Esquerda   

if (botao_direito) and (botao_baixo) {
   angulo = 315;
}

if (botao_esquerdo) and (botao_cima) {
   angulo = 135
}

phy_position_x += lengthdir_x(2,angulo);
phy_position_y += lengthdir_y(2,angulo);

legthdir_* calcula a posição do vetor a partir de um angulo e uma distância, no seu caso utilizamos a velocidade como distância.

* Informo também que não testei o código que postei, acredito que esteja tudo certinho.

Avatar do usuário
7f55842f
Membro
Membro
Reações: 0
Mensagens: 33

Re: [Problema] Velocidade Diagonal mais rapida!

Mensagem por 7f55842f » Qui Mar 09, 2017 9:19 am

Caraca..

Faz assim:

Código: Selecionar todos

vel = 2; //pode ser setado no create e modificado a qualquer momento no jogo

x += (botao_direito - botao_esquerdo)*vel;
y += (botao_baixo - botao_cima)*vel;
Muito mais limpo, objetivo e atinge o mesmo resultado.

Edit:

Lembrando que as variáveis dos botões precisam ser com keyboard_check e em um evento step (antes do código acima), assim:

Código: Selecionar todos

botao_direito = keyboard_check(vk_right);
botao_esquerdo = keyboard_check(vk_left);
botao_cima = keyboard_check(vk_up);
botao_baixo = keyboard_check(vk_down);

Avatar do usuário
Rafael2313
Novato
Novato
Reações: 0
Mensagens: 5

Re: [Problema] Velocidade Diagonal mais rapida!

Mensagem por Rafael2313 » Qui Mar 09, 2017 11:50 am

Po glr , vlw msm é q sou mt novo no game maker então ainda to com dificuldades na hora de fazer os scripts!!

Edit:
Itallo, tentei usar seu código mas esta dando esse problema :

Código: Selecionar todos

FATAL ERROR in
action number 1
of  Step Event0
for object obj_player:

Push :: Execution Error - Variable Get 100000.angulo(100004, -2147483648)
 at gml_Script_scr_move_state (line 51) - phy_position_x += lengthdir_x(2,angulo);
Vc pode me explicar o motivo pf?

Avatar do usuário
2yu291k7m
Novato
Novato
Reações: 0
Mensagens: 17

Re: [Problema] Velocidade Diagonal mais rapida!

Mensagem por 2yu291k7m » Qui Mar 09, 2017 4:07 pm

Remove toda essa parte dos ifs e coloca só:

Código: Selecionar todos

vel = 2;

phy_position_x += (botao_direito - botao_esquerdo)*vel;
phy_position_y += (botao_baixo - botao_cima)*vel;
Vai funcionar cara.

Avatar do usuário
gabrielsch
Colaborador
Colaborador
Reações: 0
Mensagens: 234

Re: [Problema] Velocidade Diagonal mais rapida!

Mensagem por gabrielsch » Qui Mar 09, 2017 4:12 pm

Usando um pouco de trigonometria você consegue "normalizar" a velocidade dos componentes para que a velocidade diagonal não ultrapasse os 2px.
// Velocidade máximo
var spd = 2;

// Componentes de velocidade horizontal/X e vertical/Y
var xx = (keyboard_check(vk_right) - keyboard_check(vk_left))*spd;
var yy = (keyboard_check(vk_down) - keyboard_check(vk_up))*spd;

// Distancia que sera percorrida
var h = point_distance(0, 0, xx, yy);

// Maior que a velocidade maxima?
if h >= spd
{
    // Reduz os componentes X e Y
    var scalar = spd/h;
    xx *= scalar
    yy *= scalar
}

x += xx
y += yy
Imagem

Avatar do usuário
2yu291k7m
Novato
Novato
Reações: 0
Mensagens: 17

Re: [Problema] Velocidade Diagonal mais rapida!

Mensagem por 2yu291k7m » Qui Mar 09, 2017 5:09 pm

Só pra efeito de aprendizado, o que é o gabrielsch fez foi aplicar o teorema de Pitágoras no movimento diagonal do objeto, de uma maneira bem harmoniosa inclusive.

"A soma dos quadrados dos catetos é igual ao quadrado da hipotenusa", ou seja, o deslocamento na diagonal (hipotenusa) ao andar 2px horizontal e 2px vertical é

2²+2² = h²
h = raiz(8) >> 
2,8284271247461900976033774484194

Pelo meu código o objeto se move ~0,83px a mais do que deveria por step (na diagonal), o que não parece muito, mas em 30 fps acontece isso:
Imagem
O objeto vermelho roda o script do gabrielsch e o cinza, o meu.

Eu só colocaria um 'round' no script pra não dar o efeito de distorção na sprite quando desenhada em posições x/y quebrados.

Pra corrigir a falha do meu (sem usar fórmulas), já que o script do gabrielsch já está devidamente funcional, seria alterar o valor da velocidade pra metade do valor calculado (pra ~1,42) quando o objeto se mover na horizontal. Assim:

Código: Selecionar todos

vel = 2;
if (botao_direito && botao_cima) || (botao_direito && botao_baixo) || (botao_esquerdo && botao_cima) || (botao_esquerdo && botao_baixo)
vel = 1.41413;
Admito que não é uma solução muito elegante, mas funciona, veja:

Imagem

Quem quiser ver o que foi feito, pode baixar aqui:
http://www.filefactory.com/file/1s2q9dg ... agonal.gmk

Obs: Eu sou meio arcaico e ainda uso o GM8.

Responder

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes