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;}