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 1 (Oficial)

Qui Mai 26, 2016 2:22 am

USANDO FÍSICA NO GAMEMAKER: STUDIO - PARTE 1
Autor original: Mark Alexander

O artigo desta semana é na forma de um mini-tutorial, onde vamos fazer uma pequena simulação de física e, ao mesmo tempo discutir algumas das questões onde muitos encontram dificuldade, como as diferenças de abordagem no GM:S tradicional de colisões e movimento para a nova abordagem usando o sistema de física Box2D.

Mesmo os usuários mais avançados podem ser confundidos quando utilizam a física do GameMaker: Studio pela primeira vez, por isso vamos começar este tutorial com provavelmente a peça mais importante do conselho que posso dar ... Esqueça tudo o que sabe sobre como GameMaker: Studio lida com colisões e movimentos! Quando você habilita a física em uma room, você está mudando a forma como tudo irá interagir dentro do GM:S, e isso faz com que as variáveis de movimento padrão (vspeed, hspeed, speed e etc) não sejam mais levadas em conta. No entanto, uma lista de variáveis físicas específicas vão poder ser utilizadas no seu lugar (Começam com o prefixo phy_).

A outra grande mudança que acontece quando você habilita a física é que as colisões serão tratadas automaticamente para você. Com o GameMaker "tradicional" você teria um evento de colisão e depois ter algum código ou ação lá para lidar com ele. Mas com a física habilitada, a colisão será tratada automaticamente - incluindo ângulos de reflexão (Rebater na parede por exemplo), velocidades e etc ...

Agora, com o aviso dado, vamos seguir em frente e tratar de fazer uma simulação de física simples ...

HABILITANDO FÍSICA NA ROOM (PHYSICS WORLD)

Para habilitar física, você deve primeiro configurar a room pra isso . Basta abrir sua room e clicar na aba physics:
Imagem
Obviamente precisamos assinalar "Room is Physics World " (caso contrário quaisquer objetos com física habilitada colocados na room irão causar erros) e, então, definir a gravidade e a escala para a room. A gravidade é calculada como um  vector, com a distância e a direção do vector dando a força da gravidade em metros por segundo e a direção da força da gravidade.

A opção de escala "Pixels to Meters" não é tão óbvia. Na simulação de física, todas as reações são baseadas na física da "vida real", e assim a escala da interação é importante. Um cubo de 1 metro de chumbo não irá reagir da mesma forma como um cubo 1 centímetro de chumbo, e por isso precisamos deixar a simulação de física saber com que escala estamos trabalhando. Então, aqui você pode definir quantos metros um pixel no jogo representa (Na imagem 1 Pixel representa 0.1 metros, ou seja, 10 centímetros).

Você pode deixar os valores que estão ali mesmo e fechar a room por enquanto. Você também deve fazer rapidamente algumas sprites para serem usadas no nosso exemplo. Você vai precisar de dois sprites de blocos (uma para o chão (não irá se movimentar) e um para ser um bloco normal), uma sprite de círculo e uma sprite de triângulo. Eles podem ser de qualquer tamanho que você quiser, mas por uma questão de coerência, deixe nas dimensões 32x32px, como os que foram usados para fazer a engine deste tutorial (disponível no final deste artigo).
Imagem
HABILITANDO OBJETOS PARA USAR A FÍSICA (PHYSICS OBJECTS)

Precisamos definir nossos objetos agora, começando com um par de objetos parent (Que possuem filhos). Estes não terão propriedades físicas, e só serão usados para "agrupar" colisões. Agora, como indicado no início deste artigo, objetos com física habilitada vão reagir a colisões automaticamente, mas ainda temos que dizer a simulação de física quais objetos queremos que colidam. Então, para isso, precisamos dar-lhes um evento de colisão, embora não coloquemos códigos no evento para isso, basta um simples comentário para contar a física que esses casos devem interagir (Atenção: Coloque mesmo o comentário, senão não irá funcionar). 

Faça dois objetos e nomeie um como "obj_StaticParent" e "obj_DynamicParent". Em seguida, adicione um evento de colisão dele com ele mesmo, e dele com o outro objeto (Exatamente como na imagem abaixo).
Imagem

Você vai ver que nós também Colocamos também um evento "Outside Room" para o "obj_DynamicParent" e colocamos a ação para destruir o objeto, ou seja, os objetos dinâmicos que saírem da room serão destruídos.

