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.

[RESOLVIDO] Movimentação em rampa simples ajuda

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

Contato:

[RESOLVIDO] Movimentação em rampa simples ajuda

Mensagem por AdrianoPpaula » Qua Mar 08, 2017 11:41 am

Fala galera blz? Então to pesquisando e tentando fazer um movimento simples para rampas em jogos plataformas  mas não consigo achar algo que me ajude e o pouco que acho é extremamente complexo...fico me perguntando sera que existe uma maneira fácil de fazer isso, então comecei a fazer por contra própria e queria a ajuda de vocês. 

GRAVIDADE PERSONAGEM

Código: Selecionar todos

if place_free(x,y+1) {
gravity+= 0.25;
} else {
   gravity=0
}
COLIÇÃO CHÃO

Código: Selecionar todos

if vspeed > 0 and !place_free(x,y+vspeed){
   move_contact_solid(direction,12); 
   vspeed = 0;
} else{
   hspeed=0
}
COLISÃO COM RAMPA

Código: Selecionar todos

if hspeed>0{

y-=1[/size]

x+=2[/size]
}

if vspeed > 0 and !place_free(x,y+vspeed){
move_contact_solid(direction,12); 
vspeed = 0;
} else{
hspeed=0
}
isso ae está bem simples e rústico mas atualmente está assim
Imagem

-----------------
Editado pela última vez por AdrianoPpaula em Seg Jan 07, 2019 4:24 pm, em um total de 5 vezes.
Imagem

Avatar do usuário
Dust
Membro
Membro
Reações: 0
Mensagens: 109
Localização: Santa Catarina

Re: [20%]Movimentação em rampa simples ajuda

Mensagem por Dust » Qua Mar 08, 2017 3:23 pm

Uma forma bem simples de se fazer seria vendo a distancia do objeto player com o objeto rampa e ver qual tecla está sendo pressionada, não testei mas talvez funcione:
if distance_to_object(obj_rampa)<=0 && vkright=true {x+=2;y+=1}
ai é só fazer o mesmo esquema com a left e páh...
mas, pode ser que ele fique pulando na hora de descer, por isso é bom separar em obj_rampa1 e rampa2, cada uma com um lado diferente, ai se estiver descendo da rampa 1 é só trocar de y+1 pra y-1... conforme o que for acontecendo é só ir configurando aos poucos assim.

Avatar do usuário
AdrianoPpaula
Membro
Membro
Reações: 0
Mensagens: 59
Localização: Quissamã RJ

Contato:

Re: [20%]Movimentação em rampa simples ajuda

Mensagem por AdrianoPpaula » Seg Mar 13, 2017 1:12 pm

Eu dei uma mexida alterando da forma que você falou e funcionou maios ou menos. o problema agora é com a gravidade do personagem...não estou conseguindo fazer com que o personagem pare de cair quando está descendo da rampa...atualmente o código está assim:

CREATE PERSONAGEM

Código: Selecionar todos

peso=0.25 // determina o peso do personagem na vspeed
no_ar= false // variável criada para determinar se o player no ar ou no chão, essa variável atualmente serve para trocar o sprite do personagem de spr_parado para spr_caindo
GRAVIDADE PERSONAGEM -STEP
Código: Selecionar todos

Código: Selecionar todos

if place_free(x,y+1) {
vspeed+=peso;no_ar= true
} else {
   vspeed=0; no_ar= false
}
STEP - SPRITE

Código: Selecionar todos

// correrndo e parando sprite
if hspeed> 0 or hspeed < 0 {sprite_index= (spr_correr)} else {sprite_index=(spr_parado)}

// caindo 
if no_ar= true {sprite_index= (spr_caindo)}


COLISÃO CHÃO
Código: Selecionar todos

Código: Selecionar todos

if vspeed > 0 and !place_free(x,y+vspeed) {
move_contact_solid(direction,12); 
vspeed = 0;
no_ar= false;

} else{hspeed=0}

COLISÃO COM RAMPA
Código: Selecionar todos

Código: Selecionar todos

if hspeed>0 { no_ar= false;

hspeed+=2

y-=7.5

}
if hspeed<0 { no_ar= false;
hspeed-=2

[size=85]y-=7.5[/size]
}


