2010-11-06 7 views
14

Estoy trabajando en un juego, y he encontrado un problema bastante interesante: formas inteligentes de dibujar campos estelares.Maneras ingeniosas de dibujar un campo estelar

Es un juego en 2D, por lo que la acción puede desplazarse en las direcciones X e Y. Además, podemos ajustar la escala para mostrar más o menos el área de juego. También me gustaría que el campo de estrellas tenga paralaje falso para dar una impresión de profundidad.

En este momento estoy haciendo esto de la manera tradicional, al tener una gran variedad de estrellas, cada una de las cuales está etiquetada por un factor de "profundidad". Para dibujar, traduzco cada estrella según la posición de la cámara multiplicada por la "profundidad", por lo que algunas estrellas se mueven mucho y algunas se mueven un poco. Todo esto funciona bien, pero, por supuesto, dado que tengo un número finito de estrellas en mi matriz, tengo problemas cuando la cámara se mueve demasiado o se aleja demasiado. Esto es todo lo que funcionará, pero implica un montón de código y casos especiales.

Esto ofende mi sentido de la elegancia. Habrá una mejor manera de lograr esto.

He considerado procesar mis estrellas, lo que me permite tener un número ilimitado: p. usando una semilla fija y un PRNG para determinar las coordenadas. Tendría que dividir el cielo en mosaicos, generar la semilla mezclando las coordenadas del mosaico y dibujar, digamos, 100 estrellas por ficha. Esto me permite ampliar mi campo de estrellas indefinidamente en todas las direcciones sin tener que considerar las fichas visibles, pero esto no funciona con el factor de "profundidad", ya que permite que las estrellas se desvíen fuera de su casilla. Simplemente podría usar múltiples campos estelares sin paralaje usando este algoritmo, pero esto me parece una trampa.

Y, por supuesto, tengo que hacer todo esto en cada fotograma, así que tiene que ser rápido.

¿Qué es lo que todos ustedes creen?

+3

Pruebe http://gamedev.stackexchange.com, pueden tener más experiencia con tales problemas. –

+0

Ni siquiera sabía que existía; ejército de reserva. Cualquier administrador, siéntase libre de mover la pregunta allí ... –

+0

Cualquier solución que se le ocurra, si necesita más rendimiento, convierta su código para usar números enteros de punto fijo en lugar de números de coma flotante. – user499211

Respuesta

1

Como las estrellas en el fondo no se mueven tan rápido como las de primer plano, podrías hacer mosaicos de varias capas para el fondo y reemplazarlas por capas de una capa cuando tienes tiempo para hacerlo . Ah, y ¿qué hay de repetir patrones en las capas de fondo? Esto quizás te permita pregenerar todas las teselas de fondo, aún podrías cambiarlas en altura y superponer varias con compensaciones aleatorias para que parezca aleatorio.

2

Tienen algunas capas de estrellas.

Para cada capa, utilice un generador de números aleatorios (o simplemente una matriz) para generar la cantidad de espacio en blanco entre una estrella y la siguiente (una distribución de Poisson, si quiere ser quisquilloso). Desea que las estrellas sean bastante dispersas, por lo que el espacio en blanco a menudo será más que toda la fila. Las capas posteriores serán más densas que las anteriores, obviamente.

Use esto para tener varias fichas cada una (digamos) dos pantallas de ancho. Desplácese por el campo de estrellas haciendo un seguimiento de dónde está esa "primera" estrella para cada capa.

El jugador no notará el mosaico, ya que desplaza las fichas a diferentes velocidades para cada capa, especialmente si usa algunas capas que son bastante escasas.

0

Cada fotograma, representa las estrellas en un solo mapa de bits/capa. Solo son puntos, por lo que será más rápido que usar cualquier algoritmo con múltiples capas.

Ahora necesita una cuadrícula 2D infinita de cuadros 3D llenos de un número finito de estrellas. Para cada cuadro, puede definir un valor RANDOM_SEED individual, utilizando sus coordenadas de cuadrícula. Las estrellas en cada caja se pueden generar sobre la marcha.

Recuerde corregir la perspectiva al hacer zoom: cada cuadro 3D tiene un rectángulo cercano (frente) y un rectángulo lejano. Verá más estrellas en las casillas contiguas, siempre que el rectángulo lejano o casi rectangular se encoja en su vista.

Sus rectángulos lejanos nunca deben ser más pequeños que la mitad del ancho de los rectángulos cercanos, de lo contrario podría ser problemático: es posible que tenga que escanear enormes listas de estrellas donde la mayoría de ellas están fuera de los límites. Puede obtener estrellas detrás de los rectángulos lejanos a través de cuadrículas 2D adicionales de cuadros 3D con otros tamaños y profundidades.

1

¿Hay algo de malo en envolver el campo de estrella en X e Y? Debido a su profundidad, la distancia envolvente debe depender de la profundidad, pero puede hacerlo. Cada estrella grabado en (x, y, profundidad) debe aparecer en todos los puntos

[x + j * S * profundidad, y + k * S * profundidad]

para todos los enteros j y k. S es un parámetro envolvente. Si S es 1, el envolvente ocurre inmediatamente y todas las estrellas siempre se muestran en algún lugar. Si S es un envolvente más alto no ocurre inmediatamente y algunas estrellas se muestran fuera de la pantalla. Es probable que desee S lo suficientemente grande como para garantizar que no se repitan al máximo de alejamiento.

0

¿Por qué no combinar las coordenadas de los cuadros 3D starfield para formar el número aleatorio de semillas? Use un "ajuste" global si desea producir diferentes universos. De esta forma, no necesita rastrear los cuadros que no puede ver porque los contenidos están fijados por su ubicación.

+1

La pregunta se refiere a generar un fondo de "cielo estrellado" con un efecto de paralaje a medida que el puerto de visualización se mueve. No estoy seguro de si esta respuesta aborda ese problema. – TheCodeArtist