Avatar do usuário
Alex FC
Administrador
Administrador
Autor
Mensagens: 510
Registrado em: Dom Abr 24, 2016 11:50 pm
Localização: Itaporã-MS
Karma: 896

Contato:

[FIS] Usando física no GM:S - Parte 2 (Oficial)

Qui Mai 26, 2016 1:36 pm

USANDO FÍSICA NO GAMEMAKER: STUDIO - PARTE 2

Autor original: Mark Alexander


Hoje, seguiremos com o tutorial sobre física no GameMaker: Studio. Se você ainda não leu a parte 1, clique no botão baixo:

Clique aqui

É extremamente recomendado que você tenha o GMZ que foi disponibilizado na parte 1 pra gente seguir aqui, assim vamos continuar de onde paramos.

Neste artigo, vamos deixar a interface de objeto para trás e mergulhar no código GML de Física. Este é um passo necessário, pois ali na edição do objeto somos litados aos campos com valores fixos, mas se você quiser ter qualquer controle sobre uma instância física, você precisa usar códigos já que não há ações Drag'n'Drop equivalentes para elas. No entanto, como você verá, a transição para o código é bastante fácil, desde que você tenha compreendido os fundamentos e que você tenha um pouco de paciência! xD

CONFIGURANDO FIXTURES ATRAVÉS DE CÓDIGOS

Em nosso artigo anterior montamos uma room, criamos alguns objetos e configuramos algumas propriedades físicas através da interface do GameMaker. Agora vamos converter essas propriedades físicas de interface para propriedades físicas codificados para que depois possamos permitir ao usuário interagir com eles. Então, para começar, abra o objeto "obj_Base" e adicione um evento Create.

Nesse evento, adicione um bloco de código:

var fixture = physics_fixture_create ();
physics_fixture_set_box_shape (fixture, sprite_width / 2, sprite_height / 2);
physics_fixture_set_density (fixture, 0);
physics_fixture_set_restitution (fixture, 0.2);
physics_fixture_set_friction (fixture, 0.5);
physics_fixture_bind (fixture, id);
physics_fixture_delete (fixture);


Vamos ver o que está acontecendo nesse pedaço de código...

  1. Nós criamos um fixture que é a combinação do shape com as propriedades de um corpo físico.
  2. Nós definimos o shape do fixture como sendo uma caixa. Ele possui a metade da dimensão da sprite, pois funciona como um raio que inicia na origem..
  3. Nós definimos a densidade em 0 (Ou seja um objeto estático, você lembra?), e, em seguida, um par de outras propriedades básicas. Note que não é necessário definir todas as propriedades disponíveis como linear damping e etc ... já que para um objeto estático eles não são necessários.
  4. Nós anexamos o fixture na instância, transferindo efetivamente as propriedades físicas e forma para a instância.
  5. Nós excluímos o fixture, já que não precisamos mais (Já que ele foi transferido) e para economizar memória.


Você pode estar se perguntando por que excluir o fixture se isso é o que precisamos para dar as propriedades físicas de instância? Bem, vamos abstrair isso por um momento vamos e pensar sobre objetos e instâncias. Como você deve saber, um objeto é como uma "forma de doces" e uma instância é o que é criado com essa forma. Então objetos nunca estão presentes nas rooms, e sim uma instância desse objeto, e uma instância também pode ser alterada após a sua criação e usar valores de variáveis diferentes ou chamar scripts diferentes, etc ... fixtures trabalharam da mesma forma. você cria uma "forma de doce" de um fixture que pode, em seguida, ser copiado para uma instância. Este fixture copiado é o que é realmente criado e utilizado na room para a simulação de física, não o fixture de "forma de doce", então podemos eliminá-lo quando terminamos de copiá-lo para a instância.

Se você adicionar este código para o objeto estático "obj_Base" (E desmarcar "Uses Physics" o objeto ainda vai ser habilitado para física mesmo assim, justamente por causa do código), você pode testar novamente e note que não há qualquer diferença.

