Como lidar com posições em um mundo baseado em blocos?

7

Eu tenho um jogo simples de Tower Defense usando um mundo lado a lado. Creep e torres estão em um azulejo o tempo todo.

Como devo representar a posição de fluência no código? (Os rastejantes conhecem seu ladrilho atual e sua posição no referido ladrilho ou estão cientes de sua posição absoluta no mundo?)

Basicamente, estou procurando melhores práticas, dicas de tipo de padrão de design ou informações gerais sobre como gerenciar o posicionamento em um mundo baseado em blocos.

Obrigado.

pwny
fonte
Quantos personagens você espera ter neste jogo durante os horários de pico? Menos do que algumas centenas, milhares ou dezenas de milhares? (Eu assumo "Creeps" e "torres" são tipos de personagens de seu mundo que podem se mover por conta própria.)
Randolf Richardson
11
Definitivamente menos do que algumas centenas. Os creeps estão movendo monstros, as torres não se movem e atiram nos creeps.
pwny
(+1 porque a resposta é mais clara agora.) Para um número pequeno como esse, você pode simplesmente manter suas posições na memória com uma matriz. A vantagem de estar na RAM é a velocidade - seu código para as Torres pode pesquisar facilmente Creeps no array e visar apenas aqueles que estão ao alcance.
Randolf Richardson
Espero que as pessoas sugiram uma variedade de métodos / abordagens para que você possa fazer algumas experiências para determinar o que funciona melhor para o seu jogo. Ajudaria a elaborar um pouco mais sobre o que você quer dizer com ladrilhos ao sugerir posições específicas de ladrilhos e posições mundiais globais - é o mundo composto por "ladrilhos" que podem acomodar várias posições em um pequeno rede?
Randolf Richardson
11
Possível duplicata: Como faço para lidar com movimentos de RPG de cima para baixo? , seguindo o princípio de que, se duas perguntas puderem receber exatamente a mesma resposta (correta), elas provavelmente serão duplicadas. Especificamente, acho que minha resposta desse segmento também pode responder a essa pergunta.
22811 doppelgreener

Respostas:

6

Na minha experiência, a melhor maneira de lidar com posições em um mundo baseado em blocos é ignorar que você está em um mundo baseado em blocos. Ou seja, mantenha suas entidades armazenadas em posições mundiais, mantenha o (s) caminho (s) em que suas entidades estarão viajando armazenadas no espaço do mundo e, se possível, não permita que suas entidades ou outra lógica do jogo saibam sobre blocos em absoluto.

O problema de considerar blocos é que eles introduzem casos de canto no código do jogo; muitos lugares novos onde seu código pode se comportar de maneira sutil. Não apenas as torres (por exemplo) precisam ser capazes de dizer quão próximas elas estão das entidades em seu próprio bloco, mas também das entidades em outros blocos. E assim que você pensa em ladrilhos, começa a pensar em encontrar os vizinhos dos ladrilhos, o que também é fácil de introduzir bugs (principalmente nas bordas e cantos do campo de jogo).

Os mundos baseados em blocos são realmente convenientes para edição de nível. Mas meu conselho é usar apenas a estrutura de blocos para edição; não deixe que a maneira como o nível seja construído se espalhe na própria lógica do jogo.

Trevor Powell
fonte
Muito obrigado, bônus por se referir à edição de níveis, razão pela qual este jogo tem peças para começar.
pwny
Um problema que pode surgir da edição em um mundo baseado em ladrilhos é que, se você estiver construindo uma cidade bastante grande que abrange muitos ladrilhos, precisará alternar entre ladrilhos diferentes e acabar gastando bastante tempo para garantir as coisas se alinham entre as peças lado a lado. (Estou assumindo que uma ferramenta de edição mundo personalizado será desenvolvido pelo mesmo desenvolvedor do jogo de qualquer maneira.)
Randolf Richardson
3

Eu usaria posições mundiais para suas entidades. Isso funcionará bem, desde que o mundo não se torne realmente grande (onde as posições mundiais se tornam impraticáveis ​​devido à precisão, para que você tenha que dividir o mundo em partes).

Você pode facilmente calcular o ladrilho atual de seus x e y coordenadas. Também ter coordenadas mundiais facilita a comparação de entidades (por exemplo, a entidade X está no intervalo da torre Y? ).

O uso da outra abordagem também funciona, mas você terá que lidar com 2 conjuntos de coordenadas o tempo todo (índice (s) do bloco e posição no referido bloco).

Portanto, concluindo: ambas as abordagens funcionam, mas o uso de coordenadas mundiais parece muito mais prático (menos coordenadas para lidar, menos cálculos necessários). Para sua conveniência, suas entidades podem até ter um método getter para o índice de blocos x e y que calculará a posição atual do bloco rapidamente.

bummzack
fonte