Por que temos dois parents? Bem, na simulação de física você tem três tipos de objeto: static, dynamic e cinematic. Cada um tem propriedades ligeiramente diferentes e também irá se comportar de uma maneira diferente:

  • Estático (static) - Um corpo estático é um que não reaja com qualquer força externa, o que significa que não é afetado pela gravidade ou colisões e vai permanecer imóvel na posição em que é colocado dentro da room, a menos que explicitamente movido através do código. Pense dos blocos que você colocaria em um jogo de plataforma, por exemplo. Em um mundo físico que seria classificado como estático.
  • Dinâmico (dynamic) - Um corpo dinâmico é aquele que participa na simulação de física completa e vai reagir a quaisquer forças aplicadas, como a gravidade ou quando em uma colisão. Qualquer coisa que se move e reage a outras instâncias em um jogo que normalmente seria dinâmico.
  • Cinemático (cinematic) - Um corpo cinemático é uma espécie de mistura entre o estático e dinâmico. É uma instância que foi sinalizado como estático, mas, em seguida, colocada em movimento por meio de código, definindo sua velocidade diretamente (não através de forças). Se você pensar em um jogo de plataforma de novo, teríamos as plataformas móveis (Verticais, horizontais e afins) como objetos cinemáticos, pois elas não reagem ao contato do player, por exemplo mas continuam se movendo.

Para esta simulação de física básica teremos quatro objetos com física habilitada: um que é estático para o "chão", e os outros três dinâmicos, então vá em frente e crie esses quatro objetos agora e dê a cada um deles uma Sprite adequada (Que pedi para você criar anteriormente).
Imagem
Você precisa colocar o "obj_StaticParent" como parent do "obj_base" para termos o nosso chão, e os outros três objetos devem ter como pai o "obj_DynamicParent" para garantir que as colisões sejam resolvidas corretamente. Podemos agora seguir em frente e definir as fixtures para os objetos.

FIXTURES (PROPRIEDADE FÍSICAS)

Ok, temos a nossa room com física habilitada assim como nossos objetos, mas ainda não demos realmente quaisquer propriedades físicas aos nossos objetos ainda. Nós precisamos dizer ao GameMaker as propriedades que o corpo físico do objeto terá, o que irá determinar como ele interage com outros objetos de física no jogo. Isto é feito através da definição de um fixture.

Você define um desafio em duas partes, sendo a primeira definir o shape (Forma) do objeto e a segunda definir suas propriedades. Nós podemos fazer isso diretamente no próprio objeto (Ver Physics Properties na imagem abaixo) ou a partir de código, mas de qualquer forma o que acontece é que você define o fixture e, em seguida, pode definir um shape que será usado na room com física (Botão: Modify Collision Shape). Isto pode parecer confuso, por isso vamos continuar e adicionar um fixture a um objeto e explicar ao longo do tutorial.

Abra o objeto "obj_Base" e clique no checkbox "Uses Physics". Isso vai expandir a janela de propriedades do objeto com um número de opções extras, mostrados abaixo:
Imagem
A primeira coisa a definir é o "shape de colisão". Este é o lugar onde nós definimos a forma do fixture que está sendo ligado ao objeto. Isto é como a máscara de colisão que usamos no GM em modo normal, mas com a física habilitada máscaras não podem ser usadas, e em vez disso colisões são calculadas usando um shape de colisão que nós definimos. Neste caso, queremos um "shape em forma de caixa" (Marque a opção BOX), como a sua sprite.

Você terá que clicar no botão "Modify Collision Shape", para garantir que o fixture é do tamanho correto da sprite, então clique que para abrir o Editor de shapes. Este editor funciona da mesma forma o Editor de Paths e permite-lhe mover os pontos da borda do fixture para se ajustar ao sprite a ser utilizado (ou qualquer outra forma que você necessite... lembre-se que o fixture é independente da entidade gráfica!).
Imagem
Clique em "OK" quando estiver pronto, e com a forma agora definida, é hora de definir as propriedades do fixture. Como este objeto é estático, temos que dizer a simulação de física para tratá-lo como tal, e que é feito definindo o campo density (densidade) para 0. Na vida real um objeto com 0 de densidade não existe.Vou rapidamente listar o resto das propriedades aqui agora, apesar que neste objeto você pode deixá-los como seus valores padrão (exceto densidade):

  • Density (Densidade) : A densidade de algo é definida como a sua massa por unidade de volume, o que basicamente significa quanta massa que ocupa no mundo físico.
  • Restitution (Restituição) : restituição é realmente uma maneira de dizer "O quanto saltitante é (Ou até emborrachado xD)". Esta configuração afetará o quanto um objeto "ricocheteia" quando colide com outros objetos, ele é co-dependente de outras forças que atuam na instância como a gravidade e atrito.
  • Collision Group (Grupo de colisão) : O grupo de colisão pode ser utilizado para forçar GameMaker para tratar colisões de maneiras específicas.
  • Linear Damping (Amortecimento linear) : O amortecimento linear é usado para reduzir a velocidade de um objeto a medida que se move ao longo do espaço (como a resistência do ar).
  • Angular Damping (Amortecimento angular) : Como acima, só que para a velocidade de rotação, isso define a taxa de desaceleração para a velocidade angular.
  • Friction (Atrito) : Friction define a perda de impulso causado pela colisão de duas instâncias com fixtures ligados a eles. Quanto menor o valor, mais fácil é para uma outra instância deslizar sobre ela.

