Jogo de helicóptero 2D, como criar paredes do corredor?

12

Estou pensando em adaptar o clássico jogo de "helicóptero" (por exemplo, http://www.addictinggames.com/helicopter.html ), mas ainda não descobri como criar o mecanismo de geração de paredes.

Algum ponteiro para o pseudocódigo? Eu não estou tão interessado nos objetos no meio - apenas a metodologia para gerar os lados de uma maneira que aumenta com dificuldade (fecha mais, tem curvas mais inesperadas) à medida que o jogo avança.

davidkomer
fonte
1
Também de esclarecer, eu preciso das paredes a ser mais curvilínea de blocos, uma vez que vai ser realmente "ondas" ...
davidkomer
1
faça apenas como blocos, mas interpole suavemente entre cada um deles.
Gustavo Maciel

Respostas:

17

Você pode usar o ruído 1D Perlin para isso. Aqui está uma imagem do ruído 2D. Tirei amostras onde a linha vermelha está e multipliquei-as com alguma constante para obter a linha verde.

Ruído 2D com seção 1D

A constante com a qual você multiplica os valores determina a altura do ruído. Então você pode facilmente aumentar a dificuldade. Outro benefício do ruído Perlin é que ele pode gerar ruído inclinável, para que você possa construir um nível aparentemente interminável.

Se você deseja criar um fundo e um teto, é importante que você não gere nenhuma área intransitável. A maneira mais fácil seria simplesmente usar a parte "superior" do ruído (por exemplo 1.0 - noiseValue) como teto e a parte inferior ( noiseValue) na parte inferior (com algum deslocamento entre, é claro). Se isso parecer muito chato, você também pode considerar duas amostras próximas, por exemplo. imagine outra linha de amostra vermelha de um ou dois pixels para cima ou para baixo. Isso dará uma onda semelhante, mas não idêntica.

bummzack
fonte
Uau, isso foi de grande ajuda! Obrigado :) Eu estou desenvolvendo em Flash / ActionScript e eu ver que há um built-in função perlinNoise ... vai jogar com ele e ver como ele vai :)
davidkomer
@davidkomer Fico feliz que isso seja útil. No flash, você terá que criar um BitmapDataobjeto e usar sua perlinNoisefunção. O bitmap pode ser 800x3 pixels ou algo extremo, então você pode simplesmente extrair os valores top e bottom line (algo como (bitmap.getPixel(x,y) & 0xff) / 255.0deve dar-lhe valores no 0..1intervalo.
bummzack
Hmmm- eu consegui funcionar, mas o constante / multiplicador empurra os valores para áreas intransitáveis ​​... aqui está o meu código, alguma idéia? (vect é um vetor de valores de 32 bits, amostrado da linha de ruído perlin ... então y_val é apenas o canal azul multiplicado pelo scaler) para (idx = 0; idx <comprimento do vect; idx ++) {y_val = (vect [idx] & 0xFF) * redimensionador; drawData.fillRect (novo retângulo (idx, drawData.height - y_val, 1, y_val), 0x0000ff); drawData.fillRect (novo retângulo (idx, 0, 1, y_val), 0x0000ff); }
davidkomer
Eu tenho que correr para agora- mas algo me diz que eu só precisa ler seus comentários com mais cuidado;) Esta é onde eu estou tão Far pastebin.com/1tmMtEAh
davidkomer
Qual é o scaler? Os valores que você obtém estarão no intervalo do 0..255seu código.
bummzack