Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Software
Jak na Screen Saver - programování v Cocoa (3)
26. února 2002, 00.00 | Screen Saver (šetřič obrazovky) je velmi populární program, který by mohl zaujmout řadu čtenářů. Zároveň, z programátorského hlediska, se jedná o poměrně jednoduchý, přesto však zajímavý kousek software.
Screen Saver (šetřič obrazovky) je velmi populární program, který by mohl zaujmout řadu čtenářů. Zároveň, z programátorského hlediska, se jedná o poměrně jednoduchý, přesto však zajímavý kousek software. Pusťte si tedy ProjectBuilder (PB) a dáme se do toho. Výsledek bude vypadat asi takto.Project Builder
Vyberte "New project" a z následujícího okna vyberte položku "ScreenSaver". Stiskněte tlačítko "Next" a vyberte, kam se má projekt uložit. Do jména napište "MujMac ScreenSaver". Stiskněte tlačítko "Finish" a počkejte, než se vygeneruje projekt. Nyní uděláme v PB několik úprav.
1. Do panelu nástrojů (Toolbar) přidáme ikonku "Build and Run", abychom nemuseli neustále vybírat tuto položku z menu. Uděláme to standardním způsobem - stiskneme pravé tlačítko na panelu nástrojů, z menu vybereme "Customize Toolbar" a z následujícího okna přetáhneme ikonu tam, kde ji chceme mít.
2. Následně musíme nastavit projekt. Klikněte na záložku "Targets", vyberte "MujMac ScreenSaver" a ze čtyř záložek vyberte "Bundle Settings". V položce "Identifier" vyplňte již známé "cz.mujmac.screensaver", do "Signature" napište cokoliv, kde je kombinace velkých a malých písmen. Tato kombinace by se měla zaregistrovat u Apple, ale domnívám se, že pro naše účely to nemusíme dělat. Pokud chcete, vyplňte i další položky, jako jsou verze atd.
Nyní vyberte záložku "Executables" a přidejte pomocí tlačítka "Add..." program "System Preferences" ze složky "Aplications". To je šikovné na to, abychom mohli spouštět náš šetřič přímo z PB. Pro ty, kteří chtějí používat taky debugger, aby zjistili, co se v programu děje, je to nutná podmínka. Jako poslední krok se vraťte k záložce "Files & Build Phases" Klikněte na jednu z položek, třeba "Bundle Resources". Nyní z menu "Projekt" vyberte položku "New Copy Build Phase" . V menu "Where" nastavte "Absolute Path" a do volného pole napište kompletní cestu do Library/Screen Savers. Podívejte se na obrázek, jak to má vypadat. Do pole "Files" přetáhněte ikonku "MujMac ScreenSaver". Touto poměrně složitou oprací jsme zabezpečili to, že se po kompilaci vždy překopíruje aktuální verze programu na správné místo. Projekt se ukládá automaticky, takže můžeme rovnou jít k dalšímu kroku.
Program
Když se podíváte na to, co vygeneroval PB, zjistíte, že základní kostra programu je již hotová. Nás nejvíce zajímají dvě funkce. Ta první, je initWithFrame
, kde je řádek
[self setAnimationTimeInterval:1/30.0]
Tím se zapíná rychlost, kterou se volá druhá funkce, kterou je - (void)animateOneFrame
. Veškerý kód budeme psát právě v této funkci.
NSBezierPath *path;
NSRect rect;
NSSize size;
NSColor *color;
Na začátku funkce musíme nadeklarovat proměnné. Budeme kreslit křivky, takže použijeme NSBezierPath. Musíme vědět oblast (NSRect), velikost (NSSize) a barvu (NSColor).
size = [self bounds].size;
Tím získáme maximální velikost (rozlišení obrazu). Kreslení probíhá v rámci obdélníku, který je definován počátkem a šířkou a délkou.
rect.size = NSMakeSize( SSRandomFloatBetween( size.width/100, size.width/10 ),
SSRandomFloatBetween( size.height/100, size.height/10 ));
Zde se náhodně vypočítává velikost obdélníku. Používá se k tomu inline funkce nadefinovaná v ScreenSaverView.h, která se jmenuje SSRandomFloatBetween.
rect.origin = SSRandomPointForSizeWithinRect( rect.size, [self bounds] );
Ekvivalentní náhodný výpočet počátku.
while ((rect.size.width > 0) && (rect.size.height > 0))
Podmínka, která určuje počet obdélníků, ve kterých se bude kreslit náš objekt. Počet je omezen tím, že se na konci smyčky odečítá velikost. Ve chvíli, kdy se velikost dostane pod nulu, cyklus končí.
path = [NSBezierPath bezierPathWithOvalInRect:rect];
Zde se "vytvoří" ovál v rámci obdélníku.
color = [NSColor colorWithCalibratedRed:(SSRandomFloatBetween( 0.0, 255.0 ) / 255.0) green:(SSRandomFloatBetween( 0.0, 255.0 ) / 255.0) blue:(SSRandomFloatBetween( 0.0, 255.0 ) / 255.0) alpha:0.3];
Toto je velmi zajímavá funkce. Povšimněte si, že používáme "kalibrovanou barvu", tzn. barvu, která se přepočítává přes ColorSync a tudíž na všech monitorech vypadá stejně. No, není to v tomto případě důležité, ale je to takhle snadné... Položka alpha znamená průhlednost, zadává se stejně jako všechny ostatní údaje jako float v rozmezí 1-0.
[color set];
Nastav barvu.
[path fill];
Nakresli objekt, který jsme vytvořili v paměti.
rect.size.width = rect.size.width --;
rect.size.height = rect.size.height --;
Změň velikost o jedničku.
To je všechno. Teď stiskněte naší novou ikonu "Build and Run" a počkejte, až se program zkompiluje. První build dopadne s chybou, jedná se pravděpodobně o bug v PB. Ta kopírovací fáze, kterou jsme přidali do nastavení, totiž proběhne dřív, než se na správném místě zkompiluje program. Zmáčkněte ikonu znovu a teď už by vše mělo proběhnout správně. Automaticky se spustí předvolby, vyberte položku Screen Saver a v seznamu by měl být ten náš.
Pokud byste raději měli ty ovály soustředné, musíte závěr podmínky napsat takto:
rect.size.width = rect.size.width -2;
rect.size.height = rect.size.height -2;
rect.origin.x = rect.origin.x ++;
rect.origin.y = rect.origin.y ++;
Rozhodně by nás všechny zajímaly vaše další nápady, tak se s námi o ně podělte.
Obsah seriálu (více o seriálu):
- Začínáme programovat v Cocoa aneb v čem je MacOS X opravdu lepší než Windows
- Začínáme programovat v Cocoa (2)
- Jak na Screen Saver - programování v Cocoa (3)