¿Cuál sería la mejor manera de encontrar un espacio abierto en un nivel?


7

Estoy trabajando en un juego 2D en el que usas paint para agregar fichas a un nivel y ahora estoy trabajando para agregar fichas de urdimbre. Lo configuré para que ciertas pinturas orientadas a la dirección usen dos puntos (un inicio y un final) para determinar en qué dirección apuntarán las fichas (izquierda, derecha, arriba, abajo). Las fichas de urdimbre tienen estos puntos, pero serán agregado a otras dos listas (warp start y end). La forma en que funcionan las urdimbres es: si el jugador golpea una ficha, se teletransportará a la ficha de urdimbre correspondiente. Ahora, si voy a hacer que esto funcione correctamente, tengo que hacerlo para que el jugador no pueda ser teletransportado a una pared o fuera del mapa. Así que necesito mover el punto a un mosaico abierto exactamente a un espacio de distancia de cualquier pared.

Cuál sería la mejor forma de hacer esto?


¿Está configurando estos puntos de deformación de antemano o se generan automáticamente de alguna manera?
Richard Marskell - Drackir

Vea mi respuesta y descripción del problema de embalaje en gamedev.stackexchange.com/questions/16054/…
Ingeniero

@Drackir La pintura es solo un rastro de partículas que no desaparece ni se mueve y cada partícula tiene su propio punto para mapear su posición. Así que hice un bucle for que verifica la posición de cada partícula, ve si esa ficha está abierta, cambia el mapa de colisión en consecuencia y luego elimina la partícula. Los gráficos de mosaico se dibujan de acuerdo con el mapa de colisión.
IronGiraffe

Estoy increíblemente confundido. Quizás una imagen ayudaría a las personas a ver lo que está tratando de hacer y le dará respuestas sólidas.
Richard Marskell - Drackir

@Drackir Aquí hay un video del juego hasta ahora. Cada vez que coloca mosaicos, cambia los valores en esa ubicación en el mapa de colisión (una matriz int.) Con los mosaicos warp necesito 9 mosaicos de espacio abierto (los 9 mosaicos son iguales a 0) y los mosaicos warp son creado en los puntos finales de la línea morada (donde las banderas aparecen a las 1:32). Lo que necesito es una forma de usar un algoritmo de búsqueda para mirar alrededor del punto anterior y encontrar un nuevo punto que se ajuste a mis pautas (8 fichas vacías alrededor el nuevo punto que también está vacío.) Ejemplo.
IronGiraffe

Respuestas:


3

Si todo lo que quiere hacer es asegurarse de que el mosaico en el que se hizo clic tiene mosaicos abiertos a su alrededor, simplemente crearía una función que verifique los mosaicos a su alrededor. Y luego llame a eso en el mosaico en el que hizo clic.

Puede configurarlo en un bucle (anidado) o simplemente crear sentencias if para él. Entonces, en pseudocó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 según el comentario

Hay dos formas de manejar la situación:

  1. (Más fácil) Puede reproducir un sonido e indicar que la posición que eligieron no es válida y deben elegir otra opción.
  2. Use un algoritmo de búsqueda para encontrar un mosaico abierto. Sin embargo, creo que debería haber límites sobre cómo usar esto. Tomemos, por ejemplo, una situación en la que hacen clic en el lado izquierdo del mapa y el único lugar abierto está lejos en el lado derecho. Su algoritmo de búsqueda encuentra ese espacio abierto y coloca el otro urdimbre allí. Esto no parece muy intuitivo y puede ser frustrante. Mi sugerencia en este caso (suponiendo que no desee hacer el n. ° 1, que es mi sugerencia principal), es buscar solo los mosaicos alrededor del mosaico actual (tal vez en un radio n-mosaico). De esta manera, la puerta de urdimbre no aparecerá muy lejos de donde hiciste clic. Para hacer una búsqueda como esta (suponiendo un radio de 1 mosaico), solo necesita llamar a la función anterior en los ocho mosaicos alrededor del actual (suponiendo que el actual no esté disponible). Puede hacer esto en un bucle o, de nuevo, con declaraciones if.

Sé cómo hacerlo, pero no estoy seguro de cómo puedo usar un algoritmo de búsqueda para encontrar un nuevo punto cuando el viejo no está abierto. He estado leyendo sobre la búsqueda de rutas y parece que podría hacer algo similar a eso, donde usaría el algoritmo de Dijkstra o el algoritmo A * para encontrar el espacio abierto más cercano. Simplemente no estoy seguro de cómo podría hacer eso, porque nunca antes había programado algo así. Lamento ser una molestia, soy un poco nuevo en la programación, así que todavía no sé mucho.
IronGiraffe

@IronGiraffe - Oh, entiendo lo que quieres decir. Ok, actualizaré mi respuesta.
Richard Marskell - Drackir

@IronGiraffe - Actualizado.
Richard Marskell - Drackir

Es mejor que "mire si el mosaico está abierto" durante la carga o generación de nivel y almacene el resultado. Por lo general, debe pasar por todos los mosaicos (al menos, todos los mosaicos cargados / visibles si realiza una evaluación diferida) en este punto de todos modos, ese pequeño trabajo adicional no importa, y los bits adicionales de memoria no deberían importar en la mayoría de las plataformas ya sea.
Martin Sojka

@ Martin - Por lo que entiendo, el nivel cambia a medida que juegas. Mira el video. Y, todavía recomiendo la opción 1 anterior, pero si tienen que hacer la segunda opción, es solo con un clic, por lo que es poco probable que cause un impacto notable en el rendimiento.
Richard Marskell - Drackir

0

Creo que necesitarás encontrar el rectángulo "libre" más cercano a una baldosa de urdimbre, donde el jugador pueda caber.

Hay una pregunta similar sobre stackoverflow. Haga clic para ver .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.