Página 1 de 1
[RESOLVIDO] Movimentação em rampa simples ajuda
Enviado: Qua Mar 08, 2017 11:41 am
por AdrianoPpaula
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
-----------------
Re: [20%]Movimentação em rampa simples ajuda
Enviado: Qua Mar 08, 2017 3:23 pm
por Dust
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.
Re: [20%]Movimentação em rampa simples ajuda
Enviado: Seg Mar 13, 2017 1:12 pm
por AdrianoPpaula
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. =/
Re: [70%]Movimentação em rampa simples ajuda
Enviado: Ter Mar 14, 2017 10:53 am
por 2yu291k7m
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:
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.
Re: [70%]Movimentação em rampa simples ajuda
Enviado: Ter Mar 14, 2017 4:39 pm
por divin sphere hirosha
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:
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
Re: [70%]Movimentação em rampa simples ajuda
Enviado: Ter Mar 14, 2017 9:38 pm
por 2yu291k7m
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..
Re: [70%]Movimentação em rampa simples ajuda
Enviado: Qua Mar 15, 2017 1:10 pm
por AdrianoPpaula
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?
Re: [70%]Movimentação em rampa simples ajuda
Enviado: Qua Mar 15, 2017 4:31 pm
por 2yu291k7m
É 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.
Re: [90%]Movimentação em rampa simples ajuda
Enviado: Seg Mar 20, 2017 4:25 am
por AdrianoPpaula
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]
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 =/
Re: [90%]Movimentação em rampa simples ajuda
Enviado: Seg Mar 20, 2017 9:48 am
por 2yu291k7m
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
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:
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.
Re: [90%]Movimentação em rampa simples ajuda
Enviado: Seg Jul 31, 2017 5:18 pm
por AdrianoPpaula
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.

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.