Vale a pena notar que, que o anexo do fixture ocorre após a instância ser criada, você pode definir uma escala vertical ou horizontal para a instância no editor de rooms e definir o fixture apenas uma vez usando esses valores e a instância terá um fixture do mesmo tamanho. Isso não pode ser feito com a com os campos fixos que temos no editor de objetos. Você pode testar isso indo para o editor de rooms e esticar o "obj_Base" ao longo do eixo x ou y e executar o exemplo novamente.

Agora você pode fazer o mesmo para o "obj_Block" e objetos "obj_Circle", desabilitando o "Uses Physics" no editor de objetos e adicionando código para criar o fixture no Evento Create. O código em si deve ser simples para você criar (Se não é, leia tudo novamente), já que usaremos os mesmos valores que nós tínhamos no editor de objetos. Use o manual para ajudar caso queira mais detalhes, pois tem exemplos para todas as funções que usamos aqui.

CODIFICAÇÃO DE UM FIXTURE POLIGONAL

fixtures de polígonos são ligeiramente diferentes dos fixures de caixa e de circulo, já que você tem que definir as posições de cada ponto do polígono via código. Vamos olhar para o código de ligação de um fixture poligonal para o objeto "obj_Triangle" e, em seguida, explico o que ocorre:

var fixture = physics_fixture_create ();
physics_fixture_set_polygon_shape (fixture);
physics_fixture_add_point (fixture, 0, - (sprite_height / 2));
physics_fixture_add_point (fixture, sprite_width / 2, sprite_height / 2);
physics_fixture_add_point (fixture, - (sprite_width / 2), sprite_height / 2);
physics_fixture_set_density (fixture, 0.8);
physics_fixture_set_restitution (fixture, 0.1);
physics_fixture_set_linear_damping (fixture, 0.5);
physics_fixture_set_angular_damping (fixture, 0.5);
physics_fixture_set_friction (fixture, 0.5);
physics_fixture_bind (fixture, id);
physics_fixture_delete (fixture);


O código é praticamente o mesmo que para os fixtures anteriores, só nós temos uma função extra ali que é usada para definir os pontos do polígono. Você deve chamar esta função, pelo menos, três vezes, (já que você não pode ter um polígono com menos de três pontos senão você obterá um erro), e um máximo de 8 (Mais pontos também resultará em erro). Observe também que os pontos são definidos no espaço local. O que isto significa é que os pontos de polígonos não são definidos usando as coordenadas da room, mas sim em torno de uma origem (0, 0), o que seria o "centro" do fixture.

Imagem

Esperamos que a imagem ajude a entender o posicionamento da origem e dos pontos. Se você observar o texto menciona também que os pontos devem ser definidos em sentido horário, caso contrário o jogo vai emitir um erro, e que você não pode criar fixtures côncavas. Isso não significa que você não pode nunca criar fixtures côncavas, você pode sim, mas não desta forma! Vamos ver como podemos fazer isso (Seria uma gambiarra? Veremos...).

DEFININDO MÚLTIPLOS FIXTURES

Uma vez que usamos apenas um fixture, também definimos uma combinação de propriedades e um shape, eles podem ser combinados (Ou seja, existir mais de um para o mesmo objeto). Você pode anexar vários fixtures a uma única instância e essa instância usará esse grupo de fixtures como máscara de colisão, juntamente com as propriedades definidas para todos os fixtures. Para ver como isso funciona, vamos adicionar um fixture em forma de estrela para o nosso exemplo. Você pode usar sprite abaixo, ou criar o sua própria.

Imagem

Para criar essa forma podemos simplesmente usar dois triângulos, sendo um deles "invertido", faça uma cópia do nosso objeto "obj_Triangle" e chame de "obj_Star" e coloque o novo Sprite de estrela. Agora, abra o evento Create, copie e cole toda a parte do código de poligonos do "obj_Triangle" duas vezes, de modo que você terá dois conjuntos de código idênticos. Altere os pontos do polígono no primeiro bloco de código para:

physics_fixture_add_point (fixture, 0, -20);
physics_fixture_add_point (fixture, sprite_width / 2, 12);
physics_fixture_add_point (fixture, - (sprite_width / 2), 12);


E, em seguida, altere os pontos do segundo bloco para:

