- Dokumentacja
- Cząsteczki
Katalog
Cząsteczki
Ruchome cząsteczki liczone w grze: 14 gotowych efektów, własne ustawienia, przyczepianie do pojazdów i graczy, efekty z serwera widoczne dla wszystkich.
Pierwszy emiter
Emiter to element "particle" tworzony po stronie klienta albo serwera. Wypuszcza cząsteczki, które lecą, obracają się, zmieniają kolor i wielkość, a na koniec gasną. Całą fizykę liczy gra, więc skrypt nie robi nic w każdej klatce. Najprościej zacząć od gotowego efektu:
local x, y, z = getElementPosition(localPlayer)
local ogien = createParticleEmitter(x + 2, y, z - 1, "fire")
-- po 10 sekundach gasi
setTimer(destroyElement, 10000, 1, ogien)
Emiter działa jak każdy element: setElementPosition, attachElements i destroyElement robią to, czego się spodziewasz. Zatrzymanie zasobu sprząta jego emitery.
Cząsteczki z serwera
Te same funkcje działają w skrypcie serwera. Emiter z serwera widzi każdy gracz, także ten, który wejdzie później, a cząsteczki liczy i rysuje gra każdego gracza u siebie. Ustawienia, gotowe efekty, setParticleEmitterSettings, setParticleEmitterEnabled i burstParticles działają tak samo jak u klienta i trafiają do wszystkich.
-- ognisko na środku placu, widoczne dla wszystkich
local ognisko = createParticleEmitter(2495, -1670, 12.5, "fire")
-- fajerwerk nad graczem, który wpisze /pokaz
addCommandHandler("pokaz", function(gracz)
local x, y, z = getElementPosition(gracz)
createParticleEffect(x, y, z + 25, "firework")
end)
Emiter z serwera słucha setElementDimension, setElementInterior i setElementVisibleTo: gracz w innym wymiarze albo wnętrzu nie widzi go i nic za niego nie liczy. attachElements na serwerze przypina emiter do pojazdu albo gracza u wszystkich. Pole texture podaje się jako ścieżkę do pliku klienta tego zasobu (<file> w meta.xml). Skrypt klienta może zmienić emiter serwera tylko u siebie, do następnej zmiany z serwera; getParticleCount działa tylko u klienta, bo każdy gracz ma własne cząsteczki.
Gotowe efekty
Nazwę gotowego efektu podajesz zamiast tabeli ustawień. Trzeci argument nadpisuje wybrane pola, reszta zostaje z gotowca: createParticleEmitter(x, y, z, "fire", { rate = 60 }). Lista z opisami: getParticlePresets, pełne ustawienia jednego: getParticlePresetSettings.

