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.

3D: como posso detectar a colisão?

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

3D: como posso detectar a colisão?

Mensagem por Cambalinho » Qui Jul 20, 2017 2:49 pm

eu ainda estou aprender cada vez mais sobre o Game Maker Studio 1.4, mas ainda estou muito limitado em 3D.
como posso testar a colisão em 3D?

Avatar do usuário
lucaslima
Novato
Novato
Reações: 0
Mensagens: 18

Re: 3D: como posso detectar a colisão?

Mensagem por lucaslima » Qui Jul 20, 2017 5:06 pm

Olá! Como você está iniciando no game maker, acho útil que você veja estes canais no youtube:
https://www.youtube.com/user/uheartbeast/feed
https://www.youtube.com/channel/UCAumdO1yv-di4fI6IZQIy3Q
https://www.youtube.com/channel/UCOs7Q7IeuzgRyARaEqif75A
https://www.youtube.com/channel/UCJvrLzbg4VPRxzf2vhW7G4A
https://www.youtube.com/channel/UCn7FE3Tx391g1tWPv-1tv7Q
https://www.youtube.com/channel/UCEHvTxm7M3EhrvFB5-_-veQ

São canais muito bons que foi onde eu aprendi muita coisa, mas nunca me interessei em 3D, por isso te passo estes vídeos para tentar te ajudar.

Abraço.

Avatar do usuário
Cambalinho
Membro
Membro
Reações: 0
Mensagens: 59

Re: 3D: como posso detectar a colisão?

Mensagem por Cambalinho » Qui Jul 20, 2017 6:30 pm

eu ja consegui e esta muito fixe ;)
mas ainda tenho problemas devido a variavies :(
posso criar variaveis, num objecto, como o 'x'?
depois eu fazia nomedoobjecto.z ou outra.

Código: Selecionar todos

///Collision3D(PosX1, PosY1, PosZ1, W1, H1, P1, PosX2, PosY2, PosZ2, W2, H2, P2, CollisionDiference);

PosX1=argument0;
PosY1=argument1;
PosZ1=argument2;
W1=argument3;
H1=argument4;
P1=argument5;

PosX2=argument6;
PosY2=argument7;
PosZ2=argument8;
W2=argument9;
H2=argument10;
P2=argument11;
CollisionDiference=argument12;

if ((PosX1 < (PosX2 + W2)) && (PosX2 < (PosX1 + W1)))
{
    if ((PosY1 < (PosY2 + H2)) && (PosY2 < (PosY1 + H1)))
    {
        if ( (PosZ1<(PosZ2+P2)) && (PosZ2<(PosZ1+P1)))
        {            
            return true;
        }
    }    
}
return false;
se conseguir-se, eu melhorava a função a 100% e com menos argumento.
as variavies globais podem ser alteradas em qualquer lado. mas eu preciso de variavies com valores diferentes entre instancias de objectos

EDIT 1:

eu ao criar variaveis num objecto, eu tenho acesso a elas num script. e isso foi muito bom.
continuando com a colisão, eu fiz outra função:

Código: Selecionar todos

///Collision3D(PosX1, PosY1, PosZ1, W1, H1, P1, PosX2, PosY2, PosZ2, W2, H2, P2, CollisionDiference);

PosX1=argument0;
PosY1=argument1;
PosZ1=argument2;
W1=argument3;
H1=argument4;
P1=argument5;

PosX2=argument6-argument12;
PosY2=argument7-argument12;
PosZ2=argument8-argument12;
W2=argument9+(argument12*2);
H2=argument10+(argument12*2);
P2=argument11+(argument12*2);

if ((PosX1 < (PosX2 + W2)) && (PosX2 < (PosX1 + W1)))
{
    if ((PosY1 < (PosY2 + H2)) && (PosY2 < (PosY1 + H1)))
    {
        if ( (PosZ1<(PosZ2+P2)) && (PosZ2<(PosZ1+P1)))
        {            
            return true;
        }
    }    
}
return false;
e

Código: Selecionar todos

///Collision3DObjectName(Object1, Object2, CollisionDiference);

PosX1=argument0.x;
PosY1=argument0.y;
PosZ1=argument0.z;
W1=argument0.w;
H1=argument0.h;
P1=argument0.p;

PosX2=argument1.x-argument2;
PosY2=argument1.y-argument2;
PosZ2=argument1.z-argument2;
W2=argument1.w+(argument2*2);
H2=argument1.h+(argument2*2);
P2=argument1.p+(argument2*2);

if ((PosX1 < (PosX2 + W2)) && (PosX2 < (PosX1 + W1)))
{
    if ((PosY1 < (PosY2 + H2)) && (PosY2 < (PosY1 + H1)))
    {
        if ( (PosZ1<(PosZ2+P2)) && (PosZ2<(PosZ1+P1)))
        {
            var dir=direction*pi/180;
            argument0.x += (sin(dir)*4);
            argument0.y += (cos(dir)*4);
            speed=-10;
            return true;
        }
    }    
}
return false;
ambas funcionam a 100%.
o 'p' é a expessura do objecto em z.
mas eu tenho 1 problema que não sei controlar. ao andar para a frente e para trás eu altero o 'speed', mas como posso testar o movimento antes de o fazer?
o object tem x,y e z, mas com o 'speed' e direction eu nao sei o que vou somar :(
alguem pode me dar dicas?

EDIT 2:

agora fiz 1 actualização na função:

Código: Selecionar todos

///Collision3DAllObjects(PosX1, PosY1, PosZ1, W1, H1, P1);

PosX1=argument0;
PosY1=argument1;
PosZ1=argument2;
W1=argument3;
H1=argument4;
P1=argument5;

for (i=0;i<(instance_count-1);i++)
{
    PosX2=instance_id[i].x;
    PosY2=instance_id[i].y;
    PosZ2=instance_id[i].z;
    W2=instance_id[i].w;
    H2=instance_id[i].h;
    P2=instance_id[i].p;
    
    if ((PosX1 < (PosX2 + W2)) && (PosX2 < (PosX1 + W1)))
    {
        if ((PosY1 < (PosY2 + H2)) && (PosY2 < (PosY1 + H1)))
        {
            if ( (PosZ1<(PosZ2+P2)) && (PosZ2<(PosZ1+P1)))
            {            
                return true;
            }
        }    
    }
}
return false;
mas tenho 1 erro:
"___________________________________________
############################################################################################
FATAL ERROR in
action number 1
of Keyboard Event for <Up> Key
for object objCamera:

Push :: Execution Error - Variable Get 100000.z(100013, -2147483648)
 at gml_Script_Collision3DAllObjects (line 14) -     PosZ2=instance_id.z;
############################################################################################
--------------------------------------------------------------------------------------------
stack frame is
gml_Script_Collision3DAllObjects (line 14)
called from - gml_Object_objCamera_Key_UP_1 (line 3) - if Collision3DAllObjects(x+cos(direction*pi/180)*diference,y-sin(direction*pi/180)*diference,z+diference,w,h,p)"

"Push :: Execution Error - Variable Get 100000.z(100013, -2147483648)

 at gml_Script_Collision3DAllObjects (line 14) -     PosZ2=instance_id.z;"
line 14:

Código: Selecionar todos

PosZ2=instance_id[i].z;
mas eu criei o 'z' no objecto... mas que erro eu fiz?

Responder

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante