Pergunta

Eu quero fazer jogos isométricos, baseados em azulejos, com cocos2d.

Sprites precisam ser desenhados no topo de outros sprites que estão "por trás". Estou procurando a melhor maneira de fazer isso.

Eu gostaria de evitar o algoritmo do pintor porque envolve classificar todos os sprites todos os quadros que são caros.

O algoritmo Z Buffer é suportado pela GPU e Cocos2D, então é isso que eu gostaria de usar, mas há um problema. Alguns sprites, como edifícios, por exemplo, ocupam vários ladrilhos. Atribuir um valor Z a tais sprites é difícil.

Estas são as opções que eu pensei:

    .
  1. Comparando dois edifícios e determinar qual é "na frente" é fácil. Tão edifícios podem ser classificados, em seguida, atribuído um valor Z com base em a ordem de classificação. Isso não seria diferente do pintor algoritmo. O tampão OpenGL ES Z não seria necessário.
  2. Atribuir um valor z a cada edifício baseado puramente em sua localização em o mapa (sem conhecimento de onde outros edifícios são). Eu estou Encontrando isso difícil. Eu acho que é possível, mas eu não fui capaz de chegar a uma fórmula ainda.
  3. use vários sprites para imagens que ocupam mais de uma telha, então Todos os sprites serão exatamente do mesmo tamanho. Z pedidos podem ser então facilmente atribuído com base em que azulejo o sprite está ocupando. O problema com esta solução é que faz a lógica do jogo muito mais complicado. Todas as operações em um único prédio terão que ser repetido para cada sprite o prédio é inventado. Eu gostaria de tratar cada objeto como uma única entidade.
  4. Modifique o código Cocos2D para permitir que os sprites tenham vários valores z em diferentes pontos. Se um sprite pode ter vários valores z baseados em Que azulejo uma parte específica do sprite cai, depois calculando Um valor Z para essa seção é fácil. Eu não precisarei comparar o Sprite para quaisquer outros sprites. Eu acredito que isso é possível usando múltiplos quads para cada sprite. O problema com isso é que é Um pouco complicado para mim desde que sou novo para OpenGL ES e Cocos2d. eu Não entenda completamente como todas as estruturas internas de dados trabalhar. Embora pareça a solução mais elegante se uma fórmula não pode ser encontrado.

    Eu vou votar qualquer sugestão ou referências a recursos úteis.

Foi útil?

Solução

Para o número 2, você pode calcular a distância de Manhattan do centro do objeto e use esse valor como o valor z desse objeto.Ele funcionará contanto que você evite objetos muito longos em seu mapa como objeto 5x1 ou pior.Mas se você realmente precisar de um objeto longo para ser colocado em um mapa de azulejos, gerenciando a ordem z de objetos no mapa definindo um valor Z usando uma fórmula é impossível.

Para provar isso:
1.) Coloque dois objetos 2x2 em um mapa horizontalmente e deixe uma telha de unidade entre eles.


2.) Coloque um objeto 3x1 entre eles.Vamos nomear os objetos 2x2 para A e B e o objeto 3x1 para C.
3.) Se você apenas girar c (não alterar sua posição), Z-Order de A e B Interchange.

-Se B está agora na frente, alguns objetos por trás de B estarão na frente de um por causa de apenas a rotação de C. e é caro saber quais objetos nas costas e B anteriormente se tornarão na frente de umapós a rotação de C.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top