firePłomienie unoszące się z ogniska.
smokeGęsty dym, który rośnie i rozwiewa się.
sparksFontanna iskier spadających pod własnym ciężarem.
firefliesŚwietliki krążące leniwie w powietrzu.
snowŚnieg padający z 8 m nad punktem.
rainDeszcz smugami z 12 m nad punktem.
magicGwiazdki wirujące w górę wokół punktu.
vortexPortal: cząsteczki wciągane spiralnie do środka.
confettiKolorowe konfetti wystrzeliwane w górę.
heartsSerduszka unoszące się powoli.
bubblesBańki mydlane płynące w górę.
leavesLiście niesione wiatrem.
dustDrobinki kurzu w świetle.
fireworkJednorazowy wybuch fajerwerku, emiter sam znika.Efekt na chwilę
createParticleEffect tworzy emiter, który świeci przez podany czas i sam znika, gdy zgaśnie ostatnia cząsteczka. Nie trzeba go niszczyć. burstParticles wypuszcza od razu podaną liczbę cząsteczek z istniejącego emitera.
-- iskry w miejscu trafienia, przez pół sekundy
addEventHandler("onClientPlayerWeaponFire", localPlayer, function(weapon, hx, hy, hz)
createParticleEffect(hx, hy, hz, "sparks", 0.5, { rate = 300 })
end)
-- fajerwerk nad graczem: gotowiec sam się sprząta
local x, y, z = getElementPosition(localPlayer)
createParticleEffect(x, y, z + 25, "firework")
Przyczepianie
attachElements przypina emiter do pojazdu, gracza albo obiektu. Przesunięcie liczy się w układzie elementu (X w prawo, Y do przodu, Z w górę), więc dym z rury wydechowej zostaje przy rurze, gdy auto skręca.
local auto = getPedOccupiedVehicle(localPlayer)
local dym = createParticleEmitter(0, 0, 0, "smoke", { rate = 25, size = { 0.2, 1.4 }, life = { 1, 1.6 } })
attachElements(dym, auto, 0.45, -2.3, -0.35)
Własne ustawienia
Zamiast nazwy gotowca podajesz tabelę. Pola, których nie podasz, mają wartości domyślne. setParticleEmitterSettings zmienia wybrane pola działającego emitera, a żywe cząsteczki od razu dostają nowy kolor i wielkość.
local portal = createParticleEmitter(x, y, z, {
sprite = "glow", shape = "ring", radius = 2,
rate = 120, max = 300, life = { 1, 1.6 },
velocity = { 0, 0, 0 }, orbit = 3, attract = 0.6,
size = { 0.25, 0.05 },
colors = { tocolor(120, 200, 255), tocolor(160, 90, 255, 0) },
})
| Pole | Co robi |
|---|---|
rate, max | cząsteczek na sekundę i najwięcej naraz (do 2000) |
life | czas życia w sekundach: liczba albo { min, max } |
duration | ile sekund emiter wypuszcza cząsteczki (0 = bez końca) |
shape | skąd startują: point, sphere, box, disc, ring, line |
radius, box | promień kształtu i połowy wymiarów pudełka { x, y, z } |
offset | przesunięcie emitera od podanego punktu { x, y, z } |
velocity, spread | prędkość startowa w m/s i losowy dodatek na każdej osi |
speed | prędkość od środka emitera na zewnątrz { min, max } (ujemna = do środka) |
gravity, wind, drag | grawitacja w m/s², stały wiatr { x, y, z } i opór powietrza |
turbulence, turbulenceScale | siła i drobność zawirowań |
orbit, attract | krążenie wokół pionowej osi (rad/s) i przyciąganie do środka |
size, sizeRandom | wielkość w metrach (liczba albo { start, koniec }) i losowy rozrzut 0 do 1 |
spin, randomRotation | obrót w rad/s { min, max } i losowy kąt startowy |
stretch | rozciąganie w kierunku lotu (iskry, deszcz) |
colors | kolory przez życie cząsteczki, rozłożone równo (tocolor) |
palette | warianty koloru 0xRRGGBB, każda cząsteczka losuje jeden |
fadeIn, fadeOut | jaka część życia przypada na pojawianie się i gaśnięcie |
sprite, texture | wbudowany kształt albo własna tekstura z dxCreateTexture |
blend | "add" świeci (domyślne), "alpha" zwykłe krycie: dym, liście, konfetti |
brightness | jasność 0 do 1 |
local | cząsteczki jadą razem z emiterem zamiast zostawać w świecie |
floorZ, bounce | wysokość podłogi i odbicie od niej |
maxDistance | dalej od kamery emiter nic nie liczy (domyślnie 200 m) |
burst, autoDestroy | cząsteczki wypuszczone od razu po utworzeniu i samoczynne zniknięcie po ostatniej |
Kształty cząsteczek
Pole sprite wybiera jeden z wbudowanych kształtów. Pełną listę daje getParticleSprites.

glow, spark, smoke, flame, circle, square, ring, bubble, drop, star, flake, heart, leaf.Kształty są białe, kolor nadają colors i palette. Własny obraz podasz w polu texture (tekstura albo ścieżka do pliku PNG z zasobu).
Wydajność
Cząsteczki liczy gra w jednym przebiegu dla wszystkich emiterów, a rysuje je razem z resztą świata. Emiter dalej niż maxDistance od kamery stoi i nic nie kosztuje. Przy wielu emiterach naraz lepiej trzymać max w setkach niż w tysiącach: getParticleCount pokaże, ile cząsteczek żyje naprawdę.