Hlavní navigace

Knihovna ClanLib

10. 5. 2004
Doba čtení: 5 minut

Sdílet

Pokud jste někdy stáli před úkolem napsat v C++ program s grafickým rozhraním, rychlou 2D a 3D grafikou, s hudbou a třeba i se síťovou podporou, jakým bývají například hry, zjistili jste možná, že je to úkol nelehký. Pokud k vašim požadavkům patřila i multiplatformovost, mohla vám situace připadat skoro beznadějná, jako připadala i mně, než jsem objevil open source knihovnu ClanLib, kterou bych vám v tomto úvodním článku rád představil.

Proč právě ClanLib?

Aby bylo možné na tuto otázku odpovědět a provést nějaká srovnání, ujasněme si přesněji, co naše výše uvedené požadavky znamenají.

Začněme od konce s multiplatfor­movostí. Řekněme, že přinejmenším potřebujeme, aby náš program šel přeložit a běžel stejně dobře na Unixu i na Windows. (Ostatními systémy se nebudu zabývat, jelikož s nimi nemám zkušenosti. Nutno však podotknout, že některé mohou být podporovány stejně dobře.) Tento požadavek vyřazuje ze hry všechny DirectDraw a jim podobné prostředky pod Windows. Podobně například program napsaný přímo pro XWindow System nepůjde lehce přenést na Windows.

V úvahu tedy, z mně známých, připadají knihovny jako SDL, Glut, Allegro, Qt, OpenGL. Všechny jsou pokud vím volně dostupné a platformově nezávislé, avšak žádná z nich neřeší příliš elegantně náš problém.

Glut je rozumné řešení, pokud nepotřebujeme GUI a víceméně vše, o co nám jde, je usnadnit si práci s OpenGL.

Allegro bohužel příliš neznám, ale mluví se o něm obvykle v souvislosti s 2D hrami.

Qt se zdá být dobrou volbou, pokud nám jde zejména o tvorbu GUI, ale pokud vím poněkud pokulhává s rychlostí.

Nejvíce se z mého pohledu tomu, co potřebujeme, přibližuje knihovna SDL, která je velice rychlá na 2D grafiku, podporuje OpenGL, podporuje i odchytávání událostí a práci se sítí. Nevýhodou však je, že je dosti nízkoúrovňová a sama o sobě nepodporuje tvorbu GUI, tj. tlačítka a spol. Navíc je psaná ve stylu C, nikoliv C++, což je pro rozsáhlé projekty hůře zvladatelné a nakonec to většinou vede k tomu, že první, co člověk udělá, je, že si napíše nad SDL nějakou vyšší vrstvu, což může dopadnout různě… Podobný pokus myslím stál i u zrodu ClanLibu.

Pojďme se tedy podrobněji podívat, co nám tato knihovna vlastně nabízí.

V současné době běží na systémech Linux (X11 a OpenGL), Windows 98, Windows 2000 a WindowsXP, připravuje se port na MacOS.

Podporované kompilátory jsou GCC, VC++ 6.0, VC++ 7.0, Borland a MingW.

Primárně je určena k vývoji her. To s sebou nese výbornou podporu 2D grafiky postavenou na skvělém, neustále se rozvíjejícím sprite enginu a vychytávkách, jako je detekce kolizí. Práce v 3D je postavena na OpenGL a ClanLib použití této knihovny velice usnadňuje například už tím, že k vytvoření OpenGL okna nám stačí několik málo příkazů, nikoliv desítky řádků, a to samozřejmě není vše.

Podporovanými grafickými formáty jsou png, tga, jpg, pcx.

Odchytávání událostí je postaveno na signálech, což skýtá nemalé výhody oproti globální frontě, kterou nabízí třeba SDL. Signál si můžeme představit jako zprávu, kterou vyšleme a ona bude doručena všude tam, kde ji chceme. To velice usnadňuje práci zejména při tvorbě GUI a práci s klávesnicí a myší, ale nejen to, jelikož ClanLib vysílá signály víceméně všude, kde se to může hodit. Příkladem může být třeba animace respektive sprite, který vyšle signál, pokud přehrál svůj poslední snímek.

