Qual seria a melhor maneira de encontrar um espaço aberto em um nível?

7

Estou trabalhando em um jogo 2D em que você usa tinta para adicionar ladrilhos a um nível e agora estou trabalhando para adicionar ladrilhos de urdidura. Eu o configurei para que certas tintas orientadas à direção usem dois pontos (um começo e um fim) para determinar em qual direção as peças apontarão (esquerda, direita, cima, baixo). As peças de urdidura possuem esses pontos, mas serão adicionado a duas outras listas (início e fim da distorção). A maneira como os warps funcionam é: se o jogador acertar um bloco, eles serão teleportados para o bloco correspondente. Agora, se eu quiser que isso funcione corretamente, preciso fazê-lo para que o jogador não possa ser teleportado para uma parede ou fora do mapa. Então, preciso mover o ponto para um ladrilho aberto, exatamente a um espaço de qualquer parede.

Qual seria a melhor forma de fazer isso?

IronGiraffe
fonte
Você está configurando esses pontos de distorção antecipadamente ou eles são gerados automaticamente de alguma forma?
Richard Marskell - Drackir
Veja minha resposta e descrição do problema de embalagem em gamedev.stackexchange.com/questions/16054/…
Engineer
@Drackir A tinta é apenas uma trilha de partículas que não desaparece ou se move e cada partícula tem seu próprio ponto para mapear sua posição. Então, eu criei um loop for que verifica cada posição das partículas, vê se esse bloco está aberto, altera o mapa de colisão de acordo e remove a partícula. Os gráficos do bloco são desenhados de acordo com o mapa de colisão.
IronGiraffe 23/08
Estou incrivelmente confuso. Talvez uma imagem ajude as pessoas a ver o que você está tentando fazer e dê respostas sólidas.
Richard Marskell - Drackir 01/09/11
@Drackir Aqui está o vídeo do jogo até agora. Toda vez que você coloca peças, você altera os valores nesse local no mapa de colisão (uma matriz int.) Com as peças de urdidura, preciso de 9 peças de espaço aberto (todas as 9 peças são iguais a 0) e as peças de urdidura são criado nos pontos finais da linha roxa (onde as bandeiras aparecem em 1:32.) O que eu preciso é de uma maneira de usar um algoritmo de pesquisa para procurar em torno do ponto antigo um novo ponto que atenda às minhas diretrizes (8 peças vazias ao redor o novo ponto que também está vazio.) Exemplo.
IronGiraffe

Respostas:

3

Se tudo o que você deseja fazer é garantir que o bloco clicado tenha blocos abertos, eu apenas criaria uma função que verifique os blocos ao seu redor. E depois chame isso no bloco clicado.

Você pode configurá-lo em um loop (aninhado) ou apenas criar instruções if para ele. Então, no pseudo-código:

function IsTileOpen(tile)
  if tile NOT open
    return false because if the clicked tile isn't open, why check any others
  if tile on top row
    return false because we're against the top wall
  if tile on left column
    return false because we're against the left wall
  if tile on right column
    return false because we're against the right wall
  if tile on bottom row
    return false because we're against the bottom wall
  if top left tile NOT open
    return false
  if top tile NOT open
    return false
  if top right tile NOT open
    return false
  if left tile NOT open
    return false
  if right tile NOT open
    return false
  if bottom left tile NOT open
    return false
  if bottom tile NOT open
    return false
  if bottom right tile NOT open
    return false
  return true because all the surrounding tiles were open
end function

Editar com base no comentário

Há duas maneiras de lidar com a situação:

  1. (Mais fácil) Você pode simplesmente tocar um som e indicar que a posição que eles escolheram é inválida e eles precisam escolher outra opção.
  2. Use um algoritmo de pesquisa para encontrar um bloco aberto. No entanto, acho que deve haver limites em como você usa isso. Veja, por exemplo, uma situação em que eles clicam no lado esquerdo do mapa e o único ponto aberto fica longe no lado direito. Seu algoritmo de pesquisa encontra esse ponto aberto e coloca o outro warp lá. Isso não parece muito intuitivo e pode ser frustrante. Minha sugestão neste caso (supondo que você não queira fazer o número 1, que é minha sugestão principal), é pesquisar apenas os blocos ao redor do bloco atual (talvez em um raio de n blocos). Dessa forma, o warp gate não aparecerá muito longe de onde você clicou. Para fazer uma pesquisa como essa (assumindo um raio de 1 bloco), basta chamar a função acima nos oito blocos ao redor do atual (assumindo que o atual não estava disponível). Você pode fazer isso em um loop ou, novamente, com instruções if.
Richard Marskell - Drackir
fonte
Eu sei como fazer isso, mas não tenho certeza de como posso usar um algoritmo de pesquisa para encontrar um novo ponto quando o ponto antigo não estiver aberto. Eu tenho lido sobre pathfinding e parece que eu poderia fazer algo semelhante a esse, onde eu usaria o algoritmo de Dijkstra ou A * para encontrar o espaço aberto mais próximo. Só não tenho certeza de como poderia fazer isso, porque nunca havia programado algo assim antes. Desculpe por ser um incômodo, sou um pouco iniciante em programação, então ainda não sei muito.
IronGiraffe 5/09
@IronGiraffe - Oh, entendo o que você quer dizer. Ok, vou atualizar minha resposta.
Richard Marskell - Drackir 5/09/11
@IronGiraffe - Atualizado.
Richard Marskell - Drackir 5/09/11
É melhor fazer isso "verifique se o bloco está aberto" durante a carga ou geração nivelada e armazene o resultado. Geralmente, você precisa passar por todos os blocos (pelo menos, todos os blocos carregados / visíveis se você fizer uma avaliação lenta) nesse ponto, de qualquer maneira, esse pouco trabalho extra não importa, e os bits extras de memória não devem importar na maioria das plataformas ou.
Martin Sojka
@ Martin - Pelo que entendi, o nível muda à medida que você joga. Veja o vídeo. E ainda recomendo a opção 1 acima, mas se eles tiverem que fazer a segunda opção, é apenas um clique, por isso é improvável que cause um impacto perceptível no desempenho.
Richard Marskell - Drackir 5/09/11
0

Eu acho que você precisará encontrar o retângulo "livre" mais próximo de um bloco de urdidura, onde o jogador pode caber.

Há uma pergunta semelhante no stackoverflow. Clique para ver .

e-MEE
fonte