Autor Zpráva
embee
Profil
Zdravim,
tak me napadlo, kolik z vas tu vlastne dela v as3? Ma pocit, ze 90% dotazu tady se tyka as2 a ten zbytek otresneho hybridu as1/2 pripojovaneho na objekty na scene.

Osobne vim snad jen o XXX, ktery uz ty s nami moc nepobyva...

Pri te prilezitosti mam libustkovy dotaz - ohledne disaply object listu. Vcera jsem testoval nejake skripty, a prisel jsem na zajimavou vec. Model flashe s as3 by mel vypadat:

stage <- main timeline <- objekty

tudiz parent main timeline by mela byt stage. Stage by mela byt pouze jedna jedina, nicmene.... kdyz jsem pridal listenery na udalosti zmeny velikosti okna a do handleru jsem dal

trace(stage.stageWidth);
trace(this.parent.width);

dostaval jsem do vystupu dve ruzna nezavisla cisla.... jedno se pri zmensovani sceny zmensovalo, druhe zustavalo kosntantni. What the hell? Dalsi paradox:

trace(this.parent) //output object Stage
var bla:Stage = this.parent //error - implicitni prepis objektu display object containeru na nesuvisejici typ Stage

jak je to mozne? Podle flashe je nejdriv this.parent objekt Stage a zahy je to display object container? Ono by se to sice nemelo vylucovat, ale evidentne ano, protoze this.parent nemuzu nacpat do promenne s datovym typem Stage. Z teto perspektivy to vypada tak, ze model je

Stage <- neco <- main timeline <- objekty

Uprimne receno me to dost mate. Taky nechapu, proc v dokumentaci k falshi o tomhle temer nic neni. Vcera jsem se kvuli tomu drbal 5 hodin s centrovanym pozicovanim flashe abych pak prisel na to, ze to vyresi velice intuitivni krok, a to zarovnani stage na TOP_LEFT.... chapete - centrovana stranka ma zarovnani TOP_LEFT, to proste nedava smysl :D

No snad mi nekdo odpovi.

embee
mila
Profil
Parentem main timeline je skutečně stage. Otestovat to můžeš snadno: trace(parent == stage)

To že dostáváš dvě různé hodnoty je protože stage.width není totéž jako stage.stageWidth - první je velikost obsahu, druhé velikost okna. Obsah (MovieClipy) nemusí vyplnit celou stage a naopak mohou její velikost přesáhnout.

To že ti to vyhazuje "error - implicitni prepis objektu display object containeru na nesuvisejici typ Stage" je správné chování, nejde o to co v proměné je, ale co tam může být. Ta chyba vypadne už při compilování. Podobně by ti vyhodilo chybu např: bla:MovieClip = getChildAt(1) - sice to MovieClip možná je, ale nikde nemáš zaručeno, že to nebude třeba TextField. Stejně jako aktuálním parentem je stage, ale příště to někdo vlepí někam jinam.

Když chceš stage, tak použij proměnou stage. Pokud chceš parenta tak jako typ použij DisplayObjectContainer (neboli typ který to vrací dle manuálu). Jinak to lze přetypovat (bla:Stage = this.parent AS Stage), ale nebude to tak přenosné, protože to pak nemůžeš použít jako komponentu v něčem větším.

Co se týče centrování, buď to nech na flashi (stage.align, stage.saleMode), nebo nastav TOP_LEFT, NO_SCALE a počítej si to sám. Pokud se to dělá na dvou místech, výsledek se "sečtě" a nefuguje to.
embee
Profil
mila
problem prave vznikl v okamziku, kdy jsem neresil stage align (tam zadny CENTER neexistuje, proto jsem mel za to, ze je to defaultni hodnota, ale nevypadalo to tak)a misto toho jsem predpokladal, ze stageWidth je opravdu realna a jedina sirka stage. Tudiz jsem ze stageWidth pocital stred viditelne sceny a upravoval jsem vzhledem k tomu pozice objektu na stagi. Jenomze prave this.parent.width vraci hodnotu celkove velikosti stage a ne jen te viditelne casti, tudiz se mi sice x prepsalo, jenomze se vztahovalo k celkove velikosti a ne k te viditelne. Takze centrovani neprobehlo a to ani v pripade, kdyz jsem zkousel objekt pripojit primo na stage (stage.addChild).

Co se tyce toho display object containeru.... nechapu proste to, ze na jednom radku mi flash vrati datatyp this.parent jako Stage a na druhem radku mi tvrdi, ze this.parent Stage neni. Pretypovat to muzu, ale nechapu tuhle logiku.
mila
Profil
Centrování je defaultní hodnota, alespoň u mě. Použije se také, pokud je nastavená hodnota neplatná, což je způsob, jak centrování nastavit (možná existuje elegantnější způsob, neměl jsem důvod ho hledat).
Pokud si ji neměnil a jak píšeš upravoval pozice objektů, tak se právě mohlo stát, že se sečetlo tvoje centrování s tím defaultním a výsledek je pak těžké odhadnout.

stage.width != stage.stageWidth a tedy ani parent.width != stage.stageWidth
Jestli vidíš rozdíl mezi těma dvěma hodnotama, tak by neměl být problém si vzít tu co potřebuješ.

K tomu přetypování: Nejde o to, co parent je, ale co by mohl být. Když se podíváš do manuálu, tak parent je obecně DisplayObjectContainer. V tvém konkrétním případě je to možná Stage, ale když třídu použiješ jinde, může být parent něco úplně jiného. Flash ten typ kontroluje ještě než se vůbec pustí a nemůže tedy vědět, co tam bude.
Třeba Flex Builder tě na to upozorní už při psaní, kdy nemůže vůbec tušit, jak třídu použiješ. Tenhle přístup umožňuje odhalit spoustu chyb, než vůbec nastanou.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: