SerweryWłasny serwerDla twórcówForumFAQDokumentacjaBezpieczeństwo
Pobierz launcher
  1. Dokumentacja
  2. 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.

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) },
})
PoleCo robi
rate, maxcząsteczek na sekundę i najwięcej naraz (do 2000)
lifeczas życia w sekundach: liczba albo { min, max }
durationile sekund emiter wypuszcza cząsteczki (0 = bez końca)
shapeskąd startują: point, sphere, box, disc, ring, line
radius, boxpromień kształtu i połowy wymiarów pudełka { x, y, z }
offsetprzesunięcie emitera od podanego punktu { x, y, z }
velocity, spreadprędkość startowa w m/s i losowy dodatek na każdej osi
speedprędkość od środka emitera na zewnątrz { min, max } (ujemna = do środka)
gravity, wind, draggrawitacja w m/s², stały wiatr { x, y, z } i opór powietrza
turbulence, turbulenceScalesiła i drobność zawirowań
orbit, attractkrążenie wokół pionowej osi (rad/s) i przyciąganie do środka
size, sizeRandomwielkość w metrach (liczba albo { start, koniec }) i losowy rozrzut 0 do 1
spin, randomRotationobrót w rad/s { min, max } i losowy kąt startowy
stretchrozciąganie w kierunku lotu (iskry, deszcz)
colorskolory przez życie cząsteczki, rozłożone równo (tocolor)
palettewarianty koloru 0xRRGGBB, każda cząsteczka losuje jeden
fadeIn, fadeOutjaka część życia przypada na pojawianie się i gaśnięcie
sprite, texturewbudowany kształt albo własna tekstura z dxCreateTexture
blend"add" świeci (domyślne), "alpha" zwykłe krycie: dym, liście, konfetti
brightnessjasność 0 do 1
localcząsteczki jadą razem z emiterem zamiast zostawać w świecie
floorZ, bouncewysokość podłogi i odbicie od niej
maxDistancedalej od kamery emiter nic nie liczy (domyślnie 200 m)
burst, autoDestroyczą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.

Wbudowane kształty
Wbudowane kształtyOd lewej: 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ę.