if vspeed > 0 and !place_free(x,y+vspeed) {
move_contact_solid(direction,12); 
vspeed = 0;
no_ar= false;

} else{hspeed=0}
no caso ele está subindo e descendo normalmente agora....as vezes uma travada na hora de subir....e quando ele vai descer o sprite de cair muda como se ele estivesse caindo mesmo. =/
Imagem

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

Re: [70%]Movimentação em rampa simples ajuda

Mensagem por 2yu291k7m » Ter Mar 14, 2017 10:53 am

Amiguinho, tem que fazer uma verificação dos pixels adjacentes junto do place_free e "ajustar" a posição (y), existem várias formas de fazer isso, através de loops principalmente, a melhor forma seria pelo for, pois você controla quantas iterações serão realizadas:

Código: Selecionar todos

if esquerda {
for (i=0; i<=margem; i+=1;)
    { 
    if place_free(x-velocidade,y-i) {
    x-= velocidade;
    y-= i; exit;
    }}}

if direita {
for (i=0; i<=margem; i+=1;)
    { 
    if place_free(x-velocidade,y-i) {
    x-= velocidade;
    y-= i; exit;
    }}}
Onde "velocidade" é a variável de deslocamento do jogador e "margem" a variável da quantidade de verificações do pixel, pode deixar como variável ou colocar um número direto ali, 8 é um valor bacana, o comando "exit" precisa estar ali, pois ele interrompe o loop quando o if retornar true.

Consegui um resultado bacana:
Imagem

Claro que a máscara de colisão do jogador não vai ser desse tamanho, o ideal é centralizar e deixar cerca de 40% da largura total.

Avatar do usuário
divin sphere hirosha
Membro
Membro
Reações: 1
Mensagens: 97

Re: [70%]Movimentação em rampa simples ajuda

Mensagem por divin sphere hirosha » Ter Mar 14, 2017 4:39 pm

Eu tenho uma forma de fazer Colisão com rampa mas não sei se vai funcionar com você,mas tô:

Eu crio um Parent_rampas e coloco em todas as rampa,
Este Parent está marcando como Solido,e as rampas em sí não,
Na colisão com o Parent_rampas eu coloco o mesmo codigo de colisão com os blocos normais

E no End Step do player eu coloco:

Código: Selecionar todos

while place_meeting(x,y+0.2,parent_rampas)
{
y-=0.1
}
Dependendo do sprite da rampa você vai se deparar com o bug na hora de entrar ou sair na rampa mas eu tenho uma forma legal de corrigir:
Clone o objeto bloco,e nele você faz como se ele fosse uma rampa(mas com o mesmo sprite do bloco normal)coloca o Parent_rampas nele e deixa ele não sólido,e na hora de colocar uma rampa você faz algo como:
-
[bloco] [ bloco] [bloco_rampa] [rampa] [bloco_rampa]
-
Não sei se ficou bem explicado mas sempre funciona comigo xD
É uma forma simples de fazer mas tem quase o mesmo efeito de um sistema mais avançado xD
Ei você! você que está do outro lado da telinha, Tudo ótimo? Venha conferir meus projetos na google play!

Cubow Racer Infinity
MineField
FishBreak
Bring The Block

Ver Todos os Projetos

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

Re: [70%]Movimentação em rampa simples ajuda

Mensagem por 2yu291k7m » Ter Mar 14, 2017 9:38 pm

Imagem

Não recomendo fazer um loop descontrolado como esse do amiguinho acima, ainda ajustando a posição em fator de 0.1, essas travadas são porque o algoritmo "se perde" e entra em um loop desnecessário (dai a quantidade de "voltas" é suficiente pra dar travadas visíveis), faz via for que é sucesso bro.. :) Qualquer coisa te passo o algoritmo todo funcional..

Avatar do usuário
AdrianoPpaula
Membro
Membro
Reações: 0
Mensagens: 59
Localização: Quissamã RJ

Contato:

Re: [70%]Movimentação em rampa simples ajuda

Mensagem por AdrianoPpaula » Qua Mar 15, 2017 1:10 pm

