Página 1 de 1

Adaptar ao jump through

Enviado: Qua Set 02, 2020 1:32 pm
por Christian
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?

Re: Adaptar ao jump through

Enviado: Qua Set 02, 2020 6:08 pm
por Chuaschinai
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;
}

Re: Adaptar ao jump through

Enviado: Ter Set 08, 2020 12:02 pm
por Christian
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

Re: Adaptar ao jump through

Enviado: Ter Set 08, 2020 8:02 pm
por Chuaschinai
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;
}