Orbital Ape

Um blog sobre um grupo de desenvolvimento de jogos indie em constante e vagaroso crescimento.

Tag: teoria

Os pensamentos de Amit sobre Grades [Parte 6: Transformação das Coordenadas]

Em ambos os sistemas gráficos 2D e 3D, nós temos que transformar as coordenadas do “mundo” em coordenadas da “tela” e vice versa. Com grades, nós também temos que transformar as coordenadas da “grade” em coordenadas do “mundo” e vice e versa. Transformações ocorrem em pontos. De grades para coordenadas do mundo, nós transformamos vértices e ocasionalmente os centros das faces. Do mundo para as coordenadas da grade, nós podemos ou escolher encontrar o ponto anexado da face, a borda mais próxima à um ponto, ou o vértice mais próximo à um ponto.

Quadrados

Quadrados são fáceis de se trabalhar. Se um dos lados do quadrado possui comprimento “s” e as bordas deste quadrado são alinhadas com os eixos “x” e “y”, você pode simplesmente multiplicar as coordenadas do vértice da sua grade por “s” para obter a coordenada do mundo.

Agora fazendo o contrário, nós queremos determinar qual vértice é mais próxima de um ponto no espaço do mundo. Simplesmente divida as coordenadas do mundo por “s” e arredonde para cima a float para uma interger para obter o vértice mais próximo. Se ao invés você quer determinar que face se anexa a um ponto no espaço do mundo, arredonde para baixo ao invés de para cima.

Hexágonos

Figura 1: Medidas do Hexágono

Hexágonos são só um pouco mais complicados de se trabalhar do que quadrados. Computar o centro da face é simples. Na Figura 1, há um vetor “i” e um vetor “j” indo das coordenadas hexagonais às coordenadas do mundo é uma multiplicação de matriz(bem simples):

⎛ x ⎞     ⎡ ix jx ⎤ ⎛ u ⎞
⎝ y ⎠  =  ⎣ iy jy ⎦ ⎝ v ⎠

Expandido ficaria:

x = ix * u + jx * v
y = iy * u + jy * v

O diagrama mostra que “i” é (hexagon_narrow_width, 0.5*hexagon_height) e “j” é (0, hexagon_height), então isto nos da valores para “ix”, “iY”, “jx”, “jy”. O código resultante é:

# Centro da Face
x = hexagon_narrow_width * u
y = hexagon_height * (u*0.5 + v)

Computar vértices também é algo um tanto simples. No resto dos artigos eu rotulei as vértices do hexágono de “L” ou “R”. Esses dois vértices ocorrem da metade da largura do hexágono para a esquerda ou direita do centro da face do hexágono(veja a Figura 1), então tudo o que nós temos que fazer é somar ou subtrair hexagon_wide_width * 0.5:

# Se x,y são o centro da face, nós podemos ajustar para encontrar um vértice
case side
  when :L
    x -= hexagon_wide_width * 0.5
  when :R
    x += hexagon_wide_width * 0.5
end

Quando estiver trabalhando com hexágonos, trate o centro das faces como primário e os vértices como secundário.

Ir de coordenadas hexagonais (u, v) para coordenadas do mundo (x, y) foi uma multiplicação de matriz. Para ir de coordenadas do mundo de volta para hexágonos, você pode resolver a equação para (u, v). Eu vou pular a álgebra; aqui está o resultado:

u = x / hexagon_narrow_width
v = y / hexagon_height - u * 0.5

Isto funciona se você começar com (x, y) no centro de uma face. Se você tiver arbitrariamente (x, y) é um pouco mais trabalhoso. A maneira mais simples(porém não mais eficiente) é de considerar o calculado (u, v) mais todos os vizinhos e determinar qual é o mais próximo da dada coordenada do mundo. Esta abordagem funciona com qualquer um dos três tipos de grades. Se você estiver utilizando esta forma para seleção por mouse, está é bastante rápida. Pode ser melhorada mais ainda ao se ter mais atenção com os polígonos.

Triângulos

Triângulos são quadrados distorcidos e divididos. Converter as vértices de um triângulo das coordenadas da grade para coordenadas do mundo simplesmente envolve multiplicá-las pelos vetores do eixo, assim como as coordenadas da face do hexágono:

⎛ x ⎞     ⎡ ix jx ⎤ ⎛ u ⎞
⎝ y ⎠  =  ⎣ iy jy ⎦ ⎝ v ⎠

Converter as coordenadas da face triangular para coordenadas do mundo é fácil, envolve um ajuste. O “L” do centro da face triangular é (0.25*i, 0.25*j) do vértice inferior esquerdo. O “R” do centro da face triangular é (0.75*i, 0.75*j) do vértice inferior esquerdo.

Para converter de coordenadas do mundo para vértices do triângulo é fácil. Esclareça para (u, v) usando álgebra. Para determinar qual face o ponto do mundo está, considere a borda que está dividindo os dois triângulos dentro do quadrado retorcido; esta borda é rotulada “E”. Se o seu ponto é à esquerda desta linha, o ponto está na face “L”; se estiver na direita, o ponto está na face “R”. Acredito que seja “R” quando frac(u) + frac(v) >= 0.5.

Quando trabalhar com triângulos, trate as vértices como primárias, e o centro das faces como secundário. Este é o oposto de como tratamos os hexágonos.

Teoria em economia básica para jogos digitais

A economia é algo que está em alta nos jogos atualmente, e é um item obrigatório na maioria dos subgêneros de MMOGs*, mas como saber quando a economia é realmente boa, viável e estável dentro de um mundo virtual?