physics_fixture_add_point (fixture, - (sprite_width / 2), -12);
physics_fixture_add_point (fixture, sprite_width / 2, 12);
physics_fixture_add_point (fixture, 0, 20);


Agora você vai até o Evento Step no objeto "obj_Control" e configure para gerar o objeto estrela (Acrescente-o como argumento ali no choose), quando testar você verá que agora temos formas côncavas. Este é apenas um exemplo simples, mas com um pouco de planejamento e um pouco de matemática, você pode adicionar vários fixtures a uma única instância para alcançar muitos efeitos diferentes. 

MOVIMENTO

A última coisa que vamos abordar neste tutorial, é como mover as instâncias no nosso mundo. Em vez de velocidade e direção usamos impulsos e  forças.

IMPULSOS E FORÇAS

Um impulso é quando você aplica uma força física para uma instância ou instâncias e esta força define uma nova velocidade e direção, independentemente da velocidade atual e a direção da instância. Então, se uma instância está se movendo para a direita e você dar-lhe um impulso para cima, a instância de repente se mover em linha reta para cima. No GM:S, os impulsos são ideais para o movimento. 

Impulsos podem ser de dois tipos, locais e relativos. impulsos locais são posicionados em relação a uma origem (0,0) local, como ilustrado na imagem abaixo:

Imagem

Este tipo de impulso é ideal para criar foguetes, ou em mecanismos de pulo já que você pode ignorar a rotação e a posição da instância quando usá-lo.
O impulso normal é posicionado com base nas coordenadas da room, então se você tem uma instância em (400, 500), e coloca um impulso em (300, 500), seria aplicada uma "empurrada" na instância vinda da esquerda. 

Não é somente uma posição que você dá para um impulso. Você tem que dar uma segunda coisa, que é a direção do impulso e sua magnitude (Que é dada pelo comprimento da direção em relação a um ponto de origem (0,0). Chamamos isso de  vetor  e se você tiver problemas para entender isso, basta pensar em um relógio com um ponteiro que se move ao seu redor. O centro do relógio é a posição de origem (0,0), a ponta dos ponteiros é a posição final (xPos, ypos) do vector de impulso - a direção é dada por estes dois pontos -  e a magnitude é a distância destes dois pontos. 

DICA: Há um tutorial ótimo no site PontoV sobre vetores, dê uma olhada: Ponto V - Vetores

Para adicionar um impulso para o nosso pequeno exemplo, abra "obj_Control" e, no evento Step, depois de todo o código que já está lá, adicione o seguinte:

if mouse_check_button (mb_right)
{
    with(obj_DynamicParent)
    {
        var dir = point_direction (mouse_x, mouse_y, x, y);
        physics_apply_impulse (x, y, lengthdir_x (10, dir), lengthdir_y (10, dir));
    }
}



Forças são semelhantes aos impulsos na forma como eles são programados (ou seja: você tem forças regulares e locais, e eles são definidos a partir de um vetor), mas as forças são muito mais sutis do que impulsos e vão mesclar as valores dados com os que já estão sendo aplicados. Se você alterar o código acima e usar uma força em vez de um impulso, você verá que o efeito não é muito perceptível ja que a força está sendo adicionado à gravidade que é mais forte que a velocidade existente. Altere o valor do comprimento do vetor para 100 (Ao invés de 10), por exemplo, e você verá muito mais efeito. Forças são ótimas para coisas como ímãs, gravidade e propulsão.

RESUMO

Isso é tudo pessoal, e esperamos que isso tenha ajudado a compreender ainda mais a integração física no GameMaker: Studio. No entanto, este não é o fim da nossa série já que ainda há uma outra ideia sobre física básica que você precisa aprender ... Os Joints! A Física no GameMaker: Studio permite-lhe anexar fixtures em conjuntos e assim criar mecanismos complexos que reagem de forma realista. Portanto, fique atento para o próximo  tutorial de física onde vamos cobrir isso.

Você pode baixar uma GMZ completo deste tutorial clicando no botão abaixo:

Baixe o exemplo.
Começando com o Game Maker? Olhou para assinatura certa!

Imagem

Tutoriais e vídeo aulas de programação! Clique no Banner e confira!

Tags:

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes