Juego de helicóptero en 2D, ¿cómo crear paredes de pasillo?

12

Estoy buscando adaptar el clásico juego de "helicópteros" (es decir, http://www.addictinggames.com/helicopter.html ), pero aún no he descubierto cómo crear el motor de generación de muros.

¿Algún puntero al pseudocódigo? No me interesan tanto los objetos en el medio, solo la metodología para generar los lados de una manera que aumenta con la dificultad (se cierra en más, tiene curvas más inesperadas) a medida que avanza el juego.

davidkomer
fuente
1
Además, para aclarar, necesito que las paredes tengan más curvas que bloques, ya que en realidad serán "ondas de agua" ...
davidkomer
1
solo hazlo como bloques, pero interpola suavemente entre cada uno.
Gustavo Maciel

Respuestas:

17

Podrías usar el ruido 1D Perlin para eso. Aquí hay una imagen de ruido 2D. Tomé muestras donde está la línea roja y las multipliqué con alguna constante para obtener la línea verde.

Ruido 2D con sección 1D

La constante con la que multiplique los valores determinará la altura del ruido. Para que pueda aumentar fácilmente la dificultad. Otro beneficio del ruido de Perlin es que puede generar ruido enlosable, para que pueda construir un nivel aparentemente interminable.

Si desea crear un fondo y un techo, es importante que no genere áreas intransitables. La forma más fácil sería simplemente usar la parte "superior" del ruido (p. Ej. 1.0 - noiseValue) Como techo y la parte inferior ( noiseValue) para la parte inferior (con cierto desplazamiento en el medio, por supuesto). Si eso parece demasiado aburrido, también podría considerar dos muestras cercanas, por ejemplo. imagine otra línea de muestra roja uno o dos píxeles hacia arriba o hacia abajo. Esto dará una onda similar, pero no idéntica.

bummzack
fuente
Wow, esto fue de gran ayuda! Gracias :) Estoy desarrollando en Flash / Actionscript- y veo que hay una función incorporada de perlinNoise ... jugaré con ella y veré cómo funciona :)
davidkomer
@davidkomer Me alegro de que esto sea útil. En flash tendrás que crear un BitmapDataobjeto y usar su perlinNoisefunción. El mapa de bits puede ser de 800x3 píxeles o algo extremo, entonces simplemente puede extraer los valores de la línea superior e inferior (algo así (bitmap.getPixel(x,y) & 0xff) / 255.0debería darle valores en el 0..1rango.
bummzack
Hmmm: lo hice funcionar, pero el constante / multiplicador empuja los valores a áreas intransitables ... aquí está mi código, ¿alguna idea? (vect es un vector de valores de 32 bits, muestreado desde la línea de ruido perlin ... por lo que y_val es solo el canal azul multiplicado por el escalador) para (idx = 0; idx <vect.length; idx ++) {y_val = (vect [idx] & 0xFF) * escalador; drawData.fillRect (nuevo Rectángulo (idx, drawData.height - y_val, 1, y_val), 0x0000ff); drawData.fillRect (nuevo rectángulo (idx, 0, 1, y_val), 0x0000ff); }
davidkomer
Tengo que correr por ahora, pero algo me dice que solo necesito leer tus comentarios con más cuidado;) Aquí es donde estoy hasta
ahora-
¿Cuál es el scaler? Los valores que obtenga estarán en el rango de 0..255su código.
bummzack