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.

[90%] Inimigos seguindo o jogador grudando na parede!

Perguntas? A comunidade te ajuda a resolver.
Avatar do usuário
AdrianoPpaula
Membro
Membro
Reações: 0
Mensagens: 59
Localização: Quissamã RJ

Contato:

[90%] Inimigos seguindo o jogador grudando na parede!

Mensagem por AdrianoPpaula » Qui Abr 26, 2018 10:24 am

Fala pessoal blz com todo mundo? Então estou trabalhando em um protótipo básico de colisão de plataforma com rampas e está tudo funcionando perfeitamente agora porem com um detalhe que não consigo resolver. Eu criei um inimigo que segue o personagem a uma certa distancia porem quando eu subo em uma plataforma o inimigo gruda na parede e não consegue andar de volta. O mais estranho é que ele tem os mesmo script de colisão do player que não faz isso.

Vou colocar aqui o inimigo pois o player tem exatamente a mesma coisa só  muda os comandos de teclado mesmo para ser controlado.

Eu usei o código de rampa e colisão do Shaun Spalding ( https://www.youtube.com/channel/UCn7FE3Tx391g1tWPv-1tv7Q ) foi o melhor que achei e o que mais se adéqua ao meu projeto e o que teve menos bugs de colisão.


OBJETOS: ob_ini ; ob_chao , ob_hero
* Todos NÃO são sólidos
* global.hero - eu criei uma variável global que referencia o personagem
global.hero= (ob_hero)


OBJETO INI

CREATE

Código: Selecionar todos

/// MOVIMENTOS
yvel=0;
xvel=0;

STEP

Código: Selecionar todos

/// GRAVIDADE
if place_meeting(x,y+1,ob_chao){yvel=0} else {yvel+=1}

/// COLISAO
// HORIZONTAL COLISAO
if place_meeting(x+xvel,y,ob_chao){
   yplus=0;
   while place_meeting(x+xvel,y-yplus,ob_chao) and yplus <= abs(1*xvel){
         yplus +=1;
   }
   if place_meeting(x+xvel,y-yplus,ob_chao){
      while !place_meeting(x+sign(xvel),y,ob_chao){
         x+=sign(xvel)      
      }
      xvel=0
   } else { y -= yplus; }
}
x+= xvel;

// RAMPAS
if !place_meeting(x,y,ob_chao) and yvel >= 0 and place_meeting(x,y+2+abs(xvel),ob_chao)
{while(!place_meeting(x,y+1,ob_chao)) {y += 1;}}

// VERTICAL COLISAO
if place_meeting(x,y+yvel,ob_chao){
   while !place_meeting(x,y+sign(yvel),ob_chao){
         y+=sign(yvel)
   }
   yvel=0;
}
y+= yvel;


// DIREÇÃO SPRITE
if instance_exists(global.hero) {
   if x < global.hero.x {image_xscale=1} else {image_xscale=-1};
}

/// SEGUINDO
if distance_to_object(global.hero) <400 {
   if image_xscale=1{xvel=4} else {xvel=-4}
} else {xvel=0}

Então tudo funciona lindamente o personagem anda sem grudar nas paredes, pula perfeitamente, sobe nas rampas em qualquer velocidade. Os inimigos também anda perfeitamente e segue o personagem até mesmo nas rampas lindamente chega até emocionar!

Porem quando ele segue o personagem encosta na parede ele não consegue sair =/


TENTATIVA DE CORRIGIR ISSO

Coloquei no final do codigo do inimigo esse script que achei no fórum mas só deu certo para um dos lados. Quando o inimigo segue o personagem na direção esquerda e gruda na parede quando ele volta ele se teleporta bizarramente. =/

Código: Selecionar todos

// BUG PAREDE
while (place_meeting(x+xvel,y,ob_chao))
{x-=1;}
while (place_meeting(x-xvel,y,ob_chao))
{x+=1;}
Imagem

Avatar do usuário
None
Colaborador
Colaborador
Reações: 2
Mensagens: 286

Re: [90%] Inimigos seguindo o jogador grudando na parede!

Mensagem por None » Qui Abr 26, 2018 7:14 pm

Seu script possui um erro super bobo.

Você usou uma lógica LINDA para o código de movimento e esqueceu dela no script.

Você esta usando o + xvel uma vez (o que esta certo) e depois - xvel na outra vez, o que causa um erro lógico no seu código (ok tecnicamente não é um erro lógico).
Porque a sua xvel alterna entre valores positivos e negativos, logo nós usamos o operador de adição não para SOMAR da maneira que estamos acostumados (1+1+1 etc), mas para fazer com que ele some os dois valores o que pode gerar uma subtração (1 + (-10) por exemplo).

Eu aconselho você a implementar a mesma lógica do movimento ao script (com if e tudo mais), ou apenas tirar o sinal de subtração e colocar o de adição.

Alguns adendos, seu código visa encontrar a parede (o chão) e voltar, então a lógica do movimento teria que ser levemente invertida o resultado do sign teria que ser multiplicado por -1.
Se seu código der problema colocando o sinal de adição, você pode fazer o que eu disse acima ou colocar sinal de subtração, o que eu não aconselho porque ele deixa o código mais confuso do que explicitamente inverter algum valor, mas fica a seu gosto.
Tutorial de jogo de plataforma completo: https://youtu.be/MMUy_bMKqPk
Como criar um jogo de RPG Japonês no estilo Final Fantasy https://goo.gl/efr6fx

Responder

Quem está online

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