¿Cómo representar una ventana de 400x400 como un mapa en un juego de Java?

StackOverflow https://stackoverflow.com/questions/622517

  •  05-07-2019
  •  | 
  •  

Pregunta

Estoy construyendo un juego de pacman. Básicamente, quiero tener una representación de mapa de esta ventana que consta de bloques / mosaicos. Luego, a medida que el personaje / fantasma del pacman se mueve, cambiaría su posición en el mapa para representar lo que hay en la pantalla, y lo usaría para la detección de colisiones, etc.

¿Cómo puedo construir este mapa, especialmente porque la pantalla está formada por coordenadas x, y, entonces, cómo puedo representarlas correctamente en mosaicos / en este mapa?

¿Fue útil?

Solución

Sé que es tentador comenzar a pensar en objetos e interfaces, pero ¿has pensado en una matriz bidimensional con cada elemento que representa 40 píxeles o algo así? No recuerdo que pacman tuviera una precisión de píxeles cuando se trataba de una colisión, más bien una cuestión de la dirección en la que se movía cada pieza.

Otros consejos

En general, tiene una representación abstracta que no hace referencia a los píxeles como tales (por ejemplo, tal vez el laberinto de Pac-Man es simplemente w unidades de ancho), y luego tiene una transformación lineal (ya sabe, y = mx + b ) para llevar la representación abstracta a píxeles reales.

Para concretarlo, supongamos que desea que su representación abstracta tenga 100 unidades de ancho, y desea que sea de 400 píxeles. Entonces la transformación es solo scrn_x = 4 * x.

Es difícil encontrar esto sin escribirlo yo mismo, pero.

Primero deberá crear definiciones de entidad que implementen ICollidable. Las entidades incluirían fantasmas, pacman, puntos y powerups. Cada elemento del mapa contendría, junto con otra información, una lista de todas las entidades presentes con una especie de " posición " Valor para mayor precisión. La interfaz de ICollidable incluiría no solo la lógica para determinar qué entidades chocan unas con otras (los fantasmas no chocan con puntos, por ejemplo), sino también determinar si están en posición de chocar entre sí. Es decir, si pacman ingresa en un espacio desde la derecha y un fantasma deja ese espacio desde la izquierda, no hay colisión. También ayudará a determinar cuándo exactamente pacman ha comido un punto para que, gráficamente, se vea correcto. IE, si destruyes un punto justo cuando pacman entra en un espacio, desaparecerá antes de que lo toque gráficamente.

Tus sprites como pacman y el fantasma están representados por posiciones (x, y). Para determinar si chocan entre sí, 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)

Tenga en cuenta que esto no implica el mapa en absoluto. Podemos verificar las colisiones entre pacman y el mapa por separado. El truco clave aquí es dividir la coordenada de píxeles de cada lado de pacman (arriba, abajo, izquierda, derecha) y verificar las colisiones. Por ejemplo, si pacman va a la derecha, debemos verificar el borde derecho para una colisión:

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 ...

Ahora, si tiene una gran cantidad de sprites en la pantalla, puede optimizar la detección de colisiones sprite-to-sprite almacenando qué sprites existen en cualquier mosaico en particular en el mapa, y así solo tiene que verificar contra sprites. en azulejos adyacentes. Pero para un primer pase y para este juego de Pacman, probablemente no sea una optimización necesaria.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top