Onde as mentes criativas se encontram!


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

Contato:

[95%]Movimentação em rampa simples ajuda

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
if place_free(x,y+1) {
gravity+= 0.25;
} else {
   gravity=0
}


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

COLISÃO COM RAMPA
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 Jul 31, 2017 5:19 pm, em um total de 4 vezes.
Imagem
 
Avatar do usuário
Dust
Membro
Membro
Mensagens: 112
Registrado em: Qui Mai 26, 2016 6:56 pm
Localização: Santa Catarina

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

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
Autor
Mensagens: 38
Registrado em: Qui Ago 27, 2015 5:56 am
Localização: Quissamã RJ

Contato:

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

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
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
if place_free(x,y+1) {
vspeed+=peso;no_ar= true
} else {
   vspeed=0; no_ar= false
}


STEP - SPRITE
// 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
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
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
 
2yu291k7m
Novato
Novato
Mensagens: 17
Registrado em: Qui Mar 09, 2017 3:45 pm

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

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:

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
Mensagens: 67
Registrado em: Qua Fev 24, 2016 5:17 pm

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

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:

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
Venha jogar meu jogo!
The Journey

e se você quiser comentar algo,ou até dar uma sugestão para o jogo Clique Aqui ,Ele está tecnicamente finalizado mas boas sugestões sempre são aceitas :P
 
2yu291k7m
Novato
Novato
Mensagens: 17
Registrado em: Qui Mar 09, 2017 3:45 pm

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

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
Autor
Mensagens: 38
Registrado em: Qui Ago 27, 2015 5:56 am
Localização: Quissamã RJ

Contato:

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

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 [font=-apple-system, Helvetica Neue, Roboto, Segoe UI, Helvetica, sans-serif]2yu291k7m queria saber onde que coloco esse código? seria no step do personargem? ou na colisão do chão?[/font]
Imagem
 
2yu291k7m
Novato
Novato
Mensagens: 17
Registrado em: Qui Mar 09, 2017 3:45 pm

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

Qua Mar 15, 2017 4:31 pm

É evento step, o código completo é:

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
Autor
Mensagens: 38
Registrado em: Qui Ago 27, 2015 5:56 am
Localização: Quissamã RJ

Contato:

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

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
// 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]

player_dash=false


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


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
 
2yu291k7m
Novato
Novato
Mensagens: 17
Registrado em: Qui Mar 09, 2017 3:45 pm

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

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
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:
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.

Quem está online

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