Вверх ↑
Ответов: 126
Mafia
Консильери
#1: 2020-10-19 00:27:32 ЛС | профиль | цитата
Обновление принесло нам возможность менять размеры вокселей, из которых теперь получается красивый снегопад, в дополнение к ёлочке) Новый Год не за горами)

Снежинки простенькие

function init(){
VOXELS_COUNT = 5000 // количество вокселей
LIMIT_SPEED = 0 // 0 - максимальная скорость, больше - медленнее
SCALE_MIN = 0.1 // минимальный размер
SCALE_MAX = 0.3 // максимальный размер
BRIGHTNESS = 255 // яркость снежинки от 0 до 255
// размеры области отображения
X_MIN = -64 // влево от -64 до 79
X_MAX = 79 // вправо от -64 до 79
Z_MIN = -64 // назад от -64 до 79
Z_MAX = 79 // вперёд от -64 до 79
Y_MIN = -80 // вниз от -80 до 63
Y_MAX = 63 // вверх от -80 до 63
// смещение снежинки каждый такт
OFFSET_X = 0 // влево-вправо
OFFSET_Z = 0 // назад-вперёд
OFFSET_Y = -0.2 // вверх-вниз
// массив для вокселей
voxel = []
// инициализация вокселей
for( i = 0 ; i ‹ VOXELS_COUNT ; i++ ){
// базовые расположение и размер
x = rc( X_MIN , X_MAX )
y = rc( Y_MIN , Y_MAX )
z = rc( Z_MIN , Z_MAX )
s = rc( SCALE_MIN , SCALE_MAX )
// создание вокселя и задание параметров
t = display.voxel( x , y , z , color.rgb( BRIGHTNESS , BRIGHTNESS , BRIGHTNESS ) )
t.scale = s
// добавление вокселя в массив
voxel.push( t )
}
// переменная для реализации торможения
last_time = 0
}

function rc( min , max ){
// случайное число в заданных пределах
return min + Math.random() * ( max - min )
}

function update( time_now ){
// торможение выполнения
if( time_now - last_time ‹ LIMIT_SPEED ) return
last_time = time_now
// изменение параметров вокселей
for( i = 0 ; i ‹ VOXELS_COUNT ; i++ ){
// смещение относительно текущего расположения
x = OFFSET_X
y = OFFSET_Y
z = OFFSET_Z
voxel[i].offset( x , y , z )
// отражение при выходе за пределы отображения
if( voxel[i].cursorY ‹ Y_MIN ) voxel[i].cursorY = Y_MAX
}
}

Снежинки со смещениями, но больше нагружающие комп

function init(){
VOXELS_COUNT = 5000 // количество вокселей
LIMIT_SPEED = 0 // 0 - максимальная скорость, больше - медленнее
SCALE_MIN = 0.1 // минимальный размер
SCALE_MAX = 0.3 // максимальный размер
BRIGHTNESS = 255 // яркость снежинки от 0 до 255
// размеры области отображения
X_MIN = -64 // влево от -64 до 79
X_MAX = 79 // вправо от -64 до 79
Z_MIN = -64 // назад от -64 до 79
Z_MAX = 79 // вперёд от -64 до 79
Y_MIN = -80 // вниз от -80 до 63
Y_MAX = 63 // вверх от -80 до 63
// смещение снежинки каждый такт
OFFSET_X_MIN = -0.1 // минимум влево-вправо
OFFSET_X_MAX = 0.1 // максимум влево-вправо
OFFSET_Z_MIN = -0.1 // минимум назад-вперёд
OFFSET_Z_MAX = 0.1 // максимум назад-вперёд
OFFSET_Y_MIN = -0.1 // минимум вверх-вниз
OFFSET_Y_MAX = -0.5 // максимум вверх-вниз
// массив для вокселей
voxel = []
// инициализация вокселей
for( i = 0 ; i ‹ VOXELS_COUNT ; i++ ){
// базовые расположение и размер
x = rc( X_MIN , X_MAX )
y = rc( Y_MIN , Y_MAX )
z = rc( Z_MIN , Z_MAX )
s = rc( SCALE_MIN , SCALE_MAX )
// создание вокселя и задание параметров
t = display.voxel( x , y , z , color.rgb( BRIGHTNESS , BRIGHTNESS , BRIGHTNESS ) )
t.scale = s
// добавление вокселя в массив
voxel.push( t )
}
// переменная для реализации торможения
last_time = 0
}

function rc( min , max ){
// случайное число в заданных пределах
return min + Math.random() * ( max - min )
}

