Manipulace s grafikou
S grafikou předmětů můžeme dělat pomocí skriptů hodně věcí. Se sprity v containerech objektů můžeme pomocí skriptů dělat další věci.
Posun
Máme objekt, jehož grafiku chceme posunout třeba o 2 políčka doleva a 1 políčko nahoru, uděláme to takto:
local tr = NewCGrTrTranslation() --Připravení posunu grafiky tr:TranslateX(GetDX()*-2) --Posun po ose X, o -2 políčka doprava (2 políčka doleva) tr:TranslateY(GetDY()*-1) --Posun po ose Y, o -1 políčko dolu (1 políčko nahoru) GrSprite(objekt):AddTransform(tr) --Přiřadíme to na grafiku tr = nil --Připravení hned vymažeme, nebo to může dělat později problémy
Změna velikosti
Chceme grafiku objektu zmenšit na polovinu
local tr = NewCGrTrScaling() --Připravení změny velikosti tr:ScaleX(0.5) --Polovina 1 tr:ScaleY(0.5) --Polovina 1 GrSprite(objekt):AddTransform(tr) tr = nil
Rotace
Chceme grafiku objektu otočit o 5° po směru hodinových ručiček
local tr = NewCGrTrRotation() --Připravení rotace
tr:RotateDeg(-5)
GrSprite(objekt):AddTransform(tr)
tr = nil
Barevná transformace
Tato transformace nebyla nikde v originální kampani použita, od ostatních se hodně liší a dost těžko se popisuje. Příklad ukazuje zbarvení objektu do červené.
local tr = NewCGrTrColorMultiply() --Připravení transformace tr:SetColor(1,0,0,1) --První 3 údaje je barva ve formátu RGB, 4. údaj je průhlednost GrSprite(objekt):AddTransform(tr) tr = nil
Parametry funkce SetColor jsou převážně od 0 do 1, nad 1 je barva víc kontrastnější.
Nejlepší je dávat v pořadí příkazů napřed rotace, pak velikost a nakonec posun. Barva pořadí nijak neovlivňuje.
Tyto příkazy fungují jenom u samostatného Spritu, u Spritesetu (animace) musíme použít GrSpriteSet a u Containeru GrContainer.
Vnořené elementy
Pokud máme v grafice objektu více věcí v Containeru, musíme je odlišit pomocí funkce GetElement(číslo pořadí věci v containeru začínající od 0).
Příklad grafiky objektu:
Container Sprite - Graphics/Objects/x30/amplion3x2.png Container Sprite - Graphics/Objects/x30/boombox5x3.png Sprite set - Graphics/Objects/x30/balls2 --tento Spriteset chceme animovat --podobně jako funkce InitAnim GrContainer(objekt):GetElement(1):AsGrElContainer():GetElement(1): AsGrElSpriteSet():SetAnimation(true, 0, GetTime()) GrContainer(objekt) --hlavní Container objektu GetElement(1) --druhý element v Containeru AsGrElContainer() --vnořený Container GetElement(1) --druhý element ve vnořeném Containeru AsGrElSpriteSet() --vnořený Spriteset SetAnimation --jako funkce InitAnim --A teď už skutečnou animaci: GrContainer(objekt):GetElement(1):AsGrElContainer():GetElement(1): AsGrElSpriteSet():GetAnimator():ChangePeriod(200, GetTime()) GetAnimator():ChangePeriod --jako funkce PlayAnim
Pro vnořené elementy nemůžeme používat GrContainer nebo GrSprite a podobně, ale:
AsGrElSprite() --pro vnořený Sprite (jinak GrSprite) AsGrElSpriteSet() --pro vnořený Spriteset (jinak GrSpriteSet) AsGrElContainer() --pro vnořený Container (jinak GrContainer)
Změna spritu
V Spritu (AsGrElSprite() nebo GrSprite()) se dělá pomocí ChangeSprite("cesta ke spritu") V Spritesetu AnimSSSet("cesta k animaci", 100, true, 100, Room():GetTime())
Animovaná transformace
Posun:
local tr = NewCGrTrTranslation() tr:SetTranslationAnim(Enums.at_linear, false, 50, 0, 5 * GetDX(), 0, 5 * GetDY(), GetTime()) GrSprite(objekt):AddTransform(tr) tr = nil
Toto už je trochu složitější, proto parametry rozepíšu:
- Styl animace, může být Enums.at_linear (1) nebo Enums.at_sinus (2). 1 je posun tam a 2 je tam a zpět.
- Má se animace opakovat? Užitečné se stylem at_sinus.
- Rychlost v milisekundách.
- Startovní pozice X.
- Konečná pozice X.
- Startovní pozice Y.
- Konečná pozice Y.
- Asi zpoždění, GetTime() zařídí animaci okamžitě.
Pro správné zobrazení animace je potřeba podpora APNG!
Stejně tak to je i pro změnu velikosti nebo rotaci:
tr:SetScalingAnim(style, cycle, speed, startX, stopX, startY, stopY, GetTime()) tr:SetRotationAnim(style, cycle, speed, math.rad(start), math.rad(stop), GetTime())
math.rad zařídí převod ze stupňů na radiány, ve kterých se rotace počítá.
Pro zbarvení objektu je potřeba použít dvě metody, jedna nastaví rychlost a styl a druhá barvy.
tr:SetColMultAnim(style, cycle, speed, GetTime()) tr:SetColMultAnimRange(r1, g1, b1, a1, r2, g2, b2, a2)