V současné době je přímo součástí knihovny tzv. stříbrný styl GUI, tj. sada tlačítek, listboxů, progresbarů a jim podobných, sladěných do poměrně hezkého vzhledu. Ten je sám o sobě v mnoha případech dostačující, uvážíme-li, že v rámci tohoto stylu se dá velice lehce vytvořit například tlačítko dle vašich představ jen tak, že můžete nastavit různé vzhledy pro různé stavy (jako např. stisknuto) v podobě obrázků, které si nakreslíte někde v grafickém editoru. Krom toho však ClanLib poskytuje poměrně silné prostředky pro tvorbu vlastních stylů. Jelikož odděluje funkčnost GUI od jeho vzhledu, může se programátor resp. grafik soustředit pouze na to podstatné a vytvořit si styly GUI zcela dle vlastních představ.

Dalším velmi užitečným rysem této knihovny, který jistě stojí za zmínku, je způsob, jakým řeší přístup k resources (zdrojům) našeho programu. Pokud používáme spousty obrázků, zvuků, fontů nebo různých konfiguračních údajů, které sice výrazně ovlivňují konečný vzhled našeho programu, ale přímo nesouvisejí s jeho funkčností, nebývá dobré, aby tyto byly zahrnuty přímo ve zdrojovém kódu. Jednak pro to, že by to nebylo příliš přehledné, jednak proto, že asi nebudeme chtít program znovu překládat pokaždé, když změníme jméno nějakého obrázku nebo když se rozhodneme, že nějaká konstanta nebude 9, ale 10. ClanLib naštěstí přichází s tzv. resource definition files (soubory pro definici zdrojů). Tyto soubory se píší ve formátu XML, který je přehledný a lehký na naučení. Knihovna samozřejmě sama podporuje čtení takových souborů a maximálně zjednodušuje konstrukci vlastních objektů přímo ze souborů zdrojů.

ClanLib samozřejmě podporuje přehrávání hudby uložené ve formátu wav, což však naštěstí není vše vzhledem k velikosti takových hudebních souborů. Dalšími formáty, které jsme schopni přehrávat, jsou Vorbis (.ogg) a MikMod (.XM), které již myslím naše potřeby uspokojí dostatečně.

Velmi slušná je i podpora fontů, uvážíme-li, že můžeme využívat systémové fonty i fonty definované např. obrázkem ve formátu tga, kde jsou jednotlivé znaky odděleny průhlednou složkou.

Pro práci se sítí máme k dispozici několik vrstev od nejnižších socketů až po třídy, které již dokáží chytře řešit komunikaci mezi serverem a klienty.

Jaké jsou nevýhody?

Jak již je asi patrné, jsem poměrně velkým příznivcem této knihovny, a mé hodnocení tedy může být dosti subjektivní. To budete moci posoudit sami, pokud ClanLib vyzkoušíte. Každopádně by zde bylo na místě zmínit se i o problémech, s nimiž se možná v takovém případě budete muset poprat.

První nevýhodou, na niž možná někteří narazí, je to, že zřejmě neexistuje žádná česká dokumentace a dokonce i anglická dokumentace zatím není zdaleka úplná. To je dáno zejména tím, že knihovna se neustále vyvíjí a rozvíjí. To znamená, že v podstatě každý den je ke stažení nová verze. Naštěstí, alespoň dle mých vlastních zkušeností, se interface v podstatných částech téměř nemění, maximálně bývá rozšiřován. V současnosti se pracuje na verzi 0.7.8. Optimistický pohled je, že do verze 1.0.0 se nejspíš dočkáme ještě mnohých zlepšení a rozšíření.

Další nevýhodou může být ne zcela triviální instalace. Pod Windows nejspíše zjistíte, že kromě připravených ExternalLibs se neobejdete například bez Platform SDK a DirectX SDK, které je možné stáhnou od Microsoftu. Pod Unixem zase není úplně jednoduché nastavit například Kdevelop, aby ClanLib dokázaly správně používat, ale i to se dá.

Tento výčet schopností a vlastností samozřejmě zdaleka není kompletní, ale myslím, že by měl být dostatečný, abyste si vytvořili představu, kdy se vám tato knihovna může hodit.

root_podpora

Když si dáte tu trochu práce a prokoušete se přes úvodní problémy, odměnou vám bude velice silný a dobře použitelný pomocník pro tvorbu vašich programů. S tím vším se vám navíc budu navíc snažit pomoci následujícími články, již podrobně se zabývajícími vlastní knihovnou ClanLib, které se, jak doufám, budou v následujících týdnech objevovat na ROOT.CZ.

Příště se tedy můžete těšit na podrobný návod k instalaci pod Linuxem a pod Windows, vytvoříme také doufám první aplikaci.

Byl pro vás článek přínosný?