MMOGs geralmente possuem economias com seus produtos de compra e venda baseados na coleta de recursos, dropping* de itens, dropping de moeda, recursos e itens e moeda como recompensas por missões e no artesanato. Mas até que ponto a economia é viável?

A viabilidade da economia em jogos digitais pode ser posto a prova com algumas perguntas.

  1. Como a moeda é gerada no mundo virtual?
  2. Há inflação* e deflação*? Por quê?
  3. Os mercados são criados por NPC*s ou jogadores?
  4. As missões dão como recompensa moedas, recursos e itens?
  5. As missões são criadas por NPCs ou jogadores?
  6. Há algum tipo de taxação?

Se você parar para analisar a economia de algum jogo online como World of Warcraft, prestará atenção que nos primórdios da fase Alpha do jogo, quando o jogador original, ou o Player 1 logou, não existia se quer uma moeda no jogo, imagine que se houvesse uma variável responsável por controlar o valor total de moedas em jogo esse valor seria 0(zero). Assim assumimos que a primeira moeda ou foi gerada através de dropping ou foi recompensa por uma missão completa. Isso faz com que haja um fluxo constante de moedas em crescimento proporcional a entrada de novos jogadores no jogo e esse fluxo constante pode abalar a economia, uma vez que o número de jogadores comportados pelo jogo é finito, sendo pelos servidores ou, em termos mais extremos vamos pegar o valor de sete bilhões de jogadores, as moedas continuariam a ser geradas pelo dropping, enquanto o número de jogadores estaria fixo. Isto desencadearia uma inflação gradual, e logo todos os jogadores teriam tantas moedas que o mercado simplesmente perderia seu sentido.

Agora peguemos uma piscina e deixemos ela largada ao sol por algumas semanas chuvosas. A chuva entra e entra até que a piscina fica cheia, mas com o tempo a água fica suja. E agora, como tirar toda essa água dai? Simples, puxamos a rolha e deixamos a água sair.

Se pegarmos novamente World of Warcraft, vamos notar que uma das únicas formas de “vazar” moedas do jogo é na compra e no uso de itens consumáveis, ou na compra de itens de NPCs, ou simplesmente no ato de jogar moedas fora, mas mesmo assim, ainda há mais moedas entrando do que saindo do jogo e o fim é o mesmo, inflação.

Desta forma os itens comprados têm seus valores aumentados para manter o lucro em um mundo onde as pessoas cada vez tem mais e mais dinheiro, e quando isso não ocorre, o trabalho dos artesãos acaba sendo desvalorizado e no final se torna desusado, a não ser que este artesanato dê como frutos itens consumáveis como poções de vida, poções de energia, pergaminhos e outros itens que são destruídos após o seu uso. Aqui vemos outro problema, a constante entrada itens duráveis derivados do artesanato e do dropping no mercado. Imagine o item mais raro do jogo, agora imagine este item sendo dropado inúmeras vezes e sendo inserido no mercado, de inicio este item estaria à valores inconcebíveis, mas a partir do momento que mais itens idênticos fossem inseridos no mercado, aumentando a competição, seu valor iria caindo aos poucos, vagarosamente, até que em certo momento, vários e vários itens exatamente iguais e “raros” existiriam no mercado, desvalorizando-os por completo. Isto pode ser facilmente corrigido aplicando-se limitações às quantidades de itens iguais existentes no jogo, e criando uma espécie de durabilidade de uso para estes itens, de forma que os tornasse inúteis com durabilidade zero, mas que não fossem destruídos como entidades, e que pudessem ser consertados com algum esforço e gasto. Isso daria mais um caminho a economia ao mesmo tempo que resolveria um problema.

Vamos agora pegar o artesanato… a grande maioria dos itens consumíveis, quando não são dropados, são obra de artesãos que injetam seus trabalhos no mercado de forma a obter lucro com suas vendas. Estes itens, por sua vez, são a mais útil forma de fazer girar a economia, já que os itens consumíveis são os mais adquiridos por jogadores, pois servem de manutenção para seus personagens em suas aventuras e em combate. Mas nem tudo são flores, devemos lembrar que os artesãos também são um dos maiores responsáveis pela inflação nos jogos, pois eles são a base de todo o mercado. Seus itens duráveis, enchem as prateleiras rapidamente e de forma desordenada, não respeitando as regras de oferta e demanda, isso acontece porque os recursos utilizados no artesanato destes itens estão ai, disponíveis e em fácil acesso aos artesãos, e o pior de tudo, estes recursos são, quando não deveriam ser, infinitamente renováveis, este é mais um, e o pior dos motivos da inflação nos jogos.

Agora vamos ao que interessa, como combater esta inflação.

Há duas formas de combater a inflação de uma economia virtual, a primeira é limitar as moedas à obtenção de um recurso de difícil acesso, abundante, porém finito, dessa forma uma quantidade finita e lenta de moedas seria bombeada à economia virtual, provinda do mais baixo nível da economia, os coletores de recursos, e abrindo espaço para a adoção de moedas secundárias pelos próprios jogadores e até mesmo a prática do escambo*. A outra forma seria criar taxas, muito bem calculadas, que seriam aplicadas a diversos segmentos da economia fazendo “vazar” moedas da economia e mantendo-a estável.

Pode-se observar que economias simuladas tendem a fracassar, por isso, a melhor forma de se desenvolver esta ideia é deixando-a acontecer, deixar a economia nascer, deixando os próprios jogadores a criarem, uma economia real, e não uma simulação. Algo possível em Minecraft, mas isso fica para o próximo artigo.

*

MMOG – Massively multiplayer online game ou jogo online de multijogador massivo.

NPC – Non-player character ou personagem não jogáveis.

Inflação – O evento da desvalorização da moeda.

Deflação – O evento da supervalorização da moeda.