- 373
- 311
представляю вам попытку портировать particles.js на Lua (samp moonloader) под mimgui
работает как в окне, так и в дравлисте фона
да, знаю, что в 2023 году был вариант от @ik0nka (респект тебе), но думаю, что моё решение более гибкое, хоть и требует mimgui и не использует d3d рендерер (render* функции), тем временем, представляя собой именно библиотеку, а не сниппет.
😋 постарался сделать как можно более гибкую настройку, есть недочёты, пишите в теме что добавить, что исправить, делитесь своими пресетами)
как пользоваться
для начала нужно скачать Particles.lua из вложений с этого поста и поместить файл в %папка_сампа%/moonloader/lib
далее необходимо заинклудить библиотеку, создать объект системы частиц и вызвать отрисовку. примеры ниже:
Lua:
local imgui = require 'mimgui'
local Particles = require 'Particles'
-- лучше оставить эту функцию
-- позволяет корректно определить, находится
-- ли курсор мыши в пределах окна
-- нужно для правильной работы притягивания
-- частиц к курсору
function is_mouse_hovering(win_pos, window_size, mx, my)
local rect_max = {x = win_pos.x + window_size.x, y = win_pos.y + window_size.y}
return imgui.IsMouseHoveringRect(win_pos, rect_max, true) and (imgui.ImVec2(mx, my) - win_pos) or nil
end
-- задаем настройки для системы частиц
local particles_settings = {
gravity = 0,
boundary_behavior = "bounce",
infinite_life = true,
color_animation = "rainbow",
line_color_animation = "rainbow"
}
-- создаем новую систему частиц
local particles_window = Particles:new(particles_settings)
imgui.OnFrame(function() return true end, function()
imgui.SetNextWindowSize(imgui.ImVec2(400, 600), imgui.Cond.FirstUseEver)
imgui.Begin("Particles")
-- задаем размеры области отрисовки на основе
-- размера окна и его позиции, чтобы корректно
-- отрисовать частицы
local win_pos = imgui.GetWindowPos()
local win_size = imgui.GetWindowSize()
particles_window.size = {x = win_size.x, y = win_size.y}
-- здесь мы передаем системе частиц правильную
-- позицию курсора мыши и вызываем отрисовку
local mouse_pos = imgui.GetMousePos()
particles_window:update(is_mouse_hovering(win_pos, win_size, mouse_pos.x, mouse_pos.y))
particles_window:draw(imgui.GetWindowDrawList(), win_pos)
imgui.End()
end)
Lua:
local imgui = require 'mimgui'
local Particles = require 'Particles'
-- задаем настройки для системы частиц
local scrX, scrY = getScreenResolution()
local particles_settings = {
gravity = 0,
max_particles = 300,
max_distance = 200,
boundary_behavior = "bounce",
infinite_life = true,
size = imgui.ImVec2(scrX, scrY)
}
-- создаем новую систему частиц
local particles_background = Particles:new(particles_settings)
imgui.OnFrame(function() return true end, function(self)
-- скрыли курсор, чтоб не мешался
-- обновили позицию мыши и размер окна
-- передали в отрисовку дравлист фона
self.HideCursor = true
local scrX, scrY = getScreenResolution()
particles_background.size = imgui.ImVec2(scrX, scrY)
particles_background:update(imgui.GetMousePos())
particles_background:draw(imgui.GetBackgroundDrawList(), imgui.ImVec2(0,0))
end)
параметры для настроек системы частиц (settings table)
параметр | тип | описание | возможные значения |
gravity | number | гравитация, ну или вертикальная скорость частиц | 0, 0.1, 0.5 (любое число) |
boundary_behavior | string | поведение частиц на границе экрана | "bounce" (отскакивать) "respawn" (сдохнуть и появиться заново) |
infinite_life | bool | "умрёт" ли частица через какое-то время (math.random(50, 150)) | true/false |
magnetism | string | тип притяжения | "none" (отключить) "cursor" (относительно мыши) "particles" (относительно других частиц) "both" (относительно и мыши и частиц) |
magnetism_strength | number | сила притяжения | 10, 100, 1000 (любое число) |
magnetism_radius | number | радиус притяжения | 100, 500, 1000 (любое число) |
speed_range | table | диапазон для рандомной скорости при создании частицы | {min, max} (например {-1.5, 1.5}) |
min_speed | number | минимальная гарантированная скорость (не будет ниже установленной) | 0.5, 1.1, 2.0 (любое число) |
max_speed | number | максимальная гарантированная скорость | 10.5, 11.1, 20.0 (любое число) |
wind | number | ветер (горизонтальная скорость частиц) | 0, 0.5, 1 (любое число) |
friction | number | трение. симулирует торможение частиц об "воздух" | рекомендуемое значение от 0 до 1 1 - отключает фрикцию вообще 0 - тормозит мгновенно (нахуя?) |
Lua:
max_particles = 100,
gravity = 0.1,
color = {1,1,1,1},
line_color = {1,1,1,0.3},
max_distance = 100,
boundary_behavior = "respawn",
infinite_life = false,
magnetism = "none",
magnetism_strength = 1000,
magnetism_radius = 150,
speed_range = { -1.0, 1.0 },
min_speed = 0.5,
max_speed = 5.0,
color_animation = "none",
line_color_animation = "none",
rainbow_speed = 0.005,
line_rainbow_speed = 0.005,
line_thickness = 1,
particle_size = 2,
wind = 0,
friction = 0.98,
size = imgui.ImVec2(500,500)
параметр | тип | описание | возможные значения | |
particles | table | список частиц в системе | ||
max_particles | number | максимальное количество частиц (СИЛЬНО ВЛИЯЕТ НА FPS, НЕ СТАВЬТЕ ОГРОМНЫЕ ЧИСЛА) | 1, 10, 100 (любое число) | |
size | ImVec2 | размер области отрисовки | {x, y} {500, 500} | |
settings | table | настройки системы частиц (выше) | ||
color_cycle | number | текущая позиция цикла смены цвета (используется в режиме "rainbow") | 0, 0.01, 0.05 (любое число) | |
line_color | table | цвет линии |
| |
line_thickness | number | толщина линии | 0, 0.1, 1, 10 (любое число, желательно от 0) |
функции
функция | входные параметры | возвращаемое значение | описание | |
Particles:new | settings (table) настройки системы частиц | объект системы частиц Particles | создаёт новую систему частиц с указанными настройками (есть настройки по умолчанию) | |
Particles:update |
| - | обновляет состояние всех частиц. принимает позицию курсора для работы magnetism (в режиме "cursor" или "both") | |
Particles:draw | draw_list (table) дравлист для отрисовки частиц (GetBackgroundDrawList или GetWindowDrawList) win_pos (table) позиция окна для корректного смещения частиц |
| отрисовывает все частицы и линии в кадре | |
Particle:new | x (number) начальная позиция x y (number) начальная позиция y vx (number) начальная скорость по x vy (number) начальная скорость по y life (number) время жизни частицы (при infinite_life = false) settings (table) настройки частицы унаследованные от системы частиц | объект частицы Particle | создаёт новую частицу | |
Particle:update | size (ImVec2) размер системы частиц для обработки границ отрисовки mouse_pos (ImVec2) позиция мыши для отработки magnetism particles (table) список частиц для magnetism в режиме "particles" и "both" | - | обновляет состояние частицы | |
Particle:respawn | size (ImVec2) размер системы частиц для обработки границ отрисовки |
| пересоздание частицы на рандомной позиции | |
Particle:draw | draw_list (table) дравлист для отрисовки частиц (GetBackgroundDrawList или GetWindowDrawList) win_pos (ImVec2) позиция окна для корректного смещения частиц color (number) цвет частицы size_override (number, optional) радиус частицы в обход настроек (хз нахуя, забыл пока делал) | - | отрисовка частицы |
Вложения
Последнее редактирование: