Criando pontos de acesso não retangulares e detectando cliques

7

Diga para um jogo com pontos de acesso irregulares (por exemplo, Risk, ou um jogo de estratégia como Hearts of Iron do Paradox ou Kings Crusader), como você

  1. Definir um ponto de acesso não retangular de forma irregular (como um território em um mapa?), No código?

  2. Qual ferramenta você pode usar para rastrear o ponto de acesso e importar para o seu jogo?

  3. Qual é o algoritmo para detectar se alguém clicou dentro desse ponto de acesso?

Extrakun
fonte

Respostas:

9

Além da abordagem de vetor / polígono, outra maneira de fazer isso é usar um bitmap.

Se cada "cor" no bitmap representa um território (França, Bélgica etc.), basta descobrir qual pixel no bitmap foi clicado, procurando a cor e determinando se essa cor representa o território de interesse. Você pode até representar territórios sobrepostos com cores específicas ou tratar suas cores como uma máscara de bit de territórios.

Em termos de ferramentas, peça aos seus artistas / produtores de conteúdo que criem o bitmap em qualquer ferramenta de edição de pixels. Por exemplo, se você usa o Photoshop ou o Gimp, pode representar diferentes territórios (França, Bélgica etc.) como camadas nomeadas ou como 1 camada, mas distingue os territórios com base nas cores. Você escreveria uma ferramenta para converter a imagem / camadas em um formato adequado para fins internos do jogo.

O formato interno do jogo provavelmente seria compactado por linha de execução (veja: http://en.wikipedia.org/wiki/Run-length_encoding ). Dessa forma, você deve conseguir taxas de compactação muito boas, pois os pixels adjacentes nas linhas muitas vezes pertencem ao mesmo território. O algoritmo então se torna, para a coordenada y atual do mouse, percorrer essa linha e descobrir a que execução pertence e, portanto, a qual território correspondente.

jpaver
fonte
Estava prestes a escrever algo semelhante, isso é muito mais fácil do que brincar com polígonos.
Aaaaaaaaaaaa
Sim, você também obtém precisão perfeita em pixels. Mexer com polígonos é apenas uma bagunça.
Michael Coleman
2
+1 (porque é uma solução fácil e rápida), embora utilize mais dados e possa não ser tão independente de resolução quanto a abordagem de polígono.
bummzack
aqui está uma explicação exata da técnica: xnaresources.com/default.asp?page=Tutorial:ColorKeyMap
HuseyinUslu
Você pode usar um programa vetorial como o inkscape para criar a máscara. Isso lhe dá a vantagem de poder criar / editar o mapa de / com polígonos e camadas, além de facilitar a exportação para, por exemplo, * .bmp
Exilyth
7

Você precisará definir os pontos ativos como uma série de polígonos que cobrem sua imagem. Em seguida, quando um usuário clicar no mapa, consulte a lista de polígonos (pontos de acesso clicáveis) e veja em qual (se houver) o ponto de clique está dentro.

Além disso, você pode ver como são feitos os mapas de imagem em HTML. Não que você esteja trabalhando com HTML, mas basicamente eles são essencialmente o que você deseja implementar. Eles permitem definir pontos de acesso como retângulos, círculos e polígonos (que é o que você deseja).

Aqui está uma página da Web que descreve os mapas de imagens HTML que podem lhe dar algumas idéias: http://www.javascriptkit.com/howto/imagemap.shtml

Aqui está um artigo da Wikipedia sobre algoritmos para saber se um ponto está em um polígono: http://en.wikipedia.org/wiki/Point_in_polygon

Tim Holt
fonte
1

Para esse tipo de coisa, usamos uma imagem usada como máscara, com pixels transparentes / opacos ou pretos / brancos. As máscaras não são desenhadas, mas conceitualmente "colocadas" sobre a região do mapa que cobrem.

Quando você clica, primeiro marque a caixa delimitadora da imagem. Se estiver do lado de fora, o player não clicou na região. Se estiver dentro, verifique o pixel. Se for transparente / preto, o player não clicou na região. Caso contrário, ele fez.

Se o uso da memória for uma preocupação séria, você poderá usar imagens de tamanho médio e aplicar a tela apropriada à conversão de coordenadas da imagem. Você não terá uma detecção perfeita de pixels, mas provavelmente não precisará dela neste caso.

Além disso, se você ficar transparente / opaco, salve as máscaras como PNG (ou qualquer outro esquema de compactação sem perdas) ou use um limite alto (alfa> 128 em vez de alfa> 0). Caso contrário, os artefatos JPEG podem fazer com que alguns dos pixels transparentes pareçam não tão transparentes (digamos alpha = 1 ou 2 em vez de alpha = 0)

ggambett
fonte
-1, esta é apenas uma versão consideravelmente mais inútil do método jpaver.
11
Depende dos detalhes. Normalmente, reutilizamos as imagens dos botões como máscaras, para que esse método acabe usando menos memória que o método jpaver.
precisa