Você pode encontrar uma explicação mais completa de cada uma dessas propriedades a partir do manual (Tecle F1 no GMS), então eu não vou entrar em detalhes sobre eles aqui, exceto quando necessário.

Feche o "obj_base" agora, e abra o objeto "obj_Block". Este é o nosso primeiro objeto dinâmico e você deve marcá-lo como usando física e ajustar o shape de caixa para encaixar ao sprite. Os valores padrão são ideais aqui também, com a densidade de 0.5. Então feche o objeto uma vez que você tenha ativado física e abra o objeto "obj_Circle".

Mais uma vez, clique no "Uses Physics", só que agora defina o shape de colisão como "Circle". Quando você editar o shapede colisão agora, você vai ver que ele não é mais um shape com 4 pontos de canto, mas sim um shape com cinco pontos, marcando o centro com um ponto, e os outros que marcam o raio. Defina-os para se adequar ao seu sprite e clique em "OK". Nas propriedades, defina a densidade como 0.1, e defina a restituição a 0.8. Fazemos isso porque queremos que ele seja mais leve do que o "obj_Block" e ricochetear em contato com outros objetos.

Para a nosso último do objeto, o triângulo, precisamos criar um shape poligonal . Este é um shape que define explicitamente diversos pontos, e de uma forma muito específica. Um shape de polígono tem um mínimo de 3 pontos e um máximo de 8 pontos e a forma não pode ser concava (Com cavidades, como um "C" por exemplo). Para fazer formas concavas usaremos um macete (e vamos cobri-lo no próximo tutorial desta série). Assim continuando, ligue que a física para este objeto, e selecione a opção "Shape" para a forma de colisão. Agora, quando você clica no botão "Modify Shape Collision", você pode adicionar e remover pontos para criar o seu shape. Com isto feito, defina as propriedades do fixture com uma alta densidade e um amortecimento linear elevado, e uma baixa restituição assim, comporta-se de maneira ligeiramente diferente dos objetos anteriores.
Imagem
TESTANDO

Estamos quase prontos para testar esses objetos e ver como eles reagem uns aos outros, mas antes nós precisamos fazer um objeto controlador e chamá-lo de "obj_Control". Coloque um evento alarme 0 e nele insira um comentário, como "Temporizador de criação" ou algo assim. Isto é simplesmente para limitar o número de instâncias de objetos que são gerados. Agora adicione um evento Step e coloque o seguinte:


if (mouse_check_button (mb_left) && (alarm [0] <0))
{
instance_create (mouse_x, mouse_y, choose(obj_Block, obj_Circle, obj_Triangle));
alarm [0] = 5;
}


Isso vai servir para criar objetos clicando com o botão esquerdo do mouse.

Coloque esse objeto na room que criou no início, juntamente com uma série de objetos estáticos "obj_Base". Agora, execute o jogo! Se tudo tiver corrido corretamente, você deve ver algo como isto:
Imagem
Parabéns! Você acabou de criar sua primeira simulação de física no GameMaker: Studio!

RESUMO

Para terminar este artigo, vamos percorrer alguns dos pontos importantes:

  1. Quando a física está habilitada, todas as colisões e os movimentos são regidos pelas variáveis especiais de física e funções,  não os padrões (hspeed, vspeed, e etc).
  2. Objetos físicos podem ser definidos por um dos três tipos: estáticos, dinâmicos ou cinemáticos.
  3. Para que a colisão seja detectada, a instância que tem física habilitada deve ter um evento de colisão, mesmo que esse evento tenha apenas um comentário.
  4. Um objeto físico é ativado quando se tem um fixture ligado a ele.
  5. Um fixture é uma combinação de um shape de colisão e as propriedades físicas de base.

Esperemos que com este artigo você pode ver que a física básica é muito fácil de configurar e começar a trabalhar. No entanto, você vai perceber que além de criar os próprios objetos, não há nenhuma outra interação no exemplo. Para isso, precisamos começar a usar as funções de física dedicados através do editor de código, e nós estaremos cobrindo isso juntamente com alguns outros temas mais complexos na próxima parte.

Você pode baixar o GMZ aqui:

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:
 
Avatar do usuário
Led
Membro
Membro
Mensagens: 52
Registrado em: Sáb Ago 22, 2015 3:27 pm
Karma: 54

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

Qui Mai 26, 2016 11:12 am

Ótima iniciativa Alex!
Só uma observação, o choose(a, b, c)  e o alarm[0] acabaram sendo traduzidos em:
if (mouse_check_button (mb_left) && (alarme [0] <0))
{
instance_create (mouse_x, mouse_y, escolha (obj_Block, obj_Circle, obj_Triangle));
alarme [0] = 5;
}

Até mais! o/
 
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:

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

Qui Mai 26, 2016 11:28 am

Sim, eu tinha percebido. Editei pouco antes de você postar. Estou terminando de traduzir a parte 2.

FLWS!
Começando com o Game Maker? Olhou para assinatura certa!

Imagem

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

Quem está online

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