Ads 468x60px

sábado, 14 de julho de 2012

Desventuras no mundo dos games

Fonte.

Uma das coisas mais legais do desenvolvimento de games é que você obrigatoriamente vai se deparar com assuntos variados de diversas áreas do conhecimento, desde matemática e física até engenharia de software. Mesmo com as mais avançadas engines e APIs, o desenvolvedor deve estar disposto a aprender continuamente e ter um bom faro para resolver problemas. E é um desses problemas que vamos abordar aqui.


A situação


Em um projeto de game do qual participo, propus-me a fazer um protótipo para captar as principais mecânicas e testar alguns aspectos de jogabilidade. A engine escolhida foi o RPG Maker, apesar de o projeto ser referente a um game de estratégia em tempo real, por ser uma opção de fácil acesso e com que eu tenho relativa familiaridade. Parecia uma boa escolha...

... Lembro-me, contudo, que "Parece uma boa escolha" foi uma célebre fala de um certo desarmador de bombas. Foi na ocasião de seu primeiro e último erro na carreira, diga-se de passagem.

Programando eventos


O principal modo de programar todo o fluxo do game no RPG Maker é através dos ditos eventos. Eles remetem a um paradigma de programação conhecido como programação orientada a eventos. Assim como a programação funcional, a orientação a eventos é uma forma de pensar bem diferente da tradicional, a programação estruturada.

Como o nome indica, toda a programação baseia-se na ação de eventos, agentes que respondem a algum tipo de interação. Pode ser um evento ativado pelo clique do usuário ou logo quando o mapa for exibido na tela. Parece ótimo, certo? É só estabelecer as condições de início de um evento e programar as ações. Além do mais, o editor de eventos do RPG Maker facilita bastante o trabalho:

Edição de eventos no RPG Maker VX

O problema surge quando você tenta programar sistemas complexos que começam a fugir da proposta de RPG clássico... Mas deixemos isto para um post futuro. A questão aqui é: como utilizar a programação de eventos do RPG Maker para fazer uma daquelas "barrinhas de vida"?

Uma HUD simples


O RPG Maker, ao menos a versão que utilizei (VX), infelizmente não tem suporte nativo ao que desenvolvedores costumam chamar de HUD (Heads Up Display), que nada mais é do que aquela barrinha de vida/magia/habilidade que fica no topo da tela. Acredite ou não, mas há um modo bem interessante de implementar uma ou mais HUDs usando o conceito matemático de funções.

Para começar, veja a representação de uma tela de computador de, digamos, 1024 por 768 pixels:

Sistema de coordenadas de uma tela de PC


Ué, o eixo das ordenadas está invertido? Pois é, os programas do computador geralmente utilizam esse sistema de coordenadas cuja origem (0, 0) é o topo esquerdo da tela, para facilitar a manipulação de gráficos. Cada pixel é um ponto desse plano. Podemos simular o efeito de uma HUD utilizando duas imagens: uma de barra vazia e a outra cheia.

HUD - Vida cheia


Note que, quando a vida está cheia, o topo esquerdo da barra vazia está no ponto (0, 0) e colocamos a barra cheia logo por cima, também em (0, 0). Já quando a vida está vazia, temos a barra vazia em (0, 0) e a cheia em (-largura, 0), ou seja, totalmente fora da tela:

HUD - Vida vazia


Vê como podemos simular uma HUD simplesmente deslizando uma barra por cima da outra? Então precisamos descobrir como posicionar a barra cheia em função da quantidade de vida do personagem. Opa, falamos em função?

Desenvolvimento matemático


O que queremos fazer na verdade é resolver um problema matemático bem simples. Precisa-se determinar uma função linear f(v), que transforma um valor de vida v em uma posição horizontal f(v), sabendo que

f(max) = 0
f(min) = -largura

Onde max é o valor máximo de vida, min o valor mínimo de vida e largura é a largura, em pixels, das barras (naturalmente, a largura de ambas deve ser a mesma). Vamos supor que a vida vá de 0 até 100. Então:

f(100) = 0
f(0) = -largura

Como sabemos — ou, pelo menos, é o que desejamos obter — que se trata de uma função linear, concluímos que f(v) tem a forma genérica

f(v) = av + b

Daí:

f(100) = 100a + b = 0
f(0) = a * 0 + b = -largura

Resolvendo o sistema, encontramos b = -largura e a = largura/100. Portanto, a função desejada é:

$$ f(x) = \frac{v \times largura}{100} - largura $$

Ou, de forma mais genérica, assumindo que o valor mínimo de vida é zero:

$$ f(x) = \frac{v \times largura}{v_{max}} - largura $$

Agora é só botar a mão na massa.

Considerações finais


Este não é bem um tutorial de RPG Maker, não sendo minha intenção colocar passo a passo as instruções necessárias para implementar uma HUD. Mas se você tiver dominado o raciocínio por trás da coisa, o resto fica fácil. A partir disso há várias possibilidades, como barras verticais, várias barras para vários personagens, barras que representam atributos distintos etc.

Só queria mesmo trazer uma aplicação bem interessante de conceitos matemáticos na prática, além de enfim "quebrar o gelo" após um longo período de afastamento do blog. É provável que meu ritmo diminua em relação aos meses anteriores, mas sem comprometer a busca pela qualidade.

2 comentários:

Ranger Azul disse...

Otimo texto!

Gabriel disse...

Valeu!

Postar um comentário