Eu tentei o modo do divin e funcionou bem porem na hora de subir na rampa direita ele não funciona....vou fazer mais teste



agora no modo do 2yu291k7m queria saber onde que coloco esse código? seria no step do personargem? ou na colisão do chão?
Imagem

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

Re: [70%]Movimentação em rampa simples ajuda

Mensagem por 2yu291k7m » Qua Mar 15, 2017 4:31 pm

É evento step, o código completo é:

Código: Selecionar todos

gravity = 1; //gravidade
margem = 8; /*quantos pixels ele verifica na rampa *depende do que você quer, o ideal é 8px, pra não "saltar" o que não deveria*/
velocidade = 4; //deslocamento horizontal
pulo = 15; //velocidade pulo

//configurações de botões
esquerda = keyboard_check(vk_left);
direita = keyboard_check(vk_right);
cima = keyboard_check(vk_up);

if (vspeed >= 0 && !place_free(x,y + vspeed + 1)) 
  {
  move_contact_solid(270,vspeed + 1);
  vspeed = 0;
  gravity = 0;
  }
  
if esquerda && (!cima) 
  {
  for (i = 0; i<= margem; i += 1;)
    {
    if place_free(x-velocidade,y-i)
      {
      x-= velocidade; y-= i; exit; //o exit aqui é pra "escapar" do loop
      }
    }
  }
else
  {
  if place_free(x-velocidade,y + vspeed + gravity) && esquerda 
    {
    x = x-velocidade;
    }
  }
if direita && (!cima) 
  {
  for (i = 0; i<= margem; i += 1;)
    {
    if place_free(x + velocidade,y-i)
      {
      x += velocidade; y-= i; exit;
      }
    }
  }
else
  {
  if place_free(x + velocidade,y + vspeed + gravity) && direita 
    {
    x = x + velocidade;
    }
  }

if cima && !place_free(x,y + 1) vspeed = -pulo;

if (!place_free(x,y-sprite_yoffset + vspeed)) 
  {
  vspeed = gravity;
  }
if (!place_free(x,y)) && place_free(x,y-1) 
  {
  y = y-1;
  vspeed = 0;
  }
Lembrando que rampas e plataformas em geral precisam estar setados como "solid", apenas.

Avatar do usuário
AdrianoPpaula
Membro
Membro
Reações: 0
Mensagens: 59
Localização: Quissamã RJ

Contato:

Re: [90%]Movimentação em rampa simples ajuda

Mensagem por AdrianoPpaula » Seg Mar 20, 2017 4:25 am

Rapaz, tá funcionando perfeitamente, só estou enfrentando algumas incorreções com sistemas que já existia no meu jogo, por exemplo:

Bom no meu jogo existe um sistema de DASH onde se aperto um botão o personagem correr rapidamente por alguns segundos, o problema é que as vezes ele fica travado na rampa quando sobe, atualmente está assim:

STEP Personagem

Código: Selecionar todos

// DASH

