Onde as mentes criativas se encontram!


 
Avatar do usuário
AdrianoPpaula
Membro
Membro
Autor
Mensagens: 43
Registrado em: Qui Ago 27, 2015 5:56 am
Localização: Quissamã RJ
Karma: 20

Contato:

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

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

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



STEP
/// 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. =/
// BUG PAREDE
while (place_meeting(x+xvel,y,ob_chao))
{x-=1;}
while (place_meeting(x-xvel,y,ob_chao))
{x+=1;}
Imagem

Tags:
 
Avatar do usuário
None
Novato
Novato
Mensagens: 16
Registrado em: Sáb Abr 14, 2018 8:11 pm
Karma: 56

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

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.
Cachorro-quente!!!

Como criar um jogo de RPG Japonês no estilo Final Fantasy https://goo.gl/efr6fx

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante