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.

Adaptar ao jump through

Perguntas? A comunidade te ajuda a resolver.
Avatar do usuário
Christian
Membro
Membro
Reações: 0
Mensagens: 75

Adaptar ao jump through

Mensagem por Christian » Qua Set 02, 2020 1:32 pm

Como faço pra adaptar esse código pra fazer o player pular entre plataformas?

repeat(abs(vel_y)) {
if (!place_meeting(x,y+sign(vel_y),obj_solido) {
y += sign(vel_y);
}
else {
vel_y = 0;
}
}

Tentei de três maneiras e não consegui fazer dar certo. Alguém pode me ajudar?

Avatar do usuário
Chuaschinai
Colaborador
Colaborador
Reações: 5
Mensagens: 198

Re: Adaptar ao jump through

Mensagem por Chuaschinai » Qua Set 02, 2020 6:08 pm

As plataformas são fixas ou estão em movimento?.

No código só esta faltando um parênteses para fechar a linha do place_meeting.
Testa de novo e vê o no que dá.

Código: Selecionar todos

// STEP
vel_y += 0.25; // Gravidade
repeat(abs(vel_y)) {
	if (!place_meeting(x, y+sign(vel_y), obj_solid)) {
		y += sign(vel_y);
	}else {
		vel_y = 0;
	}
}
// Pulo
if(keyboard_check(ord("W")) && place_meeting(x, y+1, obj_solid)) {
	vel_y = -7;
}

Avatar do usuário
Christian
Membro
Membro
Reações: 0
Mensagens: 75

Re: Adaptar ao jump through

Mensagem por Christian » Ter Set 08, 2020 12:02 pm

Sim. A plataforma through é fixa
Meu código completo é esse aqui:

step:

Código: Selecionar todos

var dir, esq, cim;
dir = keyboard_check(vk_right);
esq = keyboard_check(vk_left);
cim = keyboard_check_pressed(vk_up);

var chao = place_meeting(x,y+1,obj_solido);
var chao1 = place_meeting(x,y+1,obj_jumpthru)

//gravidade e colisão com o chão
if (chao || chao1){
   if (cim) {vspd = -pulf;}
} else{
   vspd += grav;
}

//velocidade de movimento
hspd = mspd*(r-l)

//colisão horizontal
repeat(abs(hspd)){
   if (!place_meeting(x+sign(hspd), y, obj_solido)){
      x += sign(hspd);
   } else{
      hspd = 0;
   }
}

//colisão vertical
repeat(abs(vspd)){
   if (!place_meeting(x, y+sign(vspd), obj_solido)){
      y += sign(vspd);
   } else{
      vspd = 0;
   }
}
Esse é o código padrão que to usando pra fazer a colisão vertical, no entanto tentei modificar pra poder fazer o jump through
Aqui a modificação:

Código: Selecionar todos

repeat(abs(vspd)){
   if (!place_meeting(x, y+sign(vspd), obj_solido)){
      if (vspd>0 && place_meeting(x, y+sign(vspd), oj_solido)){
         vspd = 0;
      } else{
         y += sign(vspd);
      }
   } else{
      vspd = 0;
   }
}
Ele meio que funciona. Porém quando a plataforma jumpthru tá muito alta e ele colide automaticamente o player da um pulo, e tambem o player fica preso quando colide na horizontal, o movimento vertical para e o player fica la preso

Avatar do usuário
Chuaschinai
Colaborador
Colaborador
Reações: 5
Mensagens: 198

Re: Adaptar ao jump through

Mensagem por Chuaschinai » Ter Set 08, 2020 8:02 pm

Foi mal só deu pra responder agora de tarde.
Entendi seu problema agora, fiz um código rapidão meio na gambiarra mas parece funcionar.

Dei uma comentada meio cagada nele, mas da pra entender quando colar no Gamemaker.

Código: Selecionar todos

var _velocidade = 4;
vspd += 0.25;
hspd = (keyboard_check(vk_right) - keyboard_check(vk_left)) * _velocidade;

//colisão horizontal
if(place_meeting(x+hspd, y, obj_solido)) {
	while(!place_meeting(x+sign(hspd), y, obj_solido)) x+=sign(hspd);
	//Checa se há um objeto colidindo com a borda inferior da mask da sprite
	//Se sim ele colidirá horizontalmente com solido, se estiver no chão
	if(vspd == 0 && place_meeting(x, bbox_bottom+1, obj_solido))
		hspd = 0;
}
x += hspd;

//colisão vertical
if(vspd > 0) {
	// Aqui faço a colisão vertical com o instance_place ao invés do place_meeting
	// com o id obtido eu checo a posição do solido em comparação a borda
	// inferior da mask do player, fazendo com que ele colida somente se
	// estiver a cima do obj_solido
	var _solido = instance_place(x, y+vspd, obj_solido);
	if(_solido != noone) {
		if(_solido.y > bbox_bottom) {
			while(_solido == noone) {
				y += sign(vspd);
				_solido = instance_place(x, y+sign(vspd), obj_solido);
			}
			vspd = 0;
		}
	}
}
y += vspd;

// Aqui ele tambem só pula se realmente estiver no chão
var in_floor = instance_place(x, bbox_bottom+1, obj_solido);
if(in_floor != noone) {
	if(keyboard_check(vk_up) && vspd == 0 && in_floor.bbox_top == bbox_bottom+1)
		vspd = -7;
}

Responder

Quem está online

Usuários navegando neste fórum: Google [Bot] e 6 visitantes