Página 1 de 1

Me ajudem na colisão.

Enviado: Qua Mai 20, 2020 7:35 pm
por Nat_2005
Create
col = spd + 2;
spd = 5
//
Step
if(keyboard_check(vk_up)){y-=spd}
if(keyboard_check(vk_down)){y+=spd}
if(keyboard_check(vk_right)){x+=spd}
if(keyboard_check(vk_left)){x-=spd}
//
Parede(Collision)
if(place_free(x,y))
// //
Quero que tenha uma parede para o Player não sair da tela. Tentei vários códigos, nenhum deu certo.

Re: Me ajudem na colisão.

Enviado: Qui Mai 21, 2020 12:48 am
por Chuaschinai
Tente assim, com place_meeting que checa se há um determinado objeto, diferente de place_free, que checa se há um objeto sólido:

Create

Código: Selecionar todos

spd = 5; // a velocidade que você deseja que seu player ande, não exagere
hspd = 0; // hspd representa a velocidade horizontal
vspd = 0; // vspd representa a velocidade vertical
colisao = obj_solid; // Aqui você altera o objeto que quer colidir
Step

Código: Selecionar todos

var hor = keyboard_check(ord("D")) - keyboard_check(ord("A"));
var ver = keyboard_check(ord("S")) - keyboard_check(ord("W"));
hspd = hor * spd;
vspd = ver * spd;

// Checa se há um obj_solid no eixo X
if(place_meeting(x+hspd, y, colisao)){
  // Se houver ele entra em um loop para fazer a colisão ficar precisa (pixel por pixel)
  while(!place_meeting(x+sign(hspd), y, colisao)) x += sign(hspd);
  hspd = 0; // E quando colidir deixa a velocidade igual a 0
}
x += hspd; // Adiciona sua velocidade horizontal ao X do objeto

// Faz a mesma coisa que o código a cima porém usa o eixo Y
if(place_meeting(x, y+vspd, colisao)){
  while(!place_meeting(x, y+sign(vspd), colisao)) y += sign(vspd);
  vspd = 0;
}
y += vspd;
Bom basicamente este código, faz com que seu player colida com um objeto chamado obj_solid, ele usa o place_meeting para saber se há algum objeto chamado obj_solid para poder colidir com base na sua velocidade atual. O código não é complexo mas é muito útil para fazer movimentações básicas.

Existe também esse tutorial presente aqui mesmo no forum: PGM #MOVE 01 - Introdução: Movimento Top-Down, que utiliza o place_free, ao invés do place_meeting.