Pergunta

Eu estou construindo um jogo pacman. Basicamente, eu quero ter uma representação mapa desta janela constituído por blocos / azulejos. Em seguida, como o personagem pacman / fantasmas movimentos i mudaria sua posição no mapa para representar o que está na tela, e usar isso para detecção de colisão etc.

Como posso construir este mapa, especialmente desde que a tela é feita de coordenadas x, y, então como posso corretamente representá-los em telhas / neste mapa?

Foi útil?

Solução

Eu sei que é tentador começar a pensar em objetos e interfaces, mas você já pensou em uma matriz 2-dimensional com cada elemento representando 40 pixels ou algo assim? Não me lembro de pacman sendo pixels precisas quando se tratava de colisão, mais uma questão de direção cada peça estava se movendo em.

Outras dicas

Geralmente você tem uma representação abstrata que não faz referência pixels como tal (por exemplo, talvez o labirinto de Pac-Man é simplesmente w unidades de largura), e então você tem uma transformação linear (você sabe, y = mx + b ) para levar a representação abstrata de pixels reais.

Para torná-lo concreto, digamos que você quer que sua representação abstrata para ser 100 unidades de largura, e você quer torná-lo como 400 pixels. Em seguida, a transformação é apenas scrn_x = 4 * x.

tipo de dificuldade para chegar a isso sem escrevê-lo eu mesmo, mas.

Em primeiro lugar você vai precisar para criar definições de entidades que implementam ICollidable. Entidades que incluem fantasmas, pacman, pontos e powerups. Cada elemento no mapa deverá conter, juntamente com outras informações, uma lista de todas as entidades presentes com uma espécie de valor "posição" para maior precisão. A interface ICollidable incluiria não só a lógica para determinar quais entidades colidem uns com os outros (fantasmas não colidem com pontos, por exemplo.) Mas determinar se eles estão em posição para colidir com o outro. IE se pacman está entrando em um espaço da direita e um fantasma está deixando que o espaço da esquerda não há nenhuma colisão. Ele também irá ajudar a determinar quando exatamente pacman tenha comido um ponto para que graficamente parece correto. IE se você destruir um certo ponto como pacman entra em um espaço que vai desaparecer antes mesmo que ele toca graficamente.

Seus sprites como pacman eo fantasma são representados por posições (x, y). Para determinar se eles colidem uns com os outros, use este psuedocode:

sprites = [ ... list of sprites ... ]
for i1=0 to len(sprites):
    sprite1 = sprites[i1]
    for i2 = i1+1 to len(sprites):
        sprite2 = sprites[i2]
        if (sprite1.x-sprite2.x)^2+(sprite1.y-sprite2.y)^2 < radius_of_sprites^2:
            collide(sprite1, sprite2)

Note que esta não envolve o mapa de todo. Podemos verificar se há colisões entre pacman eo mapa separadamente. O truque chave aqui é que você dividir a coordenada de pixel de cada um dos lados do pacman (superior, inferior, esquerda, direita) e verificar se há colisões. Por exemplo, se pacman está indo para a direita, é preciso verificar a borda direita para uma colisão:

pacman_tile_x = (pacman.x+tilesize/2)/tilesize    # added tilesize/2 to check the middle of pacman
pacman_tile_y = pacman.y/tilesize + 1   # +1 because right edge is 1 tile to the right of the sprite's coordinate
if tile[pacman_tile_x][pacman_tile_y].is_a_wall:
    ... wall collide code ...

Agora, se você tem um grande número de sprites na tela, é possível otimizar o sprite-se sprite de detecção de colisão, armazenando que existem sprites em qualquer telha particular no mapa, e assim você só tem que verificar contra sprites em ladrilhos adjacentes. Mas para uma primeira passagem e para este jogo pacman, provavelmente não é uma otimização necessária.

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