23 de outubro de 2016

Área Técnica: Hitboxes e projéteis


Alô calangos, hoje é dia de falar de algo mais profundo.

Vamos ver as coisas por dentro e entender fatores diferentes que afetam a jogabilidade de seus games favoritos. Vale lembrar que este é um texto para leigos.


Hitboxes e bounding boxes

Hitboxes são literalmente "caixas" que existem virtualmente nos objetos dos jogos para determinar o limite do corpo virtual. Elas servem principalmente para aplicar efeitos de colisão. Em games 3D elas respeitam bem mais a forma do corpo do objeto (e nem sempre elas são caixas, elas podem ter formas diversas).

As hitboxes podem existir pra várias coisas, algumas servem pra aplicar um dano, outras pra receber dano, outras pra isso tudo junto.

Existe um tipo de hitbox específica para movimentação e interações mais globais do modelo, estas são chamadas de bounding box. Enquanto a hitbox processa impactos nocivos a bounding box fica cuidando do impacto com o chão e objetos estáticos.

Bounding box e hit boxes da famigerada galinha do CS:GO


Conhecer um pouco de como estas "caixas invisíveis" funcionam pode te ajudar a ter um pouco mais de sucesso nos games.

É evidente que isto é uma abordagem bem resumida, pois o cálculo de colisão entre outras coisas dentro deste âmbito variam do criador, da engine e da técnica usada. Em jogos 2D as coisas são bem simples, mas quando entramos no universo 3D a coisa toma uma forma bizarra e assustadora. Alguns desenvolvedores usarão outros nomes e em certos tipos de jogo haverão muitas lógicas adicionais a esta simples abordagem.

Se quiser ler e ver mais sobre isto, olhe este links:
Street Fighter V Hitboxes
Vídeo: What Makes a Move Overpowered
Minimun bounding box (Wikipedia)
Using Hitboxes in League of Legends


Física de projéteis

Projéteis num geral envolvem cálculos bem bizarros. Nem todos os jogos trabalham com grande realismo, mas alguns e principalmente shooters mais atuais aplicam físicas avançadas considerando força, velocidade, gravidade, etc.

Um exemplo são estas informações do site Symthic, que mostram números mais profundos do funcionamento das armas de jogos como o Battlefield 4:


Aqui podemos apontar muitas coisas da física normal que se aplicam ao jogo e que muitos jogadores nem se ligam:

- Resistência do ar reduzindo potência do tiro (Damage drop);
- Velocidade de saída do projétil (Muzzle velocity);
- Gravidade sobre o projétil (Bullet drop).

Em termos de realismo mais pesado podemos ir pro Arma 3, que é um simulador mais precisamente.

Neste meu vídeo abaixo eu tento atingir diversos alvos de distâncias variadas; ocorre uma coisa chamada "ajuste de ponto zero" a qual a arma é ajustada para acertar precisamente um alvo à uma distância x. É notório neste modo de treino o trajeto e principalmente a curva se formando para acertar o alvo distante (pois é impossível acertar um alvo depois de certa distância numa trajetória retilínea):



Além da resistência do ar também existe a resistência de objetos, como paredes, caixas, etc. Geralmente, com poucas exceções, projéteis perdem potência após atravessar alvos.

Esta parte complexa da física de projéteis pode te destacar do grupo de jogadores mais casuais ou menos informados, pois com o conhecimento e prática a sua precisão geral aumenta e consequentemente o seu poder de combate.

Se quiser ler mais sobre veja logo abaixo:
External Ballistics (Wikipedia)
Symthic
Vídeo: Arma 3 Terminal Ballistics

---

Agora que você conhece um pouco de balística e hitboxes/bounding boxes, pode começar a experimentar testar algumas coisas:

- Em League of Legends, será que a hitbox do Cho'Gath é maior que a da Syndra?
- Será que um SCAR-H em Battlefield 4 acerta mais longe que um AEK-971?
- Quão longe vai uma granada no CS:GO?

Isto é só a ponta do iceberg, os jogos possuem mais ciência e cálculos doidos por trás do que você imagina! Espero ter despertado a curiosidade por estas pequenas grandes coisas e também espero que isto ajude de alguma forma nas suas jogatinas.

// Um salve pro Sendoh que me apresentou o Symthic.
Até a próxima pessoal! o/