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:

  1. 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.
  2. Má se animace opakovat? Užitečné se stylem at_sinus.
  3. Rychlost v milisekundách.
  4. Startovní pozice X.
  5. Konečná pozice X.
  6. Startovní pozice Y.
  7. Konečná pozice Y.
  8. Čas, kdy animace začne/začala, GetTime() zařídí animaci okamžitě.
Enums.at_linear (1)Enums.at_sinus (2)
Pro správné zobrazení animace v prohlížeči 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(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)