Pergunta

Então, estou construindo o jogo pacman em Java para aprender programação de jogos sozinho.

Eu tenho a janela básica do jogo com o sprite do pacman e os sprites do fantasma desenhados, o pacman se move com as setas do teclado, não se move além das paredes da janela, etc.Agora estou tentando construir o labirinto, como nesta foto:

Pacman maze

Sem me dar a solução direta/completa para isso, alguém pode me orientar sobre como isso pode ser construído?Estou falando apenas sobre os limites e os canos (marcas 'T') aqui pelos quais você não pode passar e tem que contornar.Ainda não são os pontos que o pacman come.

Aqui estão minhas perguntas:

1) Qual é o algoritmo/método mais eficiente para criar este labirinto?Será necessário desenhá-lo toda vez que o método paint() for chamado ou existe uma maneira de desenhá-lo apenas no início do jogo e nunca mais?

2) Como isso será realmente desenhado na tela?Eu assumo o fillRect() será usado?

3) Qualquer dica sobre detecção de colisão (para que o pacman/fantasmas não possam atravessar as paredes) seria útil.

4) Qualquer dica sobre como o espaço vago entre os tubos será calculado para que os pontos possam ser preenchidos entre eles também será muito útil.

Obrigado

Foi útil?

Solução

Eu não faria dessa maneira.

Eu desenhava o mapa gráfico e criaria uma matriz de dados 2D que representa o mapa. O mapa de dados seria responsável por determinar colisões, comer pontos, onde está os doces e onde estão os fantasmas. Depois que toda a lógica para tudo for tratada, use a matriz 2D para exibir tudo em suas coordenadas de pixels adequadas sobre o mapa gráfico.

Por exemplo, o usuário está pressionando a tecla esquerda. Primeiro, você determina que Pacman está no elemento 3, 3. Elemento 3, 2 contém informações que denotam uma parede para que você possa implementar o código para fazê -lo ignorar o comando.

EDITAR:

Cada elemento representaria sobre onde um ponto poderia estar. Por exemplo:

Não, olhando para o quadro, eu diria que a matriz seria algo assim.

d,d,d,d,d,d,d,d,d,d,d,d,w,w,d,d,d,d,d,d,d,d,d,d,d,d
d,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,d
p,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,p    
d,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,d    
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d

E assim por diante. Você pode escolher uma estrutura de dados mais flexível do que apenas caracteres, pois algumas áreas precisam conter várias informações diferentes. Ou seja, embora a área de desova fantasma esteja em branco, Pacman não é permitido lá. O movimento dos fantasmas e Pacman é diferente para as fugas laterais, o ponto de desova de doces é um ponto em branco, mas se você quiser permanecer flexível, deseja denotar onde isso está por mapa.

Outra coisa que você vai querer lembrar é que Pacman e os fantasmas geralmente estão entre os pontos, portanto, contendo informações que representam uma porcentagem de um espaço que estão ocupando entre 1,2 e 1,3 é importante para a detecção de colisão, além de determinar Quando você deseja remover pontos, powerups e doces do quadro.

Outras dicas

Aqui está uma dica para você:

TEXTO DE ALT HTTP://www.freeimagehosting.net/uploads/66e4131f59.jpg

Essa dica, usada adequadamente, permitirá que você lide com a renderização e a detecção de colisão e também permitirá que você represente o labirinto de maneira compacta.

  1. Você pode pintar o mapa em um bufferiMage e apenas desenhar que em cada tinta (). Você terá um desempenho bastante razoável dessa maneira.

  2. Se você estiver feliz com as paredes sendo sólidas, poderá desenhar cada bloco de parede quadrado com arremesso. Se você deseja obter a mesma aparência da imagem, precisa descobrir como desenhar as linhas da maneira certa e usar arcos para cantos.

  3. O mapa do jogo do Pacman é feito de quadrados e Pacman e os fantasmas sempre se movem de um quadrado para a praça vizinha em uma etapa animada (ou seja, você pressiona a direita, o Pacman se move um quadrado para a direita). Isso significa que a detecção de colisão é fácil: simplesmente não permita movimentos para quadrados que não estejam vazios.

  4. Não entendo o que você está tentando perguntar aqui.

1) Só para dar meu conselho sobre redesenhar.Algo que você pode fazer se achar que redesenhar a imagem inteira é lento é determinar apenas os elementos que foram alterados na tela e redesenhá-los.Uma abordagem para isso seria a seguinte:Determine os sprites que foram movidos.Determine (aproximadamente) um retângulo ao redor desses sprites.Redesenhe apenas esses retângulos.Dessa forma, você atualiza apenas partes da tela e não a tela inteira.Isso deve resultar em um aumento no desempenho em relação ao redesenho da tela inteira.

As outras respostas foram razoáveis ​​para as outras perguntas que você fez.

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