Estou trabalhando em um editor de mapas lado a lado e preciso escolher os blocos automaticamente, com base nos blocos adjacentes. Por exemplo, ao colocar um ladrilho de estrada, próximo a outro ladrilho de estrada, os dois precisam ser orientados para formar uma estrada contínua. Se houver outras estradas ao seu redor, talvez seja necessário usar ladrilhos de esquina ou interseção.
Alguém pode recomendar alguns algoritmos para fazer isso? O jogo usa um mapa de azulejos quadrados de 8 direções.
Respostas:
Talvez seja assim que normalmente é feito. Você tem sua lista de ladrilhos diferentes que representam um ladrilho de estrada em todas as orientações possíveis. Da esquerda para a direita, todos os quatro cantos, de cima para baixo, qualquer que seja. Agora você indexará todos esses blocos com um byte cada. 8 bits, um para cada direção. Isso pode estar em um hashmap ou pelo nome do arquivo ... no entanto, você deseja fazer isso.
Então você tem isso:
O código de bytes do bloco acima é 00000000 . Então seu bloco que vai da esquerda para a direita (ou da direita para a esquerda) fica assim:
O código de bytes para esse bloco é 10001000 ou 136. Como outro exemplo, vamos ver uma interseção de três maneiras:
O código de bytes desse bloco é 10101000 .
Você provavelmente vê para onde estou indo. Você define as posições dos bits no byte que representa as conexões. Isso é muito melhor do que tentar fazer uma grande cadeia if / else que eu já vi antes. Quando estiver procurando colocar um bloco, examine os blocos ao redor e crie um byte ao longo do caminho. Defina 1 para blocos que possuem estradas (ou o que você deseja conectar) e 0 para blocos que não têm. Quando terminar, você terá o código de bytes do bloco exato de que precisa.
Observe que, ao criar os ativos, você pode reutilizá-los bastando girar e atribuir o código de bytes correto a ele.
EDIT : Imagens atualizadas para serem menos ruins. Sim, esses são melhores do que antes.
fonte
Eu recomendo que você dê uma olhada nesta página útil para obter mais informações, pois ela detalha praticamente todos os aspectos do que você está fazendo, bem como algumas otimizações em potencial: http://www.angryfishstudios.com / 2011/04 / aventuras-em-bitmasking /
O tldr é que você consulta cada célula adjacente e armazena a combinação em um campo de bits / byte, depois passa por um mapa que converte um número de 0 a 255 em um valor de 0 a 47, o que corresponde a uma imagem exclusiva.
fonte