Всем привет!
Сегодня я покажу вам написанный мною скрипт генерации ландшафта посредством использования градиентного шума и косинусной интерполяции
Одномерный градиентный шум
/*Изменяемые величины*/
amplitude = 64;//Амплитуда колебаний
wavelength = amplitude;//Длинна волны (можно изменить на свою)
map_length = 1024//Длинна карты
/**/
length = map_length div wavelength;//Кол-во участков, на которых будет использоваться косинусная интерполяция
wavestep = 1 / wavelength;
for (x = 0; x <= length; x += 1) {
a[x] = irandom(amplitude);
}
xx = 0;
x1 = 0;
for (x = 0; x < length; x += 1) {
x1 += 1;
for (y = 0; y < wavelength; y += 1) {
l = (1 - cos(y * wavestep * pi)) / 2;
b[xx] = a[x] * (1 - l) + a[x1] * l;
xx += 1;
}
}
На выходе мы получим массив b[0 -- map_length], который будет состоять из чисел в диапазоне [0, amplitude].
Получившийся ландшафт можно изобразить в графическом виде:
Градиентный шум в Game Maker
Градиентный шум в Game Maker
Градиентный шум в Game Maker
Двумерный градиентный шум
/*Изменяемые величины*/
amplitude = 255;//Амплитуда колебаний
wavelength = amplitude;//Длинна волны (можно изменить на свою)
map_length = 512//Длинна карты
/**/
length = map_length div wavelength;//Кол-во участков, на которых будет использоваться косинусная интерполяция
wavestep = 1 / wavelength;
for (x = 0; x <= length; x += 1) {
for (y = 0; y <= length; y += 1) {
a[x, y] = irandom(amplitude);
}
}
for (x = 0; x <= length; x += 1) {
yy = 0;
y1 = 0;
xx = x * wavelength;
for (y = 0; y < length; y += 1) {
y1 += 1;
for (j = 0; j < wavelength; j += 1) {
l = (1 - cos(j * wavestep * pi)) / 2;
b[xx, yy] = a[x, y] * (1 - l) + a[x, y1] * l;
yy += 1;
}
}
}
for (x = 0; x < length; x += 1) {
xx = x * wavelength;
x1 = xx + wavelength;
yy = 0;
for (y = 0; y < map_length; y += 1) {
for (j = 0; j < wavelength; j += 1) {
l = (1 - cos(j * wavestep * pi)) / 2;
b[xx + j, y] = b[xx, y] * (1 - l) + b[x1, y] * l;
yy += 1;
}
}
}
На выходе мы получим двумерный массив b[0 -- map_length, 0 -- map_length], который будет состоять из чисел в диапазоне [0, amplitude].
Получившийся ландшафт можно изобразить в графическом виде:
Градиентный шум в Game Maker
Градиентный шум в Game Maker
Градиентный шум в Game Maker
Gif анимация сгенерированного ландшафта (1,3 Мб):Градиентный шум в Game Maker
Возможно, через недельку, напишу статью о градиентном шуме, где расскажу его принцип и полностью разберу весь этот код.