Rozšířená grafika - hlavně skripty

S grafikou předmětů můžeme dělat hodně věcí. Se sprity v containerech objektů můžeme pomocí skriptů dělat další věci.

Úprava spritů, posun, rotace, velikost

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)               -- GetDX - Šířka políčka, - doleva, *2 - o 2 políčka
  tr:TranslateY(-GetDY()*1)               -- GetDY - Výška políčka
  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

Nejlepší je dávat v pořadí příkazů napřed rotace, pak velikost a nakonec posun
Tyto příkazy fungují jenom u samostatného spritu, u spritesetu musíme nahradit GrSprite 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í GetElement(číslo pořadí věci v containeru začínající od 0)
Případ grafika 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 InitAnim
  Container


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        -- InitAnim

A teď už skutečnou animaci:
GrContainer(objekt):GetElement(1):AsGrElContainer():GetElement(1):AsGrElSpriteSet():GetAnimator():ChangePeriod(200, GetTime())
ChangePeriod -- 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())

Vytvoření zrcadlového efektu


Aby hra poznala, že se jedná o zrcadlo, musí odpovídat grafika objektu tomuto:
Container
  Sprite - Graphics/Objects/x30/mirror2x2a.png -- podklad
  Sprite - Graphics/Objects/x30/mirror2x2b.png -- odraz
  Sprite - Graphics/Objects/x30/mirror2x2c.png -- povrch

Pokud chceme mít jinou grafiku objektu, ale aby se zrcadlila, MUSÍ to takto vypadat. Pomocí skriptů ale můžeme některý sprite skrýt a nechat jenom prostřední odrazovou část.
Tato funkce nám skryje podklad a povrch a rozšíří odrazovou část na předmět:

function CreateMirrorEfect(mirrorId) -- jméno funkce
  local tr = NewCGrTrScaling() -- zmenšení první části na 0
  tr:ScaleX(0)
  tr:ScaleY(0)
  GrContainer(mirrorId):GetElement(0):AddTransform(tr)
  tr = nil

  local tr = NewCGrTrScaling() -- zvětšení prostřední části na celý předmět
  tr:ScaleX(1.37)
  tr:ScaleY(1.19)
  GrContainer(mirrorId):GetElement(1):AddTransform(tr)
  tr = nil

  local tr = NewCGrTrScaling() -- zmenšení poslední části na 0
  tr:ScaleX(0)
  tr:ScaleY(0)
  GrContainer(mirrorId):GetElement(2):AddTransform(tr)
  tr = nil
end

Když chceme přidat další grafiku do zrcadla, musíme pro to vytvořit už vlastní objekt
X    -- takhle může vypadat stavba zrcadla
   X

   X -- a přesně obráceně stavba dalšího předmětu
X

Tyto dva předměty dáme do sebe a vznikce solidní objekt složený ze zrcadlové plochy a povrchu.

Další dobré funkce pro zrcadlo:

function RotateMirror(mirrorId, degrees) -- otočí zrcadlo
  local tr = NewCGrTrRotation()
  tr:RotateDeg(degrees)
  GrContainer(mirrorId):GetElement(1):AddTransform(tr)
  tr = nil
end

function ResizeMirror(mirrorId, sizeX, sizeY) -- změní velikost zrcadla
  if sizeY == nil then sizeY = sizeX end
  local tr = NewCGrTrScaling()
  tr:ScaleX(sizeX)
  tr:ScaleY(sizeY)
  GrContainer(mirrorId):GetElement(1):AddTransform(tr)
  tr = nil
end

function TranslateMirror(mirrorId, tranX, tranY) -- přesune odrazovou plochu zrcadla
  local tr = NewCGrTrTranslation()
  if tranX ~= nil then tr:TranslateX(GetDX()*tranX) end
  if tranY ~= nil then tr:TranslateY(GetDY()*tranY) end
  GrContainer(mirrorId):GetElement(1):AddTransform(tr)
  tr = nil
end

function FreezeMirror(mirrorId) -- zmrazí obraz v zrcadle
  GrContainer(mirror):GetElement(0):AsGrElSprite():ChangeSprite("Graphics/Objects/x30/mirror2x2b.png")
  GrContainer(mirror):GetElement(2):AsGrElSprite():ChangeSprite("Graphics/Objects/x30/mirror2x2b.png")
end

function UnfreezeMirror(mirrorId) -- odmrazí obraz v zrcadle
  GrContainer(mirror):GetElement(0):AsGrElSprite():ChangeSprite("Graphics/Objects/x30/mirror2x2a.png")
  GrContainer(mirror):GetElement(2):AsGrElSprite():ChangeSprite("Graphics/Objects/x30/mirror2x2c.png")
end

© 2008 Všechna práva vyhrazena.

Vytvořte si www stránky zdarma!Webnode