function update( time_now ){
// торможение выполнения
if( time_now - last_time ‹ LIMIT_SPEED ) return
last_time = time_now
// изменение параметров вокселей
for( i = 0 ; i ‹ VOXELS_COUNT ; i++ ){
// смещение относительно текущего расположения
x = rc( OFFSET_X_MIN , OFFSET_X_MAX )
y = rc( OFFSET_Y_MIN , OFFSET_Y_MAX )
z = rc( OFFSET_Z_MIN , OFFSET_Z_MAX )
voxel[i].offset( x , y , z )
// отражение при выходе за пределы отображения
if( voxel[i].cursorY ‹ Y_MIN ) voxel[i].cursorY = Y_MAX
if( voxel[i].cursorY › Y_MAX ) voxel[i].cursorY = Y_MIN
if( voxel[i].cursorX ‹ X_MIN ) voxel[i].cursorX = X_MAX
if( voxel[i].cursorX › X_MAX ) voxel[i].cursorX = X_MIN
if( voxel[i].cursorZ ‹ Z_MIN ) voxel[i].cursorZ = Z_MAX
if( voxel[i].cursorZ › Z_MAX ) voxel[i].cursorZ = Z_MIN
}
}

Дождик, чтобы вспоминать зимой другие времена года

function init(){
VOXELS_COUNT = 5000 // количество частиц от 1 до 5000
VOXELS_PER_DROP = 5 // частиц на каплю
LIMIT_SPEED = 0 // 0 - максимальная скорость, больше - медленнее
SCALE = 0.1 // размер капли
BRIGHTNESS = 200 // яркость капли от 0 до 255
// размеры области отображения
X_MIN = -64 // влево от -64 до 79
X_MAX = 79 // вправо от -64 до 79
Z_MIN = -64 // назад от -64 до 79
Z_MAX = 79 // вперёд от -64 до 79
Y_MIN = -80 // вниз от -80 до 63
Y_MAX = 63 // вверх от -80 до 63
// смещение капли каждый такт
OFFSET_X = 0 // влево-вправо
OFFSET_Z = 0 // назад-вперёд
OFFSET_Y = -1.5 // вверх-вниз
// массив для вокселей
voxel = []
// количество капель
DROPS_COUNT = Math.floor( VOXELS_COUNT / VOXELS_PER_DROP )
// инициализация вокселей
for( i = 0 ; i ‹ DROPS_COUNT ; i++ ){
// базовые расположение и размер
x = rc( X_MIN , X_MAX )
y = rc( Y_MIN , Y_MAX )
z = rc( Z_MIN , Z_MAX )
s = SCALE
// создание капли из частиц
for( p = 0 ; p ‹ VOXELS_PER_DROP ; p++ ){
t = display.voxel( x , y + SCALE * p , z , color.rgb( 0 , 0 , BRIGHTNESS ) )
t.scale = s
voxel.push( t )
}
}
// переменная для реализации торможения
last_time = 0
}

function rc( min , max ){
// случайное число в заданных пределах
return min + Math.random() * ( max - min )
}

function update( time_now ){
// торможение выполнения
if( time_now - last_time ‹ LIMIT_SPEED ) return
last_time = time_now
// изменение параметров вокселей
for( i = 0 ; i ‹ DROPS_COUNT * VOXELS_PER_DROP ; i++ ){
// смещение относительно текущего расположения
x = OFFSET_X
y = OFFSET_Y
z = OFFSET_Z
voxel[i].offset( x , y , z )
// отражение при выходе за пределы отображения
if( voxel[i].cursorY ‹ Y_MIN ) voxel[i].cursorY = Y_MAX - Math.abs(voxel[i].cursorY - Y_MIN)
if( voxel[i].cursorY › Y_MAX ) voxel[i].cursorY = Y_MIN + Math.abs(voxel[i].cursorY - Y_MAX)
if( voxel[i].cursorX ‹ X_MIN ) voxel[i].cursorX = X_MAX - Math.abs(voxel[i].cursorX - X_MIN)
if( voxel[i].cursorX › X_MAX ) voxel[i].cursorX = X_MIN + Math.abs(voxel[i].cursorX - X_MAX)
if( voxel[i].cursorZ ‹ Z_MIN ) voxel[i].cursorZ = Z_MAX - Math.abs(voxel[i].cursorZ - Z_MIN)
if( voxel[i].cursorZ › Z_MAX ) voxel[i].cursorZ = Z_MIN + Math.abs(voxel[i].cursorZ - Z_MAX)
}
}

Выбранный код вставляется в блокнот, используемый в MCGL9, который затем кладётся в проектор. Ещё вам наверняка пригодятся способы решения проблем, описанные в теме о ёлочке.

карма: -4
25
Голосовали:apl, MaJIuHa, _Karnelius_, -BROD9GA-, helpbringer, Moonlight_420, RouteVO, miratvorech, calm, BlooDStoune, miroschka, Miracle-, OTBETCTBEHHblN, DeMoNo5060, 6Sixty_nine9, Nick_Fury, CodARM, zelovo37, Chekter, lambrusco, Chydovishe, My_Adidas, tauras, Rimuru_Tempest, Vano4ok, OSNOVA_BOGA, XBocT