if keyboard_check_pressed(ord("C") and alarm[0]<=0 {
player_dash=true;
if alarm[0]<=0 {alarm[0]=12}
}


//velocidade dash
if player_dash= true {velocidade+=20}
ALARM[0]

Código: Selecionar todos

player_dash=false
outra coisa é a hora de colocar o sprite de cair pois eu coloco assim

Código: Selecionar todos

if place_free(x,y+1) {sprite_index=(sp_player_cair)} else {sprite_index=(sp_player_parado)} 
mas na hora da rampa como o personagem sempre sobe 1 no y ele automaticamente muda de sprite caindo e depois volta para o normal =/
Imagem

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

Re: [90%]Movimentação em rampa simples ajuda

Mensagem por 2yu291k7m » Seg Mar 20, 2017 9:48 am

Amigo, altera apenas o valor da variável "velocidade", e não incrementa direto nela (ainda mais um valor tão alto), ou então atribui a mudança com um limitador, algo assim

Código: Selecionar todos

if velocidade<=30 { velocidade += 5; }

Lembrando que quanto maior a velocidade, maior tem que ser a margem de verificação dos pixels adjacentes, pois o objeto "salta" uma quantidade maior de pixels por step, fazendo que com que ele conflita posição com a rampa, tente aumentar o valor da variável margem quando aumentar a velocidade.

Sobre o problema visual, você tem duas soluções, a primeira seria deixar pra alterar a sprite "cair" quando o jogador se distanciar pelo menos 3 pixels da plataforma, assim:

Código: Selecionar todos

if place_free(x,y+3) //...
E a segunda é setando a alteração da sprite "caindo" através de um alarm (e não direto no step), algo em torno de 3 ou 4 frames acho que já corrige o problema

Em ambas as opções a troca da imagem fica atrasada, impedindo que dê essa falha visual, é um truque pra "mascarar" pequenas falhas visual para o jogador, na realidade fica imperceptível.

Avatar do usuário
AdrianoPpaula
Membro
Membro
Reações: 0
Mensagens: 59
Localização: Quissamã RJ

Contato:

Re: [90%]Movimentação em rampa simples ajuda

Mensagem por AdrianoPpaula » Seg Jul 31, 2017 5:18 pm

Fala ai pessoal blz ^^ 
Não sei se pode ressuscitar tópicos antigos mas só falta um esclarecimento a respeito dessa programação de rampa. Ultimamente adicionei mais elementos no jogo como plataformas fantasmas e lugares com teto para que o personagem não pule. atualmente o código está dessa maneira:


STEP - VARIÁVEIS VALORES

Código: Selecionar todos

/// MOVIMENTAÇÃO VARIAVEIS
if noar= true {gravity=0} else {gravity=1.9};
margem= 9;
velocidade= 8;
pulo= 26;

//configurações de botões
esquerda = vk_left;
direita = vk_right;
cima = keyboard_check(ord("X"));
b_ataque= keyboard_check(ord("C"));
STEP - MOVIMENTAÇÃO

Código: Selecionar todos

// COLISÃO COM CHÃO
if vspeed >=0 and !place_free(x,y + vspeed + 2) {  
move_contact_solid(270,vspeed +2); 
  vspeed = 0;
  gravity = 0;
 noar= false;
} else {hspeed=0}

//================================


// DIREITA
if direita and (!cima) {
   for (i=0; i<=margem; i+=1;){ 
        if place_free(x+velocidade,y-i) {
            hspeed= + velocidade; image_xscale=1 ;
            y-= i; exit;
        }
    }
} else { hspeed=0; direita= false };

// ===============================================

// ESQUERDA
if esquerda and (!cima) {
    for (i=0; i<=margem; i+=1;) { 
        if place_free(x-velocidade,y-i) {
            hspeed= -velocidade; image_xscale=-1;
            y-= i; exit;
        }
    }
} else { hspeed=0; esquerda= false }; 

//==========================================================

// PULO
if cima=true and noar= false {  
for (i=0; i<=margem; i+=1;) { 
    if place_free(x,y-i){
    vspeed = -pulo;
    y-=i exit;
    }

if place_free(x,y+1){
     vspeed = gravity;
    }
} {cima=false}
Então depois de muito tempo o código está polido e funcionando perfeitamente em todas as mecânicas do jogo só existe 3 erros que estão me atormentando (já to 2 dias seguidos e nada até agora)

1. O personagem misteriosamente fica grudado somente na quina da plataforma, em paredes ele está normal mas é somente nas pontinhas das plataforma o personagem fica em um lupe subindo e descendo rapidamente. Não entendi o porque ele está fazendo isso até agora.
Imagem
2. O segundo erro deve ser mais fácil de resolver. ele da uma leve travada quando bate com a cabeça no teto, como se a hspeed ficasse 0 e depois voltasse ao normal. quando vc bate no teto parado ele não faz isso ele continua um pouco mais depois cai, agora quando bato no teto andando ele da essa leve travada, isso prejudica muito pois quando vou colocar plataformas onde o personagem bate no telo, isso atrapalho o pulo.

3. O ultimo também aparentemente deve ser alguma coisa que está dando conflito. Quando venho correndo e tento pular na ponta da plataforma o pulo não ativa e ele cai. Acho que os outros erros deve tá gerando esse.
Imagem

Responder

Quem está online

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