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
Dúvida em um comando de colisão
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
{
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
- Chuaschinai
- Colaborador
- Reações: 6
- Mensagens: 198
-
Re: Dúvida em um comando de colisão
Basicamente, o place_meeting é um função que checa se em determinada posição há um determinado objeto:
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:
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:
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.
Código: Selecionar todos
if place_meeting(x + hspd, y, obj_Wall) {
Código: Selecionar todos
while (!place_meeting(x + sign(hspd), y, obj_Wall)) {
Código: Selecionar todos
x = x + sign(hspd);
Não sei se ficou claro, mas basicamente ele checa varias vezes para saber se colidiu ou não.
Re: Dúvida em um comando de colisão
por algum motivo a colisão vertical funciona perfeitamente mas a horizontal não, sabe o que pode ser?
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes