Game Maker - создание игр | HellRoom Games
Январь 16, 2025, 08:54:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Градиентный шум в Game Maker  (Прочитано 3512 раз)
0 Пользователей и 1 Гость смотрят эту тему.
NickLatkovich
Никита Латкович
GM Pro user
*

Репутация: 185
Offline Offline

Пол: Мужской
Награды:
500 сообщений!За постоянность! [10 дней на форуме]За лояльность! [+150 репутации]3 место в Весеннем конкурсе. Игра
API: GameMaker Studio Master
Сообщений: 853


7*3=21;73=p(21);37=p(12)


WWW
« : Июль 25, 2015, 03:00:10 »

Всем привет! Hi!
Сегодня я покажу вам написанный мною скрипт генерации ландшафта посредством использования градиентного шума и косинусной интерполяции



Одномерный градиентный шум

Код:

/*Изменяемые величины*/
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].
Получившийся ландшафт можно изобразить в графическом виде:
http://2.firepic.org/2/images/2015-07/25/8wh2hxbyxb76.png
Градиентный шум в Game Maker
http://2.firepic.org/2/images/2015-07/25/45hk3ez1lq9s.png
Градиентный шум в Game Maker
http://2.firepic.org/2/images/2015-07/25/nrw94rb9qlxq.png
Градиентный шум в 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].
Получившийся ландшафт можно изобразить в графическом виде:
http://2.firepic.org/2/images/2015-07/25/m1srbhp1izq4.png
Градиентный шум в Game Maker
http://2.firepic.org/2/images/2015-07/25/x92w3lvcewr3.png
Градиентный шум в Game Maker
http://2.firepic.org/2/images/2015-07/25/wlo9baw02i3t.png
Градиентный шум в Game Maker


Gif анимация сгенерированного ландшафта (1,3 Мб):



Возможно, через недельку, напишу статью о градиентном шуме, где расскажу его принцип и полностью разберу весь этот код.
« Последнее редактирование: Июль 25, 2015, 13:45:24 от Diablo13th » Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

HellRoom Games © 2006-2012 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
Страница сгенерирована за 0.091 секунд. Запросов: 27.