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.

Dúvida em um comando de colisão

Perguntas? A comunidade te ajuda a resolver.
Avatar do usuário
Josetti
Novato
Novato
Reações: 0
Mensagens: 1

Dúvida em um comando de colisão

Mensagem por Josetti » Seg Mar 27, 2023 6:39 pm

Sou novo no Game Maker e tenho pesquisado no youtube e em fóruns para aprender o básico da engine. Estou aprendendo a fazer um jogo de plataforma e na hora de fazer o processo de colisão eu não entendi para que servia uma parte específica do código. O comando Funciona bem, mas não entendo a finalidade desse trecho de código específico:

{
while(!place_meeting(x+sign(hspd),y,obj_Wall))
{
x = x + sign(hspd);





O código inteiro é esse daqui:





#region CONTROLES

key_right = keyboard_check(ord("D")) //DIREITA
key_left = keyboard_check(ord("A")) //ESQUERDA
key_jump = keyboard_check(vk_space) //PULO

#endregion


#region MOVIMENTAÇÃO
var move = key_right - key_left

hspd = move * spd;
vspd = vspd + grv;

if(hspd != 0) image_xscale = sign(hspd);

//COLSIÃO HORIZONTAL
if place_meeting(x+hspd,y,obj_Wall)
{
while(!place_meeting(x+sign(hspd),y,obj_Wall))
{
x = x + sign(hspd);
show_debug_message("certo")
}
hspd = 0;
}
x = x + hspd;


//COLSIÃO VERTICAL
if place_meeting(x,y+vspd,obj_Wall)
{
while(!place_meeting(x,y+sign(vspd),obj_Wall))
{
y = y + sign(vspd);
}
vspd = 0;
}
y = y + vspd;

//JUMP
if place_meeting(x,y+1,obj_Wall) and key_jump
{
vspd -= 8;
}
#endregion

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

Re: Dúvida em um comando de colisão

Mensagem por Chuaschinai » Sex Mar 31, 2023 7:01 pm

Basicamente, o place_meeting é um função que checa se em determinada posição há um determinado objeto:

Código: Selecionar todos

if place_meeting(x + hspd, y, obj_Wall) {
Nesta linha ele checara se na posição x do player somado com a velocidade/distancia hspd, haverá ou não um objeto parede, se houver:

Código: Selecionar todos

while (!place_meeting(x + sign(hspd), y, obj_Wall)) {
Ele fará um loop até ter certeza que colidiu com o objeto parede realmente, o while seria uma palavra chave da linguagem como se fosse um "função" que vai repetir o código determinada quantidade de vezes ate que a condição seja atendida, no caso a condição place_meeting, que vai checar pixel por pixel se na direção esquerda ou direita em que o player esta indo, se há uma parede ou não, enquanto não houver uma parede ele atualizara a posição x do player na linha seguinte:

Código: Selecionar todos

x = x + sign(hspd);
Para checar pixel por pixel ele checa então usando x + sign(hspd), a função sign permite que você pegue um valor e retorne seu sinal, para saber se é positivo ou negativo, se for maior que 0, ele retornara 1; se for menor que zero retorna -1; e se for 0 retorna 0.

Não sei se ficou claro, mas basicamente ele checa varias vezes para saber se colidiu ou não.

Avatar do usuário
akumasal
Novato
Novato
Reações: 0
Mensagens: 1

Re: Dúvida em um comando de colisão

Mensagem por akumasal » Qua Mai 03, 2023 1:27 pm

por algum motivo a colisão vertical funciona perfeitamente mas a horizontal não, sabe o que pode ser?

Responder

Quem está online

Usuários navegando neste fórum: Ahrefs [Bot] e 7 visitantes