Gra helikopterem 2D, jak tworzyć ściany korytarza?

12

Zastanawiam się nad przystosowaniem klasycznej gry „helikoptera” (tj. Http://www.addictinggames.com/helicopter.html ), ale jeszcze nie wymyśliłem, jak stworzyć silnik generacji ścian.

Jakieś wskaźniki do pseudokodu? Nie interesują mnie obiekty pośrodku - tylko metodologia generowania boków w sposób, który zwiększa się z trudem (zamyka się bardziej, ma więcej nieoczekiwanych zakrętów) w miarę postępu gry.

davidkomer
źródło
1
Ponadto, aby to wyjaśnić, potrzebuję ścian bardziej łukowatych niż blokowych, ponieważ w rzeczywistości będą to „fale wodne” ...
David
1
po prostu rób jak bloki, ale płynnie interpoluj między nimi wtedy.
Gustavo Maciel

Odpowiedzi:

17

Możesz do tego użyć szumu 1D Perlin . Oto obraz szumu 2D. Pobrałem próbki tam, gdzie jest czerwona linia i pomnożyłem je z pewną stałą, aby uzyskać zieloną linię.

Szum 2D z sekcją 1D

Stała, przez którą mnożone są wartości, określa wysokość hałasu. Możesz więc łatwo zwiększyć trudność. Kolejną zaletą hałasu Perlina jest to, że może on generować hałas, który można układać w płytki, dzięki czemu można zbudować pozornie nieskończony poziom.

Jeśli chcesz utworzyć dno i sufit, ważne jest, aby nie generować żadnych nieprzejezdnych obszarów. Najłatwiejszym sposobem byłoby po prostu użycie „górnej” części hałasu (np. 1.0 - noiseValue) Jako sufitu, a dolnej części ( noiseValue) dolnej (oczywiście z pewnym przesunięciem pomiędzy). Jeśli to wygląda zbyt nudno, możesz również rozważyć dwie bliskie próbki, np. wyobraź sobie kolejną czerwoną próbkę o jeden lub dwa piksele w górę lub w dół. To da podobną, ale nie identyczną falę.

grzmot
źródło
Wow, to była taka pomoc! Dziękuję :) Zajmuję Flash / ActionScript i widzę, że jest wbudowana funkcja perlinNoise ... będzie grać z nim i zobaczyć jak to działa :)
davidkomer
@davidkomer Cieszę się, że jest to przydatne. We Flashu musisz stworzyć BitmapDataobiekt i użyć jego perlinNoisefunkcji. Mapa bitowa może mieć rozdzielczość 800 x 3 pikseli lub coś ekstremalnego, a następnie można po prostu wyodrębnić górne i dolne wartości (coś w rodzaju (bitmap.getPixel(x,y) & 0xff) / 255.0powinno dać wartości z 0..1zakresu.
bummzack
Hmmm- Mam to działające, ale stała / mnożnik wypycha wartości do nieprzekraczalnych obszarów ... oto mój kod, jakieś pomysły? (vect jest wektorem 32-bitowych wartości, próbkowanych z linii szumu perlin ... więc y_val to tylko niebieski kanał pomnożony przez skaler) dla (idx = 0; idx <vect.length; idx ++) {y_val = (vect [idx] i 0xFF) * skaler; drawData.fillRect (nowy prostokąt (idx, drawData.height - y_val, 1, y_val), 0x0000ff); drawData.fillRect (nowy prostokąt (idx, 0, 1, y_val), 0x0000ff); }
davidkomer
Na razie muszę biec - ale coś mi mówi, że muszę uważniej przeczytać wasze komentarze;) Tu jestem do tej
pory
Co to jest scaler? Otrzymane wartości będą w zakresie 0..255twojego kodu.
bummzack,