Fish Fillets Ⅱ
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 představují barvu 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 kontrastnější.
Nejlepší je dávat v pořadí příkazů napřed rotaci, 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.
- Čas, kdy animace začne/začala, GetTime() zařídí animaci okamžitě.
Enums.at_linear (1) | Enums.at_sinus (2) |
---|---|
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(uhel) 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)