Create IT Blog - odborné

 

 

Informační architektura - struktura a organizace informací v digitálním světěhttps://create-it.cz/Blog/Stranky/informacni_architektura.aspxInformační architektura - struktura a organizace informací v digitálním světě<p> <em>​​​​​Trápíte se občas nad tím, že nedokážete na Internetu něco rychle najít? Ať už se jedná o zboží v e-shopu, tlačítko pro připojení přílohy ve Datové schránce nebo nákup lístku na online seminář. Na stránkách, kde hledáte dlouho nebo dokonce nenacházíte potřebné údaje, roste vaše nespokojenost a mění se ve frustraci. Na vině je většinou špatná informační architektura. Co je to informační architektura (IA) a proč je důležité její výstavbu nepodcenit? Jak ji navrhnout, aby uspokojila potřeby cílové skupiny? </em><br></p><p>Informační architektura se zabývá organizací, strukturou a navigací informací, aby byly snadno dostupné, srozumitelné a užitečné pro uživatele. Správné uspořádání informací je základním prvkem úspěšného fungování webových stránek, softwarových aplikací a dalších informačních systémů. </p><p>Jak tedy navrhnout IA, která má předpoklady být dobrým poskytovatelem informací? Při návrhu IA se prolínají tří základní perspektivy. Zohlednění všech dílčích oblastí je klíčem k návrhu kvalitní IA. A naopak, potlačení kterékoliv z nich negativně ovlivní výslednou kvalitu. <br></p><p> <img src="/Blog/PublishingImages/Stranky/informacni-architekura/architektura1.svg" data-themekey="#" alt="" style="width:100%;margin-top:20px;" />  </p><h2>Kontext</h2><p>Každé naše konání se děje s určitým účelem a v nějakém prostředí. Stejně tak i IA , systému, aplikace či ​webových stránek, vzniká v určitém kontextu. Před tvorbou IA tedy musím mít zřejmou odpověď na otázku jaký je účel IA s ohledem na obchodní cíle. Co mi přinese a proč ji potřebuji? Další rovinu kontextu představuje umístění IA v interakci s okolním světem. Jak k ní budou přistupovat uživatelé? Kontext můžeme vnímat zjednodušeně vnímat jako odpověď na otázku „proč a kde“ bude vznikat IA.​<br></p><h2>Uživatel</h2><p>Obchodní cíle jsou realizovány interakcí s okolím – s uživateli. Tato oblast představuje druhou perspektivu. Kdo jsou cíloví uživatelé? Jaké jsou jejich potřeby a hlavní motivace? To jsou základní otázky, jejichž odpovědi musíme umět zformulovat. V této rovině pracujeme se skupinami uživatelů a hlavně jejich mentálními modely.​<br></p><h2>Obsah</h2><p>Poslední perspektivu představuje obsah, tedy všechna data, která pomocí IA organizujeme. Obsah je silně ovlivněn uživatelem. Musíme znát odpovědět na otázku, jaký obsah je pro uživatele relevantní? Kolik informací jsou uživatelé schopni zpracovat najednou? Správná IA má poskytovat přiměřené množství informací, které uspokojí co největší procento cílové skupiny. Myslet si, že čím více informací poskytneme, tím větší skupinu příjemců obsloužíme, není většinou pravda. Zároveň musí být správně navržená IA flexibilní a škálovatelná. Žijeme v dynamické době a je třeba mít na paměti budoucí vývoj a s ním předpokládané změny. </p><h2>Tvorba IA jako proces</h2><p>Mít na paměti všechny tři perspektivy nemusí být vždy jednoduché. Tady je stručná kuchařka, kterou můžete použít, abyste při tvorbě IA na nic nezapomněli.</p><p>1. <strong>Poznejte kontext.</strong> Důvody a cíle IA je potřeba mít pořád na paměti. Porozumění zadání, motivace a celkového kontextu je první důležitý krok. Pokud zadání nemáte jasně definované, shrňte jej stručně sami a nechejte si ho odsouhlasit vlastníky projektu. K popsaným cílům je nutné se v procesu navrhování IA vracet. Jen tak máte jistotu, že se neodchýlíte od požadovaného stavu a splníte zadání. </p><p>2. <strong>Definujte cílové skupiny uživatelů.</strong> Jaké jsou potřeby a motivace? V jakém kontextu uživatelé hledají informace? Existují 4 obecné důvody návštěvy: </p><blockquote style="margin:0px 0px 0px 40px;border:medium;padding:0px;"><p>• Uživatel ví, co hledá. Dokáže popsat cíl svého vyhledávání a má určitou představu, jak jej najít. Cesta k cíli by měla být rychlá a jednoduchá.</p><p>• Uživatel ví přesně, co hledá, ale nemůže si vzpomenout na název, detaily. Dokáže si ovšem vzpomenout, kde zhruba informaci našel.</p><p>• Uživatel má matnou představu, co potřebuje vědět. Někdy to dokáže vyjádřit, jindy ne.</p><p>• Uživatel neví přesně, co hledá. Nehledá nic specifického, má jen obecný cíl.      </p></blockquote><p>Ideální IA dokáže pokrýt všechny důvody. Nezapomeňte ale na to, že všem nikdy nevyhovíte. Přestože jsou určité vzorce chování, i tady platí „sto lidí, sto názorů“. Důležité by mělo být rychle a kvalitně obsloužit skupinu, která nám pomůže dosáhnout obchodních cílů. Ta nemusí být nutně tou nejrozsáhlejší.</p><p>3. <strong>Seznamte se s obsahem.</strong> Počítejte s tím, že tato fáze vám může zabrat hodně času. Ať už je to kvůli rozsahu nebo neznalosti zpracovávaného tématu. V této fázi je žádoucí posuzovat obsah s ohledem na definované cílové skupiny a jejich potřeby. Pokud děláte revizi IA, je dobré se ptát – uspokojí tato informace potřeby primární cílové skupiny? Pokud ne, pryč s ní. Hygiena obsahu je většinou pracná a bolestivá, protože autor zpravidla nerad vyhazuje něco, co vytvořil a dal si s tím práci. Je na vás jej dobrými argumenty dovést k názoru, že tohle je správná cesta. </p><p>4. <strong>Udělejte rešerši. </strong>Je vysoce pravděpodobné, že v digitálním světě existuje stejné nebo velmi obdobné řešení tomu, kterého chcete namodelovat. Zjistit, jak fungují podobná řešení vám pomůže lépe předvídat uživatelské znalosti a zkušenosti dané oblasti, které se budou snažit podvědomě aplikovat při používání vašeho řešení. Hovoříme o poznání tzv. uživatelského mentálního modelu.</p><p>Nejjednodušší srozumitelná definice <a href="https://www.nngroup.com/articles/mental-models" target="_blank">mentálního modelu</a> je podle Nielsen Norman Group „Mentální model je to, co si uživatel myslí o daném systému." Jinými slovy, mentální modely jsou předpoklady založené na dosavadních zkušenostech poznávání reálného světa, které lidé nosí v hlavě před interakcí s webovou stránkou nebo aplikací. Všichni podvědomě tušíme, že kontaktní informace nalezneme v sekci O nás nebo Kontakt a nebudeme očekávat její umístění mezi deskriptivními informacemi produktu nebo uprostřed novinového článku. Tuto myšlenku zformuloval do jednoho ze základních UX zákonů průkopník této oblasti <a href="https://www.nngroup.com/people/jakob-nielsen/" target="_blank">Jakob Nielsen.</a></p>​<hr /> ​ <h2>Jakobův zákon (Jakob’s law)</h2><p> <i> Jakobův zákon o uživatelském zážitku na internetu říká, že uživatelé tráví většinu času na jiných webových stránkách než na vašich. To znamená, že uživatelé dávají přednost tomu, aby váš web fungoval stejně jako všechny ostatní weby, které již znají.</i>​​<br></p>​<br><hr /><br> <div><p>Nepodcenit rešerši a inspirovat se podobnými řešeními je zpravidla lepší než přehnaná kreativita a snaha o originalitu. Lidé nechtějí přemýšlet a rozhodovat se více, než je nutné.</p><p>5. <strong>Roztřiďte obsah.</strong> V tomto kroku musíte vymyslet koncept taxonomie a struktury. Taxonomie je systém kategorizace a klasifikace informací, struktura je o definování vzájemných vztahů mezi jednotlivými částmi systému. Klíčové je mít koncept. Např. webové stránky nabízející robustní softwarové řešení mají několik možností, jaké pojetí pro uspořádání obsahu zvolit. Jako uživatele vás může v první řadě zajímat, jaké má produkt funkce. Nebo hledáte informace o produktu podle odvětví, tedy hledáte identifikaci s cílovou skupinou. Anebo si říkáte, proč zrovna tenhle produkt, jaké má benefity, přednosti atd. Svět je pestrobarevný a komplexní, neexistuje jen jeden správný koncept. Vracejte se k rešerši a inspirujte se jimi.</p><p>Jakmile se rozhodnete pro jednu hlavní myšlenku, můžete definovat primární úrovně hierarchie informací, tj. hlavní kategorie, do kterých budete třídit obsah. Pro tento krok můžete použít metodu Třídění karet (card sorting). Jednotlivá témata rozřazujete do hlavních kategorií nebo jejich podskupin, které vám intuitivně dávají smysl. Nesnažte se vytvářet zbytečně mnoho kategorií a úrovní. Čím méně, tím lépe. Při třídění obsahu využijte aplikací, které vám umožní vytvořit snadno myšlenkovou mapu nebo jinak vizualizujete uspořádání obsahu. Programů pro bezplatné použití je dneska celá řada; Figma, Miro, Lucidspark, MindMaster aj.</p><p>Jakmile máte vytvořenou hierarchii, udělejte si průběžný test. Využít můžete tzv. Stromové testování (tree testing). Je to v podstatě inverzní metoda ke třídění karet. Snažíte se nalézt konkrétní informaci v dané struktuře. Cílem tohoto testování je odpověď na otázku „Najdou uživatelé to, co hledají?“</p><p>V tomto kroku pamatujte také na to, že je nutné držet konzistentní jazyk – tón, jazykový rytmus, jednotné názvosloví a soudržnost informací. To všechno silně ovlivňuje uživatelský prožitek. Pojmenovávejte kategorie jasně, srozumitelně a jednoduše.</p><p>6. <strong>Navrhněte wireframe.</strong> Wireframe je grafické zobrazení upořádání klíčových prvků navigace jako jsou menu, drobečková navigace, odkazy, vyhledávání a další prvky sloužící k procházení obsahu. Tvorba wireframů je o logice fungování systému/stránek. Díky nim získáváte vizualizovaný pohled na rozložení prvků usnadňujících orientaci a hledání informací. Navíc vám jejich vytvoření dovolí simulovat další uživatelské testování; identifikovat potenciální problémy a řešit úpravy dříve, než se bude řešit grafický design nebo bude systém v provozu. V neposlední řadě je potřeba myslet i na to, na jakých zařízeních bude naše řešení realizováno a v případě nutnosti navrhnout wireframe pro všechna požadovaná zařízení (desktop, mobil, tablet). Výsledkem tohoto kroku by měla být jednoduchá, konzistentní a intuitivní navigace napříč všemi kontexty použití.</p><p>7. <strong>Aplikujte design.</strong> Sebelépe navržená IA neobstojí, pokud její obsah není dobře prezentován. Cílem této fáze je vytvořit esteticky příjemné a konzistentní uživatelské rozhraní, které umocní pozitivní uživatelský prožitek. K tomu slouží designový jazyk. Jedná se o soubor pravidel, vzorů a prvků vizuálního designu, ke kterým patří barevná paleta, typografie, ikony, vzory, mřížka atd.  Správné použití designu může uživateli pomoci rychle identifikovat důležité informace, usnadnit orientaci na stránce anebo podpořit sdělení, která jsou ze strategického hlediska vhodné uživateli komunikovat. </p><p>8. <strong>Sestavte prototyp.</strong> Když máte jasno o tom, jak budou informace uspořádány, máte rozmyšlenou navigaci a navrhnutý design, je čas vytvořit prototyp, který simuluje vzhled a chování budoucího produktu. Propojením několika navrhovaných obrazovek vytvoříte maketu řešení, které prezentujete zadavateli a zároveň skvělý nástroj pro otestování budoucího produktu. Rozsah prototypu se odvíjí od očekávání a potřeb zainteresovaných stran. Může sloužit pro potřeby testování IA i jako zadání pro vývojáře. Záleží tedy na okolnostech, jak moc velkou část aplikace budete prototypovat. Pro otestování navigace a jednoduchost pohybu v aplikace zpravidla stačí jen malá část. </p><p>9. <strong>Testujte.</strong> Existuje celá řada technik a postupů, jak testovat informační architekturu. Je potřeba otestovat navigaci, zkontrolovat jednotnost použité taxonomie, konzistentnost designového jazyka, interakci systému, responzivitu řešení atd. Testování použitelnosti (usability testing) je objemná kapitola z oblasti Testování.</p><p>To nejjednodušší testování, které byste ale měli v této fázi sami realizovat, vychází z uživatelských potřeb. Definujte tři základní scénáře použití, které uživatel v aplikaci bude provádět, a ty, které z obchodního hlediska považujete za klíčové. Jak rychle dokážete uspokojit tyto potřeby? Je navigace dostatečně intuitivní? Jsou informace vizuálně dobře rozpoznatelné? Nezapomeňte, že u vás hrozí provozní slepota. Jakožto tvůrci IA víte, kam jste co zařadili. Požádejte kohokoliv blízkého, aby vám věnoval deset minut. Nechejte jej splnit dané úkoly a vy jen přihlížejte. Toto testování nepotřebuje velký rozpočet a výsledky zjištění mohou mít velký dopad na finální řešení.</p><h2>Závěr</h2><p>Níže nakreslené schéma shrnuje základní kroky, které směřují k cíli. V popsaném procesu je cílem funkční prototyp, který splňuje zadání. Někdy proces končí roztříděním obsahu, protože zadáním je dodat jen strukturu IA bez navigace. V tomto případě přeskočíte kroky návrh wireframe, design a prototypování, ale rozhodně nevynechejte fázi testování. </p><div><p> <br> </p><p></p><center><img src="/Blog/PublishingImages/Stranky/informacni-architekura/architektura2.svg" data-themekey="#" alt="" style="width:80%;margin-top:20px;" /></center> <p></p><p> <br> </p><p>Schéma ukazuje, že pokud zapojíte do tvorby IA i fázi testování, budete některé kroky opakovat a ladit. Dokud výsledek neprojde uspokojivě základním testováním, nepředkládejte jej klientovi, ani jej neposouvejte dále v rámci projektu do realizace. Když testování do tvorby IA nezapojíte, na chyby stejně přijdete. Jen to bude o něco později a s většími dopady; vyšší náklady, nespokojenost uživatelů, ztráta reputace atd. A hlavně, než posunete řešení dál, měli byste si být jistí, že znáte odpověď na otázku „Splnil jsem zadání definované na začátku tvorby IA?“</p><p>Závěrem si připomeňme, že ve všech krocích byste měli mít stále na paměti tři základní dimenze: kontext, uživatel, obsah. Využijte osvědčených standardů a buďte kreativní, ale konzistentní, v designovém jazyku.​</p><p>​<br></p><p> <span style="color:#000000;font-family:calibri, sans-serif;font-size:15.3333px;"> <em>Vendula Vytisková</em></span><em></em><br></p><p> ​<br> </p></div></div>odborné;#
Jak úspěšně zavést DevOpshttps://create-it.cz/Blog/Stranky/zavedeni-devops.aspxJak úspěšně zavést DevOps<p>​V předchozím článku <a href="/Blog/Stranky/devops-digi-transformace.aspx" target="_blank">„Role DevOps v digitální trans­for­ma­ci“​</a>, jsme se zabývali podstatou a výhodami přístupu DevOps. Jeho zavedení v organizaci pomáhá s urychlením i zvýšením efektivity procesu nasazení a celkovým vylep­še­ním spolehlivosti nasazení nových softwarových produktů pomocí agilního vývojového procesu. Dnes se podíváme na možná úskalí spojená se zavedením DevOps procesů do struktury organizace a jak těmto problémům čelit. Základním účelem přechodu k metodě DevOps je totiž dlouhodobé nastavení celého procesu tak, aby nevznikaly vícenáklady spojené s plánováním, organizací a realizací.​<br></p><h2>Strategický plán je klíčem</h2><p>Na počátku každé úspěšné změny stojí zejména kvalitní a promyšlený strategický plán. Je tedy potřeba si určit jeho podobu i obsah, stejně jako stanovit realizační tým. Strategický plán je pak úzce provázán s projektovým plánováním. Projektové plánování představuje jeden z klíčových kroků pro úspěšné zavedení DevOps do organizace.<br></p><p>Nejdříve je potřeba si definovat očekávaný výsledek. Pokud například chceme začít s menší mikroservisní aplikací, můžeme na první službě skvěle odladit celý proces od odevzdání kódu, přes automatické testy, nasazení až po monitorování životních funkcí a upozornění na případné chyby.<br></p><p>V okamžiku, kdy je celý proces detailně popsán, je důležité stanovit si časovou náročnost celé aktivity, termín odevzdání finální podoby i postup přidávání dalších aplikací. Takový způsob plánování pomáhá nacházet opakující se vzorce v nasazování i testování a umožňuje tak vytvářet určité šablony. Některé z těchto šablon je pak možné pomocí různých nástrojů použít opakovaně k automatizaci.​<br></p><h2>Kdo je kdo? Bez jasně definovaných rolí v týmu to nepůjde…</h2><p>Důležitou součástí plánu je také popis jednotlivých rolí v týmu. V každé implementaci takových procesů by se měl nacházet alespoň jeden člověk skutečně znalý dané aplikace, tedy zástupce vývojářů. Stejně tak by se měl účastnit jeho protějšek ze strany operativců, kteří udržují aplikaci při životě v produkčním prostředí, popřípadě se starají o její monitorování. V neposlední řadě by měl být součástí týmu i někdo, kdo je zodpovědný za infrastrukturu, aby celý proces probíhal bez problémů a neprodlužoval se čas doručení při čekání na různé technické účty a prostupy. Pro úspěšné fungování všeho výše popsaného je potřeba mít domluvenou i podporu u managementu organizace. Možná se tato poznámka může zdát jako nadbytečná, ale praxe opakovaně ukazuje opak. S postupy a fungováním DevOps týmu totiž musí být velice dobře seznámeno i vedení firmy a musí tomuto týmu poskytovat svou součinnost a podporu.​<br></p><h2>DevOps kultura krok za krokem</h2><p>Jak vlastně vzniká DevOps kultura v organizaci? Je potřeba ji prostě a jednoduše vytvořit na základě několika faktorů. Těmi jsou čas, typ projektu, velikost organizace, velikost týmu a samozřejmě i rozpočet. Zde se opět vracíme k důležitosti a roli managementu organizace a jeho úloze v zavádění kultury DevOps. V samotném úvodu snah o zavedení postupů DevOps je totiž nejdůležitější probrat s managementem, jaký přínos bude mít tato aktivita pro koncové uživatele, vývojové a podpůrné týmy, nebo pro firemní kulturu a v neposlední řadě pro výsledky celého týmu. Uspořádání technických i personálních záležitostí totiž pochopitelně následuje až s podporou managementu, který je přesvědčen, že dělá správnou věc. Zcela nezbytné je probrat také finanční a časové zázemí pro implementaci procesů, aby nově vzniklý DevOps tým měl opravdu prostor v klidu efektivně pracovat.<br></p><p>Před zapojením vzniklého týmu je samozřejmě potřeba zajistit důkladné školení na DevOps metodiku, nebo si najmout specialistu, který s takovou aktivitou může pomoci. Jedná se o komplexní proces a je možné, že na některé chyby při implementaci by se mohlo přijít zbytečně pozdě. Od nově vzniklého týmu se naopak očekává schopnost učit se novým věcem a nevracet se do starých zaběhnutých kolejí.​<br></p><h2>Komunikace jako základ úspěchu</h2><p>Ač se to může zdát jako banalita, je potřeba nepodceňovat kvalitní nástroje pro komunikaci. Nově vzniklý DevOps tým musí mít možnost efektivně komunikovat jak uvnitř, tak i s ostatními články celé organizace. Mezi efektivní nástroje rozhodně nepatří e-mail, který se používá spíše pro formální komunikaci. Naopak výborným nástrojem pro týmovou komunikaci jsou například Slack, MS Teams nebo Discord, které pak dokáže využít DevOps tým pro automatické sdílení chyb a komplikací v procesu s ostatními členy organizace. V poslední době je možné využít i implementované chatboty, které jsou schopny v rámci komunikačního nástroje zjistit stav, kde se jejich nasazení nachází, v jakém stavu jsou například backendy napříč testovacími prostředími a podobně.​<br></p><h2>Automatizace aneb „Samoseto“</h2><p>Matematika využívá symbol nekonečna ve spojení s nekončícími procesy a ani v DevOps není tento symbol náhodou, protože cokoliv se opakuje vícekrát než jednou, je potřeba zautomatizovat a tím dostat i mezi nekončící procesy. Kde všude se dá proces automatizace aplikovat? Začněme třeba od infrastruktury.<br></p><p>Pomocí Terraform šablon jsme schopni říci kolik a kde potřebujeme výpočetního výkonu, které všechny komponenty potřebujeme k chodu a podle jakých pravidel se má naše infrastruktura rozšířit nebo zmenšit. Celý tento proces se dá navíc také automatizovat. Operátor tak už nemusí používat příkazy, ale infrastruktura se po aplikaci změny v dokumentu upraví sama. Pro takové úpravy je možné využít nástroje jako GitLab nebo Azure DevOps. Možností je v současnosti samozřejmě ještě mnohem více.<br></p><p>Stejný postup lze využít na nasazení monitorovacích nástrojů, dokumentace nebo jakékoliv jiné komponenty z DevOps palety. Zní to velice jednoduše, má to ale i svá úskalí na která je potřeba si dát pozor. Veškerá automatizace vyžaduje údržbu, aby byla odolná pro všechny nadcházející aktualizace. Pro odolnou automatizaci je dobré opět využít šablony, a proto čím více podobné jsou si aplikace s programovacím jazykem, který byl použit, tím menší zdroje jsou potřeba na rozšiřování šablon, ale i na nutnou údržbu.​<br></p><h2>Dvakrát měř, jednou řež</h2><p>Bez dobře nastavených metrik jsme v podstatě „slepí“ a na základě domněnek je těžké cokoliv udržovat, sledovat případně vylepšovat. Pro takové aktivity existují komplexní nástroje jako je Datadog, Dynatrace nebo Splunk. Tyto nástroje dokážou s pomocí operátorů v infrastruktuře poměrně jednoduše načíst celou aplikaci, logy i její zázemí. Ovšem pouze pokud jsou do aplikace volně puštěny. V některých organizacích jako jsou třeba banky, to bohužel není možné, v jiných organizacích je to naopak žádané, protože přinášejí dokonalý přehled o všem, co se děje, na jednom místě.</p><p>Pokud neexistuje možnost využít tyto samostatné nástroje a je nutné nástroj více přizpůsobit potřebám organizace, nabízí se pak např. ELK stack i s možností připojení Grafany.​<br></p><h2>SRE</h2><p>Sebelepší nástroj však potřebuje zkušeného specialistu, který ho bude používat. V tomto případě se jedná o pozici zvanou SRE (Site Reliability Engineer). Tato role kombinuje prvky softwarového inženýrství a provozu IT infrastruktury. Člověk v této pozici je zodpovědný za zajištění spolehlivosti, škálovatelnosti a dostupnosti systémů a služeb pro uživatele.<br></p><p>Site Reliability Engineer se zaměřuje na řešení problémů spojených s výkonem, stabilitou a škálovatelností systémů. Jeho hlavním cílem je minimalizovat výpadky a zajistit, aby systémy byly vždy dostupné a efektivní. Součástí role je také řízení incidentů.​<br></p><h2>Závěrem</h2><p>Po přečtení těchto řádků si možná řeknete: „Dobře, tak teď půjdu, naplánuju si zavedení DevOps, domluvím se s vedením, vezmu Frantu z vývoje a Vaška z operations, napíšeme pár skriptů a pipeline, něco zmonitorujeme a máme to - jsme DevOps organizace!“<br></p><p>Bylo by to samozřejmě dobré zjištění, ale DevOps je velice komplexní proces, který přece jen nelze takto jednoduše obsáhnout. Aby bylo zavedení přístupu DevOps do organizace funkční, každá ze součástí nezávisle na velikosti organizace vyžaduje pečlivý a zodpovědný přístup, protože celý procesní řetěz je jen tak silný jako jeho nejslabší článek. Nicméně nezoufejte. Pokud máte vizi a dostatek odhodlání, půjde to!<br></p><p><em>Vojtěch Kijenský</em></p><p><em>Zdroj: SystemOnLine 07/2023​</em></p><p><br></p>odborné;#
Role DevOps v digitální transformacihttps://create-it.cz/Blog/Stranky/devops-digi-transformace.aspxRole DevOps v digitální transformaci<p>​​Tak jako ve většině technologic­kých odvětví se i ve vývoji soft­waru na zakázku stále zvyšuje tlak na jeho rychlost a flexibilitu. V tradičních přístupech, jako je například Waterfall, to však vět­šinou není možné. Technologické společnosti tak objevují nové agilní přístupy, které umožňují zrychlení vývoje a nasazování projektů. Jedním ze základních stavebních kamenů agilního přístupu k vývoji softwaru je využití metody DevOps. Ty umožňují společnostem velmi rychle reagovat na měnící se požadavky klientů v průběhu vývoje i provozu aplikací.<br></p><p>Průzkum z roku 2019 vytvořený společností <a href="https://www.puppet.com/resources/history-of-devops-reports" target="_blank">Puppet</a> ukázal, že použití metody DevOps umožnil technologickým společnostem zrychlení doručování změnových požadavků a vydávání nových verzí softwaru až o 63 %.<br></p><p>Klíčem ke zlepšení výkonnosti, kvality služeb a zároveň i zvýšení zisku je pro IT firmy pochopení a průchod tzv. digitální transformací. Jedině tak je možné udržet krok, přizpůsobovat se novým trendům a zůstat konkurenceschopným. Ne vždy se to však podaří.<br></p><p>I když podle průzkumu společnosti <a href="https://www.statista.com/statistics/870924/worldwide-digital-transformation-market-size/" target="_blank">Statista</a> se očekává, že do roku 2024 bude na digitální transformaci vynaloženo neuvěřitelných 2.4 miliard USD, jen 30 % z těchto implementací je nakonec úspěšných. V čem dělá tolik firem chybu? Velmi často je to podceněním samotné transformace, neznalostí všech důležitých rolí a chybějící kvalifiko­va­né autority, které jsou v této cestě digitální transformace nezbytné.<br></p><p>V tomto článku bychom se rádi věnovali základním aspektům digitální transformace z pohledu metody DevOps, které přímo stojí a jsou zodpovědné za oblasti jako je automatizace, zvyšování kvality a bezpečnosti softwaru a v neposlední řadě snižování nákladů.<br></p><h2>Co je vlastně DevOps?<br></h2><p>DevOps bývá často označením pro pracovní pozici, nebo proces nasazení. Pravdou je, že je to celý soubor pravidel, metod, postupů a technologií určených k urychlení a optimalizaci vývoje softwaru. Často využívá automatizaci, cloudové služby, virtualizaci a kontejnerizaci k dosažení rychlého, spolehlivého a předvídatelného nasazení nových verzí softwarových produktů pomocí agilního vývojového procesu.<br></p><p>Samotný název DevOps vznikl spojením dvou anglických slov „Development“ a „Operations“, tedy vývoj a nasazení softwaru. O ty se v tradičním vývojovém procesu starají různé týmy. V procesu DevOps jsou tyto úkoly spojeny do jednoho celku a vykonává je tak stejný tým. DevOps zavádí a popisuje důležité automatizace, které při tvorbě projektu ve starších přístupech zabíraly příliš mnoho času. Mezi tyto automatizace patří integrace projektu (continuous integration) a nasazení projektu (continuous delivery). To umožňuje po každém vývojovém cyklu automaticky sestavit projekt a otesto­vat tak, zda je práce jednotlivých vývojářů funkční ve společném celku, a to bez zásahu člověka. Nasazování nových verzí projektu je obvykle velmi zdlouhavá činnost. Při použití tohoto přístupu však tato potřeba odpadá a nasazení provádí automaticky počítač.​<br></p><h2>Co je digitální transformace?</h2><p>Digitální transformace je komplexní a rozsáhlý proces, při kterém se buď digitálně upravují stávající podnikové procesy, nebo se dokonce vytvářejí nové, aby efektivně vyhovovaly měnícím se požadavkům podnikání a trhu. Digitální transformace tedy vyžaduje výrazné přepracování procesů tak, aby se staly digitálními, a přepracování zákaznické zkušenosti tak, aby odpovídala digitálnímu prostředí. Jinými slovy, digitální transformace využívá digitální technologie a data k vytváření zisku, efektivizaci podnikání, nahrazení nebo transformaci podnikových procesů, kompetencí, modelů řízení a výroby (nikoliv pouze k jejich digitalizaci) a k vytvoření prostředí pro digitální obchod a spolupráci.<br></p><p>Digitální transformaci v podnikání je třeba chápat jako nikdy nekončící proces. Na této cestě budou podniky vždy muset reagovat na změny v prostředí, přehodnocovat svůj status quo a měnit své transformační aktivity.​<br></p><h2>Jak DevOps zapadá do digitální transformace?</h2><p>Vybudování kultury DevOps ve firmě není jednorázová záležitost. Jedná se o trvalý a nikdy nekončící proces. Nejde jen o sérii technologických kroků, které musí organizace, týmy a samotní programátoři splnit, ale jde o změnu organizace projektu a především o změnu myšlení zaměstnanců a vedení.<br></p><p>V tradičním procesu vydávání softwaru jeden tým (vývojový) píše, testuje a sestavuje kód izolovaně. Poté ho předá druhému (provoznímu) k nasazení a vydání. Tento proces však může vést k pomalejšímu vydávání a tím i ke zhoršení zákaznické zkušenosti. DevOps zásadně omezuje právě problémy spojené s tradičním procesem vydávání softwaru. Technologické firmy tak mohou vydávat produkty v řádu hodin nebo dnů místo týdnů nebo měsíců.<br></p><p>Digitální transformace zlepšuje podnikové procesy prostřednictvím technologických vylepšení. Vytváří také nové a vylepšené procesy, které jsou řízeny technologiemi. DevOps propojuje procesy vývoje softwaru a provozní procesy. Díky této synergii může DevOps pomoci organizaci na její cestě k digitální transformaci. Níže se podíváme na čtyři klíčové body, jak jsou procesy DevOps užitečné při digitální transformaci.​<br></p><h2>1. Automatizace</h2><p>Automatizace je důležitým aspektem digitální transformace, protože pomáhá zrychlit procesy, omezit manuální činnosti, odhalovat chyby a zvýšit efektivitu. Díky DevOps mohou organizace automatizovat různé fáze vývoje a dodávání softwaru, včetně sestavování a nasazování, testování a správy infrastruktury. Automatizace minimalizuje čas potřebný k vývoji, testování a vydání softwaru, což vede k rychlejšímu uvedení na trh a častějšímu vydávání nových verzí. DevOps navíc umožňuje automatizovat monitorování a údržbu aplikací a infrastruktury. To pomáhá organizacím rychle identifikovat a řešit problémy a zajistit vysokou dostupnost aplikací.<br></p><p>DevOps navíc umožňuje automatizovat kontrolu bezpečnostních hrozeb, čímž snižuje riziko narušení bezpečnosti a zajišťuje, že aplikace splňují regulatorní požadavky. To pomáhá organizacím splnit požadavky neustále se měnícího podnikatelského prostředí a udržet si náskok před konkurencí.​<br></p><h2>2. Snížení nákladů</h2><p>Kontrola nákladů je klíčovou součástí každé organizace. V digitální éře je však obzvláště důležitá, protože při práci s novými technologiemi a různorodými týmy je snadné ztratit přehled o výdajích. Pokud se vyskytnou problémy s některou částí systému, budete o nich okamžitě vědět, takže je můžete rychle odstranit a zabránit dalším škodám.<br></p><p>DevOps šetří organizacím náklady omezením manuálních procesů, zvýšením efektivity a optimalizací využívání zdrojů. Zefektivněním procesů vývoje, testování a nasazení snižuje DevOps riziko chyb, přepracování a výpadků.​<br></p><h2>3. Zvyšování kvality softwaru</h2><p>V prostředí DevOps vývojové a provozní týmy úzce spolupracují, což vede k celkově efektivnější komunikaci. Výsledkem je efektivnější proces vývoje softwaru, který snižuje riziko chyb a zajišťuje, že aplikace splňují požadované standardy kvality. V rámci DevOps jsou zavedeny postupy průběžného testování, integrace a dodávání (CI/CD), které zajišťují důkladné otestování a ověření aplikací před jejich vydáním. Je tak možné zachytit a vyřešit problémy v rané fázi vývoje, snižovat riziko chyb a zajistit vysokou kvalitu aplikací.<br></p><p>DevOps také pomáhá zavést mechanismy průběžného monitorování a zpětné vazby, které poskytují přehled o výkonu aplikací a infrastruk­tu­ry v reálném čase. Organizace tak mohou rychle identifikovat a řešit problémy, zlepšovat kvalitu aplikací a zvyšovat uživatelskou zkušenost. DevOps navíc podporuje používání nástrojů pro automatizaci a orchestraci, které vývojářským firmám pomáhají standardizovat a zefektivnit proces nasazení. Výsledkem je méně manuálních chyb a kratší doba nasazení aplikací, což vede i ke zlepšení kontroly kvality.<br></p><h2>4. Využití nových technologií​<br></h2><p>Ještě před několika lety byly mnohé technologické společnosti v oblasti IT a softwaru spíše konzervativní a jakékoliv změna nebo adopce nových technologií byla velmi náročná, v posledních pěti letech dochází k přesnému opaku. Oblast IT zažívá revoluci směrem do cloudových služeb, která těmto společnostem umožňuje využít služby PaaS a SaaS a která byla do této doby mimo jejich finanční a časové možnosti.<br></p><p>Za zmínku stojí přes 250 spravovaných služeb (managed services) v AWS, Azure, nebo GCP dostupných během pár minut na „jedno kliknutí“. Na vzestupu je i strojové učení, kde jsou k dispozici neuronové sítě, speciálně upravené pracovní stanice nebo přizpůsobená datová skladiště.<br></p><p>Většina aplikací nově nekončí na serveru jako proces, ale izolovaně v kontejnerech orchestrovaných v Kubernetes/Openshiftu, a stále častěji, pokud to má aplikační smysl, i serverless (AWS Lambda/Azure Functions/Google Cloud Functions).<br></p><p>Při vytváření nových aplikačních a infrastrukturních návrhů je autor prakticky limitovaný jen znalostí a možností těchto poskytovatelů a vlastní fantazií. (Kterou krotí snad jen hranice definovaného rozpočtu a korporátních pravidel.)<br></p><p>Poměrně nová a čím dál rozšířenější technologie používaná v DevOps je možnost deklarativního přístupu k doručení software, kdy se již nestaráme o to, jak doručit, ale popisujeme pouze, jak to má v pro­stře­dí vypadat. Specializovaný software pak zajistí, že se při jakéko­liv, i nechtěné, změně prostředí samo opraví do funkčního stavu.​<br></p><p>Během doručování softwaru, ale i při jeho běhu v prostředí máme k dispozici pokročilé nástroje diagnostiky a detekce chyb, které jsou také již napojené na strojové učení a umožňují nejen odchytit, ale i predikovat potenciální hrozby. Na základě znalosti běhu aplikací jsou detekovány a reportovány anomálie i nestandardní chování uživatelů, což vede ke zvýšení bezpečnosti. V neposlední řadě lze tyto technologie využít i k automatizovanému vytvoření dokumentace prostředí.</p><h2>Závěr<br></h2><p>Digitální transformace je kompletní přeměna podnikání, která vyžaduje více než jen aktualizaci IT systému nebo vytvoření několika aplikací. V rychlém světě, ve kterém se dnes nacházíme, potřebují organizace prostě rychle a efektivně inovovat. Aby této změny bylo dosahováno, je třeba změnit představu o fungování firmy jako takové. Nejlepším způsobem, jak zahájit digitální transformaci společnosti, je iniciovat kulturu DevOps. Úspěšná digitální transformace zahrnuje změnu systému práce, která následně povede ke zvýšení efektivity a úspoře času i financí.​<br></p><p><em>Vojtěch Kijenský</em></p><p><em>Zdroj: SystemOnLine 06/2023</em></p><p><em><br></em></p>odborné;#
Monitorování podnikových procesů pomocí chytrých hodinek?https://create-it.cz/Blog/Stranky/monitorovani-podnikovych-procesu.aspxMonitorování podnikových procesů pomocí chytrých hodinek?<p>​​​​​Podle <em>Minnesota Reformer</em> investovaly dvě velké americké společnosti z oblasti zpracování masa, Tyson Foods a JBS, do aplikace pro chytré hodinky, která jim v reálném čase umožňuje monitorovat průběh procesů ve výrobě. <br></p><p>Tato technologie má za cíl nejen zvýšit produktivitu firmy, ale také bezpečnost zaměstnanců. V masném průmyslu jsou velmi vysoká rizika úrazů. Opakující se, rychlá a namáhavá práce činí z masokombinátů jedny z nejnebezpečnějších pracovišť. Americké ministerstvo práce v posledních letech provádělo opakovaná vyšetřování bezpečnostních incidentů v tomto odvětví. <br></p><p>Aplikace je kompatibilní s hodinkami Samsung Watch 4, které během pracovní směny nepřetržitě sbírají data z výrobního procesu pomocí svých senzorů – konkrétně sílu, rotaci, rychlost a směr pohybu ruky pracovníka. Tato data jsou poté interpretována softwarem s prvky umělé inteligence, která určuje, zda jsou pohyby bezpečné, a upozorní pracovníky, pokud překračují bezpečnostní limity v síle nebo rychlosti. Získaná data převádí na metriky zobrazované na „dashboardu.“ Ten obsahuje nejen bezpečnostní metriky, ale také aktivní skóre produktivity.​<br></p><h2>Jaké výhody z toho pro firmu plynou?</h2><p>Používání chytrých hodinek jako nástroje pro monitorování procesů ve výrobě může přinést firmám množství výhod.</p><p>Klíčovou z nich je <strong>zvýšení produktivity výroby</strong>. Díky sledování pohybu a výkonu prováděných aktivit je možné identifikovat méně produktivní pracovní postupy a navrhnout opatření pro zvýšení výkonu jednotlivých aktivit. </p><p>Další výhodou používání chytrých hodinek je <strong>zvýšení bezpečnosti zaměstnanců</strong>. Senzory chytrých hodinek mohou predikovat potenciální bezpečnostní rizika na pracovišti. Hodinky jsou vybaveny technologií RTLS (real-time location system), takže si v případě potřeby může pracovník snadno přivolat asistenci či pomoc.</p><p>Software také může z dat o aktuálním průběhu jednotlivých aktivit ve výrobním procesu, poskytovat pracovníkům okamžitou zpětnou vazbu, díky které si mohou výrazně usnadnit <strong>práci </strong>nebo <strong>zlepšit</strong> svůj <strong>výkon</strong>.</p><p>Používání chytrých hodinek v průběhu aktivity umožňuje také snadno sbírat anonymní data o pohybu po areálu firmy, která mohou být dále analyzována a použita pro <strong>optimalizaci pracovních postupů a využití zdrojů</strong>. Tyto informace firmám přináší <strong>snížení nákladů a zvýšení ziskovosti</strong>, pracovníkům pak další <strong>usnadnění</strong> jejich <strong>práce</strong>. Optimalizace pracovních postupů z hlediska jejich ergonomie navíc pomáhá <strong>předcházet </strong> <strong>dlouhodobým zdravotním potížím</strong>.</p><p>V neposlední řadě mohou chytré hodinky také pomoci zaměstnavatelům <strong>zlepšit komunikaci se zaměstnanci</strong>. Díky technologii HMI (Human Machine Interface) mohou zaměstnanci lépe interagovat s různými systémy a stroji v reálném čase a snadno se přizpůsobit různým pracovním úkolům. </p><p>Celkově může využití chytrých hodinek pomoci společnostem optimalizovat pracovní postupy, snížit prostoje, a tím zvýšit produktivitu výrobního procesu a bezpečnost pracovníků. Z marketingového hlediska to může být silný prodejní argument pro společnosti, které se snaží zlepšit své hospodářské výsledky a odlišit se na přeplněném trhu. A zpětná vazba ze strany odborů ukázala (přes počáteční obavy), že pracovníci vnímají tuto inovaci jako skutečný přínos pro svou práci.</p><h2>Ochrana soukromí pracovníků</h2><p>Obavy zaměstnanců ohledně soukromí jsou důležitou věcí, která musí být zohledněna při zavedení jakéhokoli nového monitorovacího systému v pracovním prostředí. Realizací podobných řešení využívajících chytré hodinky se v Cleverlance také zabýváme. Zeptali jsme se proto <strong>Mikuláše Müllera</strong>, který vede jednotku <a href="https://www.cleverlance.com/cz/CleverIndustry/">CleverIndustry</a>, dodávající systémy pro digitalizaci průmyslu a logistiky, jak tento problém řešíme v Cleverlance:<br></p><p> <em>„V případě aplikace pro chytré hodinky, která monitoruje aktivity ve výrobním procesu, je důležité zdůraznit, že respektujeme GDPR a zajišťujeme bezpečné zpracování osobních údajů. Všechna data jsou šifrována a uchovávána na zabezpečených serverech, kde jsou přístupné pouze autorizovaným osobám.</em></p><p> <em>Každý zaměstnanec používá pokaždé jiné hodinky. Před každou směnou si je náhodně a anonymně vybere „z police,“ takže nelze přesně určit, jaký konkrétní zaměstnanec se nachází nebo nacházel na kterém místě v určitý okamžik. To by mělo zaměstnancům dodat pocit bezpečí a zaručuje jim to, že jejich soukromí není ohroženo.</em></p><p> <em>Je také důležité vysvětlit zaměstnancům všechny aspekty fungování tohoto systému, a přesvědčit je o tom, že jim chytré hodinky pomohou usnadnit jejich práci a neohrozí jejich práva a soukromí“</em> zdůrazňuje Mikuláš Müller.​</p><p> <em style="text-align:justify;orphans:2;widows:2;text-decoration-style:initial;text-decoration-color:initial;">K​ateryna Sakovska​</em><span style="text-align:justify;">​</span>​<br></p><p>​<br></p>odborné;#
Digitalizace kontejnerových vozíků pomocí IoT čidel – řešení pro logistické problémy v době nárůstu elektronického obchoduhttps://create-it.cz/Blog/Stranky/digitalizace_voziku.aspxDigitalizace kontejnerových vozíků pomocí IoT čidel – řešení pro logistické problémy v době nárůstu elektronického obchodu<p>​​S růstem objemu elektronického obchodu a změnami v chování spotřebitelů je efektivní doručování zásilek obtížnější než kdykoli předtím. V důsledku neefektivity logistických procesů má mnoho přepravců problémy pokrýt stále rostoucí počet zásilek. Nedostatečný přehled o využití a umístění kontejnerových vozíků způsobuje zbytečné komplikace a neefektivitu v jejich optimálním využití. Intenzita dopravy a náklady kvůli nevyužité kapacitě přepravního prostoru rostou, negativně působí na životní prostředí, a navíc se termíny na doručení zásilky prodlužují. A nespokojení zákazníci se pak hlasitě domáhají svých nedoručených zásilek!<br></p><p>Všechny tyto problém je možné řešit sledováním kontejnerových vozíků pomocí technologie Bluetooth. Dobrým příkladem je nizozemská pošta, která nedávno oznámila digitalizaci 250.000 přepravních rolovacích klecí pomocí čidel od společnosti <a href="https://kontakt.io/" target="_blank">Kontakt.io​</a>. Pošta doručuje přibližně 1,1 milionu balíčků a 8,1 milionu dopisů napříč celým Beneluxem denně! V roce 2020, během koronavirové pandemie doručila rekordní počet 337 milionů zásilek, což bylo téměř o 20 % více než v roce 2019.</p><p>Technologie, kterou nizozemská pošta pro digitalizaci svého logistického procesu a sledování rolovacích klecí naložených zásilkami zvolila, jí přinesla mnoho výhod – které jsou však využitelné i v řadě dalších odvětví.​<br></p><h2>Přehled o využití kontejnerových vozíků</h2><p>Jejich sledování pomocí IoT čidel umožňuje nizozemské poště získat lepší přehled o tom, jak jsou využívány. Čidla poskytují informace o tom, kdo vozíky právě používá, jak často je využívá, a kolik jich je momentálně k dispozici. Díky přesnému monitoringu dokáže pošta identifikovat nevyužité či prázdné vozíky a minimalizovat tak náklady v celém dodavatelském řetězci.​<br></p><h2>Optimalizace </h2><p>Detailním sledováním pomocí bluetooth čidel může pošta rozmístit vozíky tak, aby byly využívány co nejefektivněji. Ukázalo se, že zatímco v některých expedičních depech jsou vozíky z části nevyužívané, jinde dokázali přidáním dalších vozíků výrazně zvýšit efektivitu přepravy.​<br></p><h2>Odhalení úzkých míst a problémů v logistickém řetězci</h2><p>Pokud je nedostatek vozíků na jednom místě, nebo se někde hromadí zásilky, může to znamenat, že pošta nebude zásilky stíhat odbavovat. Díky bluetooth čidlům od společnosti Kontakt.io, sledujícím polohu kontejnerových vozíků, dokáže nizozemská pošta problémy předvídat a zaměstnance nebo vybavení včas přesunout, aby se situace vyřešila. Tento jednoduchý krok řeší problémy dříve, než vzniknou.​<br></p><h2>Lokalizace „zatoulaných“ zásilek</h2><p>Ztráta zásilky nebo celého kontejnerového vozíku znamená pro každou zasilatelskou službu vážný problém. Díky čidlům je lokalizace vozíků mnohem jednodušší a rychlejší, pošta o žádném z nich nikdy neztrácí přehled. Ví, na který kontejnerový vozík s tzv. rolovací klecí byla zásilka naložena a také pozná, ve kterém voze nebo překladišti se vozík nachází. Dokáže proto snadno zjistit, kde přesně se zásilka nachází a v případě potřeby ji přesunout na správné místo.​<br></p><h2>Informace o kapacitě kontejnerových vozících v reálném čase</h2><p>Díky digitalizaci logistiky pomocí sledovacích čidel má nizozemská pošta přehled dokonce i o aktuální kapacitě jednotlivých kontejnerových vozíků – zda je klec plně naložená, nebo zda je v ní volné místo. Detailní přehled, kde se vozíky nacházejí, co obsahují a jak se pohybují, včetně případných zpoždění, umožňuje zvýšit efektivitu procesů a zlepšovat zákaznické služby.​<br></p><h2>Snížení nákladů</h2><p>Sledování rolovacích klecí a toho, co je na nich, umožňuje identifikovat místa, kde je možné snížit náklady v logistickém řetězci. Například posílat plně naložené klece místo poloprázdných, nebo zajistit, aby tyto jednotky jely co nejpřímější cestou na místo určení. ​<br></p><h2>Snižování ekologické stopy</h2><p>Rychlá identifikace míst, kde lze kontejnery nejlépe využít, přináší nejen vyšší nákladovou efektivitu, ale zároveň snižuje negativní dopad na životní prostředí díky menšímu množství nevyužitého prostoru během přepravy.<br></p><p>Technologie sledování kontejnerových vozíků pomocí IoT čidel, které zvolila nizozemská pošta, může být klíčovým řešením, jak zvládnout stále rostoucí objem přepravovaných zásilek. Tato technologie umožňuje získat lepší přehled o využití kontejnerových vozíků a minimalizovat náklady na výměnu zařízení. Díky monitorování lze rozmístit vozíky tak, aby byly využívány co nejefektivněji a předvídat „úzká hrdla“ v logistickém řetězci. Pomáhá řešit problémy dříve, než vzniknou, a minimalizovat negativní dopady na životní prostředí. Společnosti a organizace i v dalších odvětvích mohou tuto technologii využít k optimalizaci svých logistických procesů a minimalizaci nákladů.​<br></p><p><em style="orphans:2;text-align:justify;widows:2;text-decoration-style:initial;text-decoration-color:initial;">K​ateryna Sakovska​</em>​<br></p><p><br></p>odborné;#
V Cleverlance mě to nepřestává bavit ani po 12 letechhttps://create-it.cz/Blog/Stranky/rozhovor-petra-m.aspxV Cleverlance mě to nepřestává bavit ani po 12 letech<p>​​​​​​Dělat rozhovor s mladou a chytrou ženou je vždy radost. Pokud je to vaše kolegyně, se kterou máte možnost se potkávat v Cleverlance již 12 let, je ta radost dvojnásobná. Dnes vám představíme Petru M., které jsme se zeptali, co se za její profesní kariéru změnilo a jaký má na práci v Cleverlance pohled.<br></p><h4>Ahoj Petro, jak​​​​ se máš?​​​</h4><p>Mám se skvěle, děkuji. (smích)</p><h4>Jaká byla „tvoje cesta“ do Cle​ver​lance?</h4><p>Studovala jsem Softwarové inženýrství na ČVUT a už během studia jsem měla možnost vyzkoušet si různé projekty a role. Práce v IT se mi líbila už tenkrát, tak jsem po vysoké škole nastoupila do firmy, která vyvíjela software. Tam jsem byla asi tři roky, ale protože jsem se chtěla více rozvíjet v analýze, začala jsem se poohlížet po dalších možnostech. Ve finále jsem se rozhodovala mezi dvěma společnostmi, které o mě měly zájem. Obě firmy dělaly na podobných projektech, obě měly dobrou pověst, co se odbornosti týče, ale při návštěvě v Cleverlance mě více oslovilo její pracovní prostředí, a kultura, kterou jsem tam vnímala. A letos v květnu je to už 12 let.</p><h4>Takže jsi dala na svůj pocit?</h4><p>Ano, a nelituji toho. Cítila jsem, že v Cleverlance je komunita lidí se stejným cílem. Nejdříve jsem pracovala spíše na projektech u zákazníků a neměla tak možnost se s dalšími kolegy vidět každý den, naštěstí se ale v Cleverlance dělá maximum pro to, aby se měli šanci všichni potkávat. Organizují se různé akce, společné obědy, nebo snídaně s managementem, abychom věděli, co je nového. Já nejvíc oceňuji nabídku různých školení a dalších vzdělávacích „aktivit,“ na kterých mám možnost se potkat s ostatními.</p><h4>Na co ráda vzpomínáš?</h4><p>Zhruba po roce se situace výrazně změnila, kdy jsem z menších projektů u zákazníka, začala pracovat přímo v kancelářích firmy na vývoji softwaru pro nové pilíře penzijního pojištění. Projekt byl velmi náročný, protože musel být dokončen ještě před začátkem platnosti nové legislativy. Práce bylo sice hodně a někdy jsme pracovali i o víkendech, ale v týmu jsem poznala spoustu skvělých lidí, se kterými jsme měli společný cíl, na který jsme se soustředili. Nikdy například nezapomenu na tradici společných obědů, kterou jsme ještě ve starých kancelářích v pražských Holešovicích měli, a rituál vybírání, vyjednávání a smlouvání, na co a do které restaurace vyrazíme. To byl tenkrát asi nejvýraznější rys naší firemní kultury. (smích)</p><h4>Takže jsi tu našla, co jsi hledala?</h4><p>Ano a poznala jsem, že v Cleverlance jsou dva typy lidí: jedni, kteří přijdou s cílem pracovat na konkrétním projektu a po jeho dokončení pokračují dál, a druzí, kteří tu pracují dlouhodobě na různých projektech. Ta druhá skupina je daleko větší i díky tomu, že v Cleverlance je velké množství zajímavých projektů pro široké spektrum zákazníků v různých odvětvích a je tedy z čeho vybírat. S některými z nich pracuji na různých projektech stále, se spoustou dalších lidí se sice běžně nevídám, ale víme o sobě, a potkávám je třeba na školeních, na akcích nebo minimálně na vánočním večírku. A je to vždy velmi příjemné setkání. (smích) </p><p>Pokud se na to podívám z pohledu business analýzy, podařilo se nám společně po několika letech práce spoustu věcí nastavit – postupy, metodiky, standardy. Myslím, že nás hodně spojil i ten pocit spoluvytváření, společných inovací, nebo projekty, kde jeden navazuje na výstupy předchozího.</p><h4>A z odborného hlediska? Co si myslíš o možnostech profesního růstu v Cleverlance?</h4><p>Za prvé je to podle mě o zkušenostech. Děláme na zajímavých zakázkách pro velké zákazníky, takže tu o ně není nouze. Jako B​usiness analytik jsem si například musela zorganizovat spoustu workshopů se zákazníkem, s budoucími uživateli vyvíjeného softwaru. Mnohokrát se mi stalo, že přišla skupinka lidí, kteří mi dokázali úplně zničit agendu a vůbec jsme se nedostali k tomu, co bylo vlastně cílem setkání. To byl hlavně můj problém, nedokázala jsem to správně zkorigovat a zabývat se tématem toho konkrétního workshopu. To mě naučilo, jak důležité je si správně naplánovat agendu a jasně komunikovat cíl a proč jsme se vlastně sešli. Důsledně schůzku vést, držet se cíle a nedat prostor ničemu, co by mohlo workshop „rozbít.“</p><p>Za druhé Cleverlance nabízí spoustu skvělých interních školení, která jsou k dispozici pro každého a skvělé je, že si je vytváříme „sami pro sebe“. Osobně jsem těchto školení využila už jako student, později i jako lektor. V Cleverlance je samozřejmě i možnost absolvovat externích školení. Konkrétně v mém případě, kdy jsem se po několika letech jako Business analytik chtěla posunout do role Product ownera, tak mě Cleverlance v kariérním postupu podpořila a zaplatila mi externí školení i certifikaci.</p><h4>Vážně? A jak se tedy podle tebe změnila business analýza jako obor, za tu dobu, co jsi tady?</h4><p>Když jsem před lety nastoupila do Cleverlance, používala se při řízení projektů jen metodika waterfall, ale protože nastávaly komplikace s řízením projektů, přešli jsme postupně na agilní způsob práce a máme lepší výsledky. Pracovala jsem na mnoha projektech v bankách, které tímto způsobem změnily nejen vývoj IT systémů, ale celou svojí organizaci. Týmy mají v současné době k dispozici Product ownera, který definuje požadavky zákazníka. Tento trend již funguje nějakou dobu a podle mne konečně umožnil porozumění mezi zákazníkem a týmem, který software vyvíjí.</p><h4>Jaký je podle Tebe vlastně rozdíl mezi Business analytikem a Product ownerem?</h4><p>Business analytik se obvykle zaměřuje na analýzu a porozumění potřebám zákazníka. Na to, jak mohou být tyto potřeby naplněny v podobě vyvíjeného softwaru. Business analytik pracuje s vývojovým týmem, aby vypracoval specifikaci a po celou dobu projektu zajišťoval, že jsou naplněny potřeby zákazníka. </p><p>Product owner podle mne více řeší, proč software vlastně vzniká, k čemu bude sloužit. Vytváří „vizi“ výsledného softwarového produktu a snaží se ji předat celému týmu. Na denní bázi řeší priority jednotlivých požadavků, jak jsou důležité pro „business“, do kdy musí být hotové, a plánuje vydávání nových verzí.</p><p>To je důvod, proč je pro mne tahle role současným vyvrcholením mojí profesní cesty. Postupně jsem si vyzkoušela různé role v rámci IT a uvědomila si, že otázkám „co máme dělat“ a „jak to máme udělat“ musí předcházet otázky jako „proč to máme udělat,“ „proč je to důležité“ a „jak je to důležité…“. Myslím, že v Cleverlance si lidé velmi cení možnosti získávat zkušenosti při práci pro různé zákazníky, v různých oborech, na různých projektech. Neumím si představit, že bych strávila celých 12 let stejnou prací na jednom místě, pro jednoho zákazníka.</p><h4>Co tě teď v nejbližších měsíc​ích čeká?</h4><p>Hodně práce. (smích) Začala jsem participovat na novém projektu jako Product owner několika produktů. Zatím se rozkoukávám, sbírám informace a znalosti, rychle bych ale chtěla být pro zaběhnutý tým přínosem. A jelikož dovolenou pro své dobrodružnější cesty do Maroka a Uzbekistánu plánuji až po prázdninách, krásně to do sebe zapadá.</p><p>Tak ať se ti daří, příjemné léto.</p><p>Díky za rozhovor.</p><p> <em>Kateryna Sakovska​</em><br></p><p> <br> </p>​<br>odborné;#vzdělávání;#projekty;#
Barevné modely a jak je využívathttps://create-it.cz/Blog/Stranky/barevne-modely.aspxBarevné modely a jak je využívat<p>​​​​​​​Asi jste někdy zaznamenali zkratky jako CMYK, RGB nebo RAL ve spojitostí s barvou. Jedná se o rozdílné modely, které umožňují barvy míchat a popisovat. A každý systém má také odlišné použití. Ale hezky popořádku, než si popíšeme jednotlivé modely, uděláme si nejdříve pořádek v pojmech.<br></p><h2>Pojmy</h2><p>Průměrný člověk dokáže vidět okolo milionu barev. Nicméně, ne vždy dokáže barvy přesně odlišit. Dvě podobné barvy můžeme vnímat jako stejné. Nebo naopak vidíme rozdíly v barvě objektů stejné barvy, pokud jsou v jiném úhlu nebo různém osvětlení. </p><p>Aby výrobci a designéři mohli reprodukovat požadovanou barvu pokaždé přesně, potřebují způsob, jak kvantifikovat vlastnosti barvy a určit numerický rozdíl mezi nimi. A to je přesně důvod, proč vznikly barevné modely. Abychom mohli barvy definovat, popsat a katalogizovat. Díky barevným modelům máme jistotu, že pokud si koupíme modrou barvu s daným kódem, například na nátěr plotu, je to vždy ta samá modř. S barevnými modely pracují např. designeři, kteří musí přesně definovat barvy v návrhu a také tiskaři, kteří musí namíchat správné barvy k tisku. Bez barevného modelu bychom vlastně neměli ani barevné monitory nebo televizi.</p><p> <strong>Barevný model</strong> (nebo také systém) je tedy abstraktní matematický model popisující barvu viditelného spektra pomocí čísel. Barva v modelu se skládá obvykle ze 3 čísel, vzniká kombinací těchto 3 hodnot. Na obrázku níže je například konkrétní barva určena 3 hodnotami intenzity barev červené, zelené a modré.</p><p> <img src="/Blog/PublishingImages/Stranky/Barevne_modely/barevne_modely1.png" data-themekey="#" alt="" /><br></p><p> <strong>Barevný prostor</strong> je naproti tomu podmnožina dostupných barev, které daný barevný model nabízí. Stručně řečeno, barevný model říká, jakým způsobem barvy vznikají a barevný prostor pak definuje soubor barev, kterou je schopno určité zařízení nasnímat nebo zobrazit. Nejpoužívanější barevné prostory byly vyhlášeny jako celosvětové standardy a zařízení pracující s barvami (monitor, display, projektor, digitální fotoaparát, skener, tiskárna a další) podporují právě některý z těchto standardů. </p><p>Většina zařízení využívá pouze 1 barevný prostor. Ovšem existují například monitory pro profesionály, které mají k dispozici více barevných prostorů, mezi nimiž lze přepínat. Výrobce vždy uvádí, v jakém barevném prostoru zařízení pracuje a na kolik procent jej pokrývá. Pokud je uvedeno, že daný standard plní na 90 %, znamená to, že zařízení umí zobrazit pouze 90 % barev definovaných barevným prostorem. Rozsah barev u konkrétního zařízení se nazývá gamut. Barva, které je mimo rozsah gamutu, dané zařízení neumí zobrazit a vykresluje jí pak jako nejbližší možnou dostupnou barvu v gamutu.</p><p>Pro pochopení barevného prostoru a gamutu je důležité porozumět diagramu CIE. Je výsledkem rozsáhlého výzkumu lidského zraku. Je také známý jako "diagram podkovy". Horní křivka ohraničuje tvar podkovy a obsahuje jasné barvy, jak jdou za sebou ve spektru. Spodní hrana diagramu je přímka, která se nazývá "purpurová čára" a spojuje opačné barvy spektra, fialovou a červenou. Barvy na této přímce v duze nenajdeme. </p><p>Z obrázku níže je patrné, že reálně zobrazovaná množina barev zařízení je průnik množiny barev využívaného barevného prostoru (jeho standardu) a gamutu daného zařízení.</p><p> <img src="/Blog/PublishingImages/Stranky/Barevne_modely/barevne_modely2.png" data-themekey="#" alt="" /><br></p><p>Není to úplně jednoduché, že? A nyní se pojďme již podívat na základní barevné modely.</p><h2>Barevný model RGB</h2><p>RGB je neznámější barevný model. Je založen na vnímání barev lidským okem. V sítnici uvnitř oka jsou umístěny čípky, což jsou foto-receptorické světločivé buňky. V jednom oku je jich asi 7 milionů a rozlišují se na tři druhy: L, M a S čípky. Liší se barevnými pigmenty a citlivostí na vlnové délky, které odpovídají primárním barvám:</p><ul><li>červená (vlnová dálka 625 až 740 nm) – tu snímají L-čípky<br></li><li>zelená (520 až 565 nm) – tu snímají M-čípky<br></li><li>modrá (430 až 500 nm) – tu snímají S-čípky<br></li></ul><p>Tyto 3 typy receptorů vysílají do mozku signál, jaké intenzity je primární barevné světlo a mozek si namíchá výslednou barvu, kterou pak skutečně „vidíme“. Protože naše barevné vidění je realizováno třemi typy čípků, nazývá se <strong>trichromatické vidění.</strong></p><p> <img src="/Blog/PublishingImages/Stranky/Barevne_modely/barevne_modely3.png" data-themekey="#" alt="" /><br></p><p>Na tomto principu je založen <strong>RGB barevný model</strong>. Definuje, že každá barva vzniká mícháním tří primárních barev, červené (Red), zelené (Green) a modré (Blue). Tento model pracuje se zdrojem světla. Skládáním červeného, zeleného a modrého světla o různých intenzitách vznikají kombinace barev. Jednotlivé složky barev se sčítají a výsledek je světlo větší intenzity. Smícháme-li všechny 3 barevné složky v maximální intenzitě, vznikne bílá barva. Naopak pokud nepustíme do barevných složek žádné světlo, výsledkem bude tma, černá barva.</p><p> <img src="/Blog/PublishingImages/Stranky/Barevne_modely/barevne_modely4.png" data-themekey="#" alt="" /><br></p><p>Jak ale intenzitu primárních barev převést na čísla? Jednoduše. Intenzita se může pohybovat mezi minimem (nic nesvítí) a maximem (svítí naplno). Minimum je nula a maximum většinou číslo 255, což je největší číslo v počítači reprezentované 1 bajtem, tedy 8 bity. Mluvíme zde o <strong>bitové hloubce 8 bitů</strong>. Grafické SW počítačové jazyky většinou používají pro RGB model zápisy:</p><ul><li> <strong>RGB decimální</strong> – intenzita primární barvy je 0–255, pak např. žlutá vzniká plnou intenzitou červené a zelené a má RGB kód (255, 255, 0).<br></li><li> <strong>RGBA</strong> – stejné jako RGB, jen ke třem základním barvám přidáváme ještě Alfa kanál (hodnota 0–1), který definuje průhlednost barvy. 0 říká plně průhledné, 1 pak zcela nepropustné. Například žlutá napůl průhledná má RGBA kód (255, 255, 0, 0.5).<br></li><li> <strong>Hexadecimální</strong> (v šestnáctkové soustavě) – intenzita primární barvy je 0 – FF, pak žlutá má RGB HEX kód #FFFF00. Toto je nejčastější zápis barvy na webu.<br></li></ul><p> <img src="/Blog/PublishingImages/Stranky/Barevne_modely/barevne_modely5.png" data-themekey="#" alt="" /><br></p><p>Barevný model RGB je <strong>aditivní barevný model</strong>, protože funguje na principu skládání barevného vyzařovaného světla. Tento model využívají všechny zařízení, které vyzařují obraz. Je tedy s výhodou používán pro televize, monitory, displeje nebo projektory. Je tak jedním z nejdůležitějších a nejznámějších systémů pro barvy v digitálních médiích.</p><h3>Barevný prostor sRGB</h3><p> <strong>sRGB</strong> je nejrozšířenější barevný prostor RGB modelu. Tento standard vznikl v roce 1995 ve spolupráci společností Hewlett Packard a Microsoft pro použití na monitorech, tiskárnách a internetu. Je podporován konsorciem <a href="https://www.w3.org/" target="_blank">W3C</a> pro vývoj na webu a významnými společnostmi jako je IBM, Intel, Adobe, Corel nebo <a href="https://www.pantone.com/" target="_blank">Pantone​</a>. Můžeme se s ním setkat u většiny grafického softwaru. Barevný prostor sRGB v současné době kraluje internetu, většina fotografií a ilustrací na webu byla vytvořena právě díky němu. Drtivá většina běžných současných monitorů podporuje právě tento standard.</p><h3>Barevný prostor Adobe RGB</h3><p>Prostor sRGB je sice široce používaný, ale je poněkud limitovaný. Nedokáže totiž zobrazit některé odstíny zelené a gradienty (přechody barev) působí tmavým dojmem. A tak přišla v roce 1998 společnost Adobe s vylepšeným barevným prostorem <strong>Adobe RGB</strong>. Využití má hlavně v digitální fotografii, kde fotky mají pak sytější a realističtější barvy. Ale abychom si je mohli správně vychutnat, musíme použít monitor, které tento barvený prostor podporuje. Jinak jsou barvy standardně přepočteny na sRGB.</p><h3>Barevný prostor ProPhoto RGB</h3><p>S rozvojem digitálních technologií se čím dál více používá barevný prostor ProPhoto ​​RGB, který vyvinula společnost Kodak pro své foťáky. Tento prostor nabízí speciálně široký rozsah barev, který by měl pokrýt všechny barvy povrchů reálného světa (<a href="https://tftcentral.co.uk/articles/pointers_gamut" target="_blank">Pointer’s gamut​</a>). Je proto ideální ve většině případů pro využití v digitálním světě. Pokud upravujeme obrázek v ProPhoto, minimalizujeme riziko zbytečného ořezávání barev. Ale pozor, exportovat nebo navěsit na web výslednou fotku bychom měli opět v sRGB, protože pokud si jí bude někdo prohlížet v softwaru, který neumožňuje přepočet barevných prostorů, barvy budou vypadat opravdu „divně“.<br></p><p> ​<img src="/Blog/PublishingImages/Stranky/Barevne_modely/barevne_modely6.png" data-themekey="#" alt="" /><br></p><h2>Barevný model HSB</h2><p>Barevný <strong>model HSB</strong> byl vytvořen v roce 1978 jako jiná reprezentace aditivního RGB modelu. Umožňuje lepší a jednodušší míchání barev v digitálním světě, protože odpovídá lépe lidské představivosti a barevnému myšlení.</p><p>Představme si, že potřebujeme ladit sytost růžové barvy. Pomocí RGB modelu je to ale složité a neintuitivní. Nevíme, zda máme přidat více červené anebo jiné barvy pro výsledný efekt. Bylo by fajn ovládat přímo sytost barvy. A na tomto je HSB model založen. HSB model se skládá ze 3 složek:</p><ul><li>Odstín barvy (Hue) – hodnota 0–360 (°), odpovídá stupni na barevném kole, kde jsou za sebou uvedeny všechny základní barvy spektra. Popisuje zabarvení, barevný tón. <br></li><li>Sytost barvy (Saturation) – hodnota 0–100 (%) určuje čistotu barvy. 100 znamená plný sytý odstín barvy, naopak 0 představuje šedou. Někdy se tato vlastnost nazývá chroma, síla nebo bohatost barvy. Představuje množství šedi v poměru k odstínu, např. červená s 50 % sytostí je růžová.<br></li><li>Jas barvy (Brightnes) – hodnota 0–100 (%) řídí množství bílého světla. 0 udává vždy černou, 100 představuje jasný odstín. Pokud je jas 100 i sytost na 0, pak vidíme bílou a je jedno, jaký odstín byl zvolen. Tato veličina vyjadřuje, kolik světla barva odráží neboli poměr černé v základní barvě.<br></li></ul><p> <img src="/Blog/PublishingImages/Stranky/Barevne_modely/barevne_modely7.png" data-themekey="#" alt="" /><br></p><h2>Barevný model HSV</h2><p> <strong>Model HSV</strong> je tentýž jako předchozí barevný model HSB. Pouze zde se složka pro jas nazývá hodnota (Value). Oba jsou to tzv. válcovité modely, kdy se namíchaná barva nachází jako bod uvnitř válce. Úhel kolem osy určuje odstín, vzdálenost od osy odpovídá sytosti a výška ve válci určuje jas nebo hodnotu. <br></p><p> <img src="/Blog/PublishingImages/Stranky/Barevne_modely/barevne_modely8.png" data-themekey="#" alt="" /> <br> </p><h2>Barevný model HSL</h2><p>Barevný <strong>model HSL</strong> je podobný modelu HSB, výsledná barva se také skládá ze tří složek. První dvě složky jsou naprosto stejné jako HSB, ale třetí se liší. Místo saturace se objevuje jako 3. složka světlost:</p><ul><li>Odstín barvy (Hue) – hodnota 0–360 (°).<br></li><li>Sytost barvy (Saturation) – hodnota 0–100 (%).<br></li><li>Světlost (Lightness) – hodnota 0–100 (%) určuje, jak moc bude barva světlá nebo tmavá. Světlostí nastavujeme podíl černé a bílé složky ve výsledné barvě. Nízká hodnota odpovídá tmavé barvě, 0 představuje černou. Naopak vysoká hodnota určuje světlé tóny, 100 odpovídá bílé.<br></li></ul><p>Jedná se také o cylindrický model, rozdíl v míchání je ale vidět na předchozím obrázku. Světlost odpovídá výšce ve válci. Je vidět, že plná světlost odpovídá bílé barvě na celém povrch válce. Je tedy jedno, jak jsou zbývající 2 složky nastaveny. To samé platí pro černou na spodu válce.</p><p>Výhody barevného modelu HSL spočívají v symetrii světlosti a tmy. To znamená, že sytost (saturace) jde vždy od plné syté barvy k ekvivalentu šedé. Ovšem podíváme-li se na válec HSB, tam sytost jde od syté barvy k bílé a mění se kontrast barvy. Takže pokud potřebujeme ladit pouze chromu barvy (míchat s šedou), aniž se mění výsledný kontrast, je výhodnější zvolit právě model HSL. </p><p> <img src="/Blog/PublishingImages/Stranky/Barevne_modely/barevne_modely9.png" data-themekey="#" alt="" /><br></p><p>Navíc světlost v tomto modelu má vždy od černé přes zvolený odstín až k bílé. Naopak v HSB, pokud budeme měnit jas, jdeme poloviční cestou, od černé k volenému odstínu. Je zřejmé, že HSL model má své výhody, kdy můžeme systematicky a velmi přesně míchat požadované barvy. Měnit jejich odstíny po velmi malých krocích a ladit přesně ten parametr barvy, který potřebujeme. Používáním HSB budeme při míchání barev efektivnější a rychlejší. </p><p>V grafickém softwaru je RGB model obvykle reprezentován uživateli ve formě lineárního nebo kruhového výběru odstínu a dvojrozměrné oblasti, kde si můžeme zvolit sytost a jas. Tedy pracuje defaultně s modelem HSB. A většina programů umí také přepnout do modelu HSL, což nám může ulehčit práci. Obrázek níže ukazuje různé modely mixu barev ve <a href="https://www.figma.com/" target="_blank">Figmě</a>, kdy poslední je model HSL. </p><p>  <img src="/Blog/PublishingImages/Stranky/Barevne_modely/barevne_modely10.png" data-themekey="#" alt="" /><br></p><h2>Barevný model HWB</h2><p>Další barevný <strong>model HWB</strong> opět reprezentuje RGB míchání barev a vznikl celkem nedávno, v roce 1996. Je možná ještě jednodušší na pochopení než vychvalovaný HSL model. Definuje, že barva se skládá ze 3 složek:</p><ul><li>Odstín barvy (Hue) – hodnota 0–360 (°), zde se nic nemění.<br></li><li>Bělost (Whiteness) – hodnota 0–100 (%) určuje stupeň přimíchání bílé barvy. 0 znamená, že zůstává základní odstín, 100 definuje čistě bílou.<br></li><li>Černota (Blackness) – hodnota 0–100 (%) řídí množství černé. 0 udává původní odstín, 100 100 zcela černou.<br></li></ul><p>Zní to jednoduše, že? Vyberu odstín barvy a doladíme bílou a černou. Tento model má ale zajímavou vlastnost, že pokud nastavíme bělost i černotu na plno, dostaneme poloviční šedou (#808080). Funguje to, jako bychom namíchali pouze černou a bílou. Aneb čím více zvyšujeme hodnotu bělosti i černoty, tím více přebíjí tyto barvy základní odstín a barva se mění v šedou. A to není úplně intuitivní. Možná právě proto se v grafických programech HWB model moc nepoužívá.</p><p> <img src="/Blog/PublishingImages/Stranky/Barevne_modely/barevne_modely11.png" data-themekey="#" alt="" /><br></p><h2>Barevný model CMYK</h2><p>Zcela odlišný od RGB je barevný <strong>model CMYK</strong>, který je velmi využívaný zejména v tisku. Je založen na CMY modelu, který míchá výslednou barvu jako poměr 3 primárních pigmentů:</p><ul><li>modrá azurová (Cyan) – hodnota 0–100 (%)<br></li><li>červeno-fialová (Magenta) – hodnota 0–100 (%)<br></li><li>žlutá (Yellow) – hodnota 0–100 (%)<br></li></ul><p>Na rozdíl od RGB se jedná <strong>subtraktivní barevný model</strong>. Je založen na principu mícháním pigmentů, které pohlcují barevné spektrum. Pokud bílé světlo dopadne na žlutý pigment, modré světlo se pohltí a zpět se odrazí pouze červené a zelené. A jak víme z RGB modelu, červená a zelená dává výslednou žlutou barvu. Nebo pokud smícháme žlutý a azurový pigment, dostaneme zelenou. Proč? Žlutý pigment pohlcuje modré světlo, azurový zase červenou. Výsledné odražené světlo je tedy zelené.</p><p>Překrýváním barevných pigmentů na bílém pozadí se výsledná barva ztmavuje. Pokud smícháme všechny primární pigmenty v plné dávce, dostaneme teoreticky černou. Je to dané tím, že výsledný pigment pohltí celé barevné spektrum, neodrazí žádné světlo a vznikne černá barva. Naopak pokud nenaneseme žádný pigment, podklad zůstává bílý.</p><p> <img src="/Blog/PublishingImages/Stranky/Barevne_modely/barevne_modely12.png" data-themekey="#" alt="" /> <br> </p><p>Barevný model CMYK přidává ještě jeden pigment:</p><ul><li>černá (Key nebo blacK) – hodnota 0–100 (%)<br></li></ul><p>Je to z důvodu, že v reálném světě pro vznik černo černé nestačí mix primárních pigmentů CMY. Zkoušeli jste někdy smíchat všechny temperové barvy dohromady? A vznikla černá? Vždy se nám podařilo namíchat takovou špinavou hnědo-šedou. Takže abychom uměli vykreslit čistou čerň, přidává se jako další barva do modelu.</p><p> <img src="/Blog/PublishingImages/Stranky/Barevne_modely/barevne_modely13.png" data-themekey="#" alt="" /><br></p><p>Jak bylo řečeno, tento model se používá s úspěchem v tisku. Např. inkoustové tiskárny mají vždy kromě primárních barev ještě zásobník s černou barvou. Je to také z ekonomických důvodů, protože většinou potřebujeme černo-bílé dokumenty, které tiskárna tiskne pomocí černého pigmentu a barevné tak šetří. Dalším důvodem je také to, že nános 3 plných pigmentů na jedno místo na papíru prosakuje a tisk déle schne.</p><p>Tiskárny dále používají tzv. <strong>rastrování</strong>. Pro nástřik barvy nižší sytosti se pigment rozpráší do malých teček, které jsou pod rozlišovací schopnosti lidského oka. Například z meganty tištěné s 20 % rastrem, vzniká růžová barva. Pigment se tak vlastně míchá s bílou barvou podkladu a výsledkem jsou světlejší barvy.</p><h3>Barevný prostor CMYK</h3><p>Barevný prostor CMYK využívají výhradně tiskárny a slouží také pro popis samotného tiskového procesu. Tento prostor je vždy závislý na daném zařízení a používaném pigmentu. Má menší rozsah barev než sRGB a při tisku tak musí dojít k přepočtu barev. Ty barvy, které prostor CMYK neobsahuje, jsou nahrazeny dostupnými. </p><p> <img src="/Blog/PublishingImages/Stranky/Barevne_modely/barevne_modely14.png" data-themekey="#" alt="" /><br></p><p>Existují 3 tipy přepočtu na CMYK:</p><ul><li>Perceptuální – používá se pro fotografie, kdy se plynule modifikuje gamut tak, aby byly barvy co nejvěrnější.<br></li><li>Kolorimetrický – převádí se pouze barvy, které jsou mimo rozsah cílového gamutu tak, že nahradí nebližší barvou z gamutu. Není tak vhodný pro fotografie, protože slívá různé barvy do stejné.<br></li><li>Saturation (sytost) - snaží se vytvořit živé barvy na úkor přesnosti barev. Hodí se pro obchodní grafiku a marketing, kde přesné vztahy mezi barvami nejsou tak důležité, jako dosažení jasných, sytých barev. Pro fotografie je tato metoda opět nevhodná.<br></li></ul><p>Z technologie míchání barev pomocí subtraktivního modelu CMYK, kdy výchozím stavem je bílý papír, vyplývá, že tisk nikdy nezobrazí dostatečně syté a zářivé barvy. Má problém se ztvárněním zejména ostré fialové a zelené. Naše fotografie, vytištěné na domácí inkoustové tiskárně za pomocí CMYK prostoru, tedy nebudou nikdy tak krásně barevné a jasné jako na LCD display. Naštěstí existují profesionální tiskárny a fotolaby, které pracují s jinými barevnými prostory a větší množinou barev.​<br></p><h2>Pokračování</h2><p>Článek bude pokračovat, v dalším díle se podíváme na princip oponentních procesů a barevné modely z něj vycházející. Dále se seznámíme s nejpoužívanějšími barevnými systémy, jako je RAL nebo Pantone. <br></p><p> <em>Jan Čermák</em><br></p>​<br>odborné;#vzdělávání;#
Animační pluginy ve Figměhttps://create-it.cz/Blog/Stranky/animacni_pluginy_figma.aspxAnimační pluginy ve Figmě<p>​​​​​​​​Disclaimer: <em>všechny nástroje zmiňované v tomto článku jsou ve stádiu aktivního vývoje s častými releases, a tedy verze používaná při psaní článku už může být stará oproti té vaší. Všechny animace odkazované v článku naleznete v tomto <a href="https://www.figma.com/file/rtjSqflfNWeaMPAjrQzhoM/Figma-Animations-overview---resources?node-id=0:1&t=YXr95PcOLSRJZ9dh-1" target="_blank">Figma souboru.</a>​​​</em></p><p>Když se řekne „nástroj na animace“, většinu lidí z oboru okamžitě napadne Adobe Animate nebo After Effects. Není se čemu divit, je to přeci jen „industry standard“. Když ale člověk neanimuje 24/7, ale jen jednou za čas, potřebuje vyrobit pěknou načítací obrazovku a už má všechny assety vyrobené ve Figmě, nechce řešit další nástroje. Jak uvidíte, není potřeba sahat po tak velkých a drahých „kladivech“!</p><div>V příhodný moment na scénu přicházejí pluginy do Figmy, které její nativní funkcionalitu skládání tvarů a prototypování obohacují o možnosti exportovatelné animace. A právě výběr těch nejlepších vám v tomto článku představím. Nejprve však trochu názvosloví.<br></div><div> <br> </div><h2>Keyframe</h2><div>Před​stavuje stav atributu dané vrstvy v daném čase.<br></div><div style="text-align:center;"> <img src="/Blog/PublishingImages/Stranky/animacni_pluginy_figma/position_and_color_shift.gif" alt="position_and_color_shift.gif" data-themekey="#" style="margin:5px;max-width:190px;" />​<br></div><div> <em>Keyframe pro atribut X v 0 sekundách animace stanovuje pozici vlevo, druhý keyframe vpravo. Další dva keyframy mění barvu přepínače, zbývající dva s nastavenými opačnými barvami mění barvu pozadí. </em>(vytvořeno pomocí Motion)<br></div><h2>Ease</h2><div>Definuje zrychlení a zpomalení přechodu v době, zda je rychlejší na začátku, na konci, či uprostřed. To dodává animaci pocit života – máloco na světě se totiž pohybuje rovnoměrně (lineárně), snad kromě ozubených koleček.</div><div style="text-align:center;"> <img src="/Blog/PublishingImages/Stranky/animacni_pluginy_figma/Ease.gif" alt="Ease.gif" data-themekey="#" style="margin:5px;max-width:190px;" />  </div><div> <br>​​<em>Světlý čtverec se pohybuje s lineárním nastavením ease, zatímco tmavý s Ease in and out – na začátku zrychlí a na konci zpomalí.</em> (vytvořeno pomocí Motion)<br></div><h2>Kotva objektu </h2><div>Bod, který definuje ukotvení vrstvy v prostoru. Podle kotvy vrstva rotuje, využívá se pro všechny výpočty pohybu.<br></div><div> <img src="/Blog/PublishingImages/Stranky/animacni_pluginy_figma/Anchor_center.gif" alt="Anchor_center.gif" data-themekey="#" style="margin:30px 20px 0px 0px;max-width:190px;vertical-align:top;" /> <img src="/Blog/PublishingImages/Stranky/animacni_pluginy_figma/Anchor_top_left.gif" alt="Anchor_top_left.gif" data-themekey="#" style="margin:0px 30px;max-width:190px;vertical-align:top;" /> <img src="/Blog/PublishingImages/Stranky/animacni_pluginy_figma/Anchor_offcenter.gif" alt="Anchor_offcenter.gif" data-themekey="#" style="margin:30px 0px 0px;max-width:190px;vertical-align:top;" /> <br> </div><div> <em>Kotva uprostřed, v levém horním rohu a v 50 % rozměru X a 75 % rozměru Y.</em> (vytvořeno přes Motion)​<br></div><h2>Formáty</h2><div>ve kterých se běžně vyskytují pohyblivé grafiky na webu:<br></div><div> <br> </div><div> <strong>MP4 a WEBM</strong></div><div><ul><li>video formáty<br></li><li>nezachovávají kvalitu při škálování<br></li></ul></div><div> <strong>GIF</strong><br></div><div><ul><li>sled rastrových obrázků<br></li><li>nezachovává kvalitu při škálování<br></li><li>velký objem<br></li></ul></div><div> <strong>SVG</strong></div><div><ul><li>XML obsahující Javascript, CSS či SMIL kód, který definuje jednotlivé tvary a jejich pohyb<br></li><li>škálovatelný, snadno upravitelný (pokud umíte psát v daném kódu)<br></li></ul></div><div>Bonus: <strong>Lottie</strong></div><div><ul><li>nový minimalistický formát​ založený na JSONu<br></li><li>tvary a jejich pohyb jsou definovány pomocí maximálně dvoupísmenných zkratek atributů<br></li></ul></div><div>A teď už se pusťme do detailů jednotlivých animačních pluginů.​<br></div><h2>Motion<br></h2><p style="text-align:center;"> <img src="/Blog/PublishingImages/Stranky/animacni_pluginy_figma/motion.png" alt="motion.png" data-themekey="#" style="margin:5px;max-width:658px;" /> <br> </p><div>​​​​<a href="https://motionplugin.com/#" target="_blank">Motion​</a> je plugin se širokými možnostmi animace, založený na keyframech. Umožňuje animaci širokého spektra atributů, změnu kotvy s velkou granularitou a kopírování keyframů mezi vrstvami s přepočítáváním hodnot X a Y pro zjednodušený workflow. K dispozici je bohatá knihovna přednastavených animací, efektů a pohybů, díky které nemusíme vše nastavovat ručně.<br></div><div>​​<img src="/Blog/PublishingImages/Stranky/animacni_pluginy_figma/link_and_vector_path_shadow.gif" alt="link_and_vector_path_shadow.gif" data-themekey="#" style="margin:5px;max-width:650px;" />​​​​<em>Papírové letadlo se pohybuje podle nakresleného vektoru a stín ho následuje díky závislosti zabezpečené praktickou funkcí link.</em></div><div> <br> </div><div>Hotovou animaci můžeme exportovat v mnoha formátech, včetně GIF, MP4/WEBM a SVG v beta verzi. GIF a SVG zároveň podporují průhlednost vrstev.<br></div><div style="text-align:center;"> <img src="/Blog/PublishingImages/Stranky/animacni_pluginy_figma/figma1.png" alt="figma1.png" data-themekey="#" style="margin:5px;max-width:190px;" /> <br> </div><div>Motion má čtyři různé licence, přičemž verze zdarma je omezena na dvouvteřinové animace a 30 FPS. Licence Professional na použití 8 dní za měsíc je výhodná pro uživatele, pro které animace není denním chlebem.<br></div><div> <img src="/Blog/PublishingImages/Stranky/animacni_pluginy_figma/figma7.png" alt="figma7.png" data-themekey="#" style="margin:5px;max-width:658px;" /> <br> </div><div> <em>​8denní licence na Motion stojí 6,39$ za měsíc.</em><br></div><div> <br> </div><div>Celkově se plugin Motion velmi příjemně používá, i když bych ocenila možnost zvláštního okna pro práci na více obrazovkách.​<br></div><h2>Figmotion</h2><div> <a href="https://www.figma.com/community/plugin/733025261168520714/Figmotion" target="_blank">​Figmotion</a> je bezplatný plugin s webovým rozhraním, díky kterému je ideální pro práci s více obrazovkami. Je také založený na použití keyframů. Oproti Motionu podporuje animaci zaoblení jednotlivých rohů a tloušťky čáry, na druhou stranu kopírování keyframů probíhá bez přepočítání, což v kombinaci s potřebou pokaždé klikat na Save velmi zpomaluje workflow.<br></div><div style="text-align:center;">​<img src="/Blog/PublishingImages/Stranky/animacni_pluginy_figma/figmotion_corners.gif" alt="figmotion_corners.gif" data-themekey="#" style="margin:5px;max-width:190px;" /><br></div><div style="text-align:left;"> <em>Zaoblení jednotlivých rohů a tloušťky čáry.</em><br></div><div> <br> </div><div>Závislost mezi vrstvami Figmotion implementuje pomocí expressions, (tedy výpočtů hodnot na základě proměnných (time v milisekundách či progress jako desetinná hodnota mezi 0 a 1), či atributů jiných vrstev. Tato funkcionalita ale není moc dobře zdokumentována a je třeba ovládat Javascript.</div><div> <br> </div><div>Plugin má jen čtyři základní možnosti přednastavených ease a zcela chybí knihovna pohybů, což znamená, že musíme vše dělat ručně. Kotva lze nastavit na devět vybraných pozic.</div><div>Podporuje export do MP4, WEBM a GIF až do 60 FPS, ale bez možnosti průhledných vrstev. Nedávno byl spuštěn i Lottie export v beta verzi, front-endové vývojáře zaujme nový export pro reactový Framer Motion.</div><div style="text-align:center;"> <img src="/Blog/PublishingImages/Stranky/animacni_pluginy_figma/figma2.png" alt="figma2.png" data-themekey="#" style="margin:5px;max-width:211px;" /> <br> </div><div> <em>Úplně nahoře si nastavíme kotvu dané vrstvy, uprostřed vlastnosti keyframu, dole vybereme z možností přechodu.</em><br></div><div>​<br></div><div>Figmotion má obrovské množství schopností, ale mnoho z nich je nedodělaných a často se objevující bugy a těžkopádný workflow mu ubírají na použitelnosti. Na druhou stranu má neomezenou délku animace, je zdarma a ve Figma komunitě ji používá největší množství uživatelů.​<br></div><h2>Bonus: Jitter.video<br></h2><div style="text-align:center;"> <img src="/Blog/PublishingImages/Stranky/animacni_pluginy_figma/figma3.png" alt="figma3.png" data-themekey="#" style="margin:5px;max-width:658px;" /> <br> </div><div> <a href="https://jitter.video/" target="_blank">Jitter</a> je webový nástroj určený k vytváření animací z vektorových tvarů, který sice nefunguje přímo ve Figmě, ale pomocí pluginu se do něj dají assety z Figmy jedním klikem naimportovat. Sice zatím n​epodporuje úplně všechny atributy (například individuálně zaoblené rohy), ale řeší to relativně elegantně – danou nepodporovanou vrstvu importuje jako PNG. Namísto <em>keyframů</em> se soustředí spíše na proces přechodu. Poskytuje slušnou knihovnu přednastavených animací a zjednodušený pohled na jednotlivé atributy.<br></div><div style="text-align:center;"> <img src="/Blog/PublishingImages/Stranky/animacni_pluginy_figma/figma4.png" alt="figma4.png" data-themekey="#" style="margin:5px;max-width:180px;" /> <br> </div><div> <em>Editace jednotlivých atributů je odstíněna uživatelsky přívětivými slovesy.</em></div><div> <br> </div><div>Jitter ve free verzi nedovoluje průhledné pozadí a export do vyšších rozlišení. V případě beta Lottie exportu se toto omezení dá docela jednoduše obejít – stačí trochu znát Lottie formát a průhlednost si v JSONu nastavit. Placená verze stojí 12$ za měsíc.​<br></div><h2>Závěr</h2><div>Jak vidíte, existuje několik možností, jak rozhýbat jinak statické assety ve Figmě, záleží jen na tom, co od nástroje člověk očekává a zda je ochoten za rozšířené možnosti realizace svých nápadů i něco zaplatit. To, že si navzájem konkurují, podporuje dynamický vývoj, který se samozřejmě neobejde bez chyb, vývojáři těchto nástrojů ale rychle reagují a ocení každý nahlášený bug (sama jsem jich napsala asi deset).</div><div> <br> </div><div>Chtěli byste se naučit některý z pluginů ovládat? Můžete se těšit na pokračování ve formě tutoriálu na Motion.​<br></div><div> <br> </div><div> <em>Zuzana Václaviková​</em><br></div><p> <br> </p>​<br>odborné;#
Jak vytvořit Pacmana v Pythonu - 2. částhttps://create-it.cz/Blog/Stranky/Pacman2.aspxJak vytvořit Pacmana v Pythonu - 2. část<p>Vítejte ve druhé části seriálu o tom, jak vytvořit hru Pac-Man v Pythonu. V <a href="/Blog/Stranky/Pacman1.aspx" target="_blank">minulém díle </a>jsme si představili základní principy hry Pac-Man a navrhli si její datovou strukturu. V tomto díle se budeme zabývat implementací několika důležitých prvků hry, jako je například kolize s duchy, počítání score, umělá inteligence duchů, power-upy, koncové stavy hry, animace a textury.<br></p><p>Nejprve si ale připomeneme, jakým způsobem bude hra fungovat. Hráč ovládá Pacmana a snaží se získat co nejvíce bodů za snězení všech cookies na mapě. Pacman je ale pronásledován duchy, kteří se po mapě pohybují podle určitých pravidel. Hra končí, pokud Pacmana chytí jeden z duchů, nebo pokud Pacman sní všechna cookies.<br></p><p>V tomto finálním díle se zaměříme na implementaci kolizí s duchy, které jsou pro hru důležité, jelikož jejich kontakt s Pacmanem může vést k jeho zničení. Dále se podíváme na to, jak můžeme počítat skóre hráče a jak implementovat umělou inteligenci duchů, aby se po mapě pohybovali realističtěji.<br></p><p>Power-upy jsou speciální prvky, které mohou hráči pomoci zvýšit jeho šance na vítězství. V našem případě to mohou být například různé druhy cookies, které mohou Pacmanovi dodat speciální schopnosti nebo ho ochránit před duchy.<br></p><p>Koncové stavy hry jsou důležité, abychom mohli oznámit hráči, zda vyhrál nebo prohrál. V našem případě budeme mít dva možné koncové stavy: vítězství, pokud Pacman sní všechna cookies, a prohru, pokud ho chytí jeden z duchů.<br></p><p>Animace a textury postav duchů a Pacmana zase zajistí, aby hra vypadala živěji a realističtěji. V našem případě budeme animovat pohyb Pacmana a duchů po mapě.<br></p><p>Pokud budete následovat tento článek až do konce, tak výsledná hra bude vypadat takhle:<br></p><p> <img src="/Blog/PublishingImages/Stranky/Pacman2/pacman4.gif" data-themekey="#" alt="" style="width:100%;" />  </p><h2>Kolize s duchy a počítání životů<br></h2><p>Počítání životů je spojeno se systémem kolizí hráče s duchy. V minulém díle jsme však pořádně neodlišili duchy od ostatních herních objektů, proto pro ducha založíme samostatnou funkcionalitu pro jeho ukládání, získávání a kontrolu kolize s hráčem. Logika je totožná s kolizí s cookie z prvního dílu. Také připravíme proměnné pro powerupy (schopnost podle originálního jména “kokoro”), životy, skóre a časovače událostí. Pro počítání životů jsem přidal jednoduchou funkci <em>kill_pacman</em> - pokud se ho dotkne duch, odeberu mu jeden život a umístím ho znovu na startovní pozici. Pokud mu dojdou životy, tak zničím jeho objekt.<span style="font-size:15px;"></span></p><pre> <code class="language-python hljs">#class GameRenderer: def __init__(self, in_width: int, in_height: int): self._won = False self._powerups = [] self._ghosts = [] self._hero: Hero = None self._lives = 3 self._score = 0 self._score_cookie_pickup = 10 self._score_ghost_eaten = 400 self._score_powerup_pickup = 50 self._kokoro_active = False self._current_mode = GhostBehaviour.SCATTER self._mode_switch_event = pygame.USEREVENT + 1 # custom event self._kokoro_end_event = pygame.USEREVENT + 2 self._pakupaku_event = pygame.USEREVENT + 3 self._modes = [ (7, 20), (7, 20), (5, 20), (5, 999999) # infinite chase ] self._current_phase = 0 def add_ghost(self, obj: GameObject): self._game_objects.append(obj) self._ghosts.append(obj) def get_ghosts(self): return self._ghosts def end_game(self): if self._hero in self._game_objects: self._game_objects.remove(self._hero) self._hero = None def kill_pacman(self): self._lives -= 1 self._hero.set_position(32, 32) self._hero.set_direction(Direction.NONE) if self._lives == 0: self.end_game() #class Hero def tick(): self.handle_cookie_pickup() self.handle_ghosts() def handle_ghosts(self): collision_rect = pygame.Rect(self.x, self.y, self._size, self._size) ghosts = self._renderer.get_ghosts() game_objects = self._renderer.get_game_objects() for ghost in ghosts: collides = collision_rect.colliderect(ghost.get_shape()) if collides and ghost in game_objects: if self._renderer.is_kokoro_active(): game_objects.remove(ghost) self._renderer.add_score(ScoreType.GHOST) else: if not self._renderer.get_won(): self._renderer.kill_pacman() </code></pre> <span style="color:#333333;font-family:farnham-web-medium, open-sans, sans-serif;font-size:1.46em;">Power-upy a počítání skóre</span> <p>Skóre je v Pacmanovi udělování za snězení cookie, power-upu nebo ducha. Hodnoty se pro každý ze zmíněných objektů liší. Specifikujeme si je proto do enumu <em>ScoreType</em>.<span style="font-size:15px;"></span></p><pre> <code class="language-python hljs">class ScoreType(Enum): COOKIE = 10 POWERUP = 50 GHOST = 400 </code></pre> <span style="text-align:justify;">V Pacmanovi existují speciální cookies, které mu udělí schopnost požírání duchů. V prvním díle jsme schopnost popsali původním japonským slovem “kokoro”, proto ji tak referencuji i v kódu. Vytvoříme novou třídu </span><em style="text-align:justify;">Powerup</em><span style="text-align:justify;"> - v podstatě totožné s </span><em style="text-align:justify;">Cookie</em><span style="text-align:justify;">, jen o něco větší. Do ASCII bludiště použijeme pro power-up písmeno “O” a ve funkci </span><em style="text-align:justify;">main </em><span style="text-align:justify;">lehce modifikujeme kód pro zpracování volných míst v bludišti. Také upravíme funkci pro kolizi s cookies  </span><em style="text-align:justify;">handle_cookie_pickup</em><span style="text-align:justify;">, a zahrneme i novou třídu </span><em style="text-align:justify;">Powerup</em><span style="text-align:justify;">. Když Pacman sebere power-up, aktivujeme tuto schopnost na 15 sekund. Po sebrání cookie i powerupu ještě zavoláme funkci </span><em style="text-align:justify;">add_score</em><span style="text-align:justify;"> s odpovídajícím typem skóre. Přidáme taky </span><em style="text-align:justify;">set_won</em><span style="text-align:justify;"> pro konec hry, kdy hráč (Pacman) sebral všechny cookies.</span><span style="font-size:15px;"></span> <pre> <code class="language-python hljs">class Powerup(GameObject): def __init__(self, in_surface, x, y): super().__init__(in_surface, x, y, 8, (255, 255, 255), True) # class GameRenderer def add_powerup(self, obj: GameObject): self._game_objects.append(obj) self._powerups.append(obj) def start_kokoro_timeout(self): pygame.time.set_timer(self._kokoro_end_event, 15000) # 15s def activate_kokoro(self): self._kokoro_active = True self.set_current_mode(GhostBehaviour.SCATTER) self.start_kokoro_timeout() def _handle_events(self): for event in pygame.event.get(): if event.type == self._kokoro_end_event: self._kokoro_active = False # class Hero def handle_cookie_pickup(self): collision_rect = pygame.Rect(self.x, self.y, self._size, self._size) cookies = self._renderer.get_cookies() powerups = self._renderer.get_powerups() game_objects = self._renderer.get_game_objects() cookie_to_remove = None for cookie in cookies: collides = collision_rect.colliderect(cookie.get_shape()) if collides and cookie in game_objects: game_objects.remove(cookie) self._renderer.add_score(ScoreType.COOKIE) cookie_to_remove = cookie if cookie_to_remove is not None: cookies.remove(cookie_to_remove) if len(self._renderer.get_cookies()) == 0: self._renderer.set_won() for powerup in powerups: collides = collision_rect.colliderect(powerup.get_shape()) if collides and powerup in game_objects: if not self._renderer.is_kokoro_active(): game_objects.remove(powerup) self._renderer.add_score(ScoreType.POWERUP) self._renderer.activate_kokoro() # main for powerup_space in pacman_game.powerup_spaces: translated = translate_maze_to_screen(powerup_space) powerup = Powerup(game_renderer, translated[0] + unified_size / 2, translated[1] + unified_size / 2) game_renderer.add_powerup(powerup) </code></pre><h2>Umělá inteligence duchů</h2><p>V originální hře se duchové chovají podle následujícího vzorce:</p><ol><li>vlna - SCATTER 7 sekund, pak CHASE 20 sekund<br></li><li>vlna - SCATTER 7 sekund, pak CHASE 20 sekund<br></li><li>vlna - SCATTER 5 sekund, pak CHASE 20 sekund<br></li><li>vlna - SCATTER 5 sekund, pak permanentně CHASE<br></li></ol><p>SCATTER je režim, ve kterém se duchové chovají náhodně a vybírají si náhodná místa v bludišti (ve skutečnosti mají ještě další specifičtější vzorce pro pohyb okolo překážek, ale do tyto složitější vzorce zde řešit nebudeme). CHASE je režim, ve kterém si duchové dají za cíl pozici hráče - využijeme pro to kód z prvního dílu a jen upravíme cílovou lokaci z náhodné na danou pozici hráče <em>get_hero_position</em>.<br></p><p>Tyto časovače máme v kódu od začátku článku, teď jen musíme přidat přepínání mezi režimy CHASE a SCATTER a kód pro zjištění trasy na pozici hráče.<span style="font-size:15px;"></span></p><pre> <code class="language-python hljs"># class GameRenderer def tick(self, in_fps: int): self.handle_mode_switch() def handle_mode_switch(self): current_phase_timings = self._modes[self._current_phase] print(f"Current phase: {str(self._current_phase)}, current_phase_timings: {str(current_phase_timings)}") scatter_timing = current_phase_timings[0] chase_timing = current_phase_timings[1] if self._current_mode == GhostBehaviour.CHASE: self._current_phase += 1 self.set_current_mode(GhostBehaviour.SCATTER) else: self.set_current_mode(GhostBehaviour.CHASE) used_timing = scatter_timing if self._current_mode == GhostBehaviour.SCATTER else chase_timing pygame.time.set_timer(self._mode_switch_event, used_timing * 1000) def get_hero_position(self): return self._hero.get_position() if self._hero != None else (0, 0) def set_current_mode(self, in_mode: GhostBehaviour): self._current_mode = in_mode def get_current_mode(self): return self._current_mode def _handle_events(self): for event in pygame.event.get(): if event.type == self._mode_switch_event: self.handle_mode_switch() # class Ghost def request_path_to_player(self, in_ghost): player_position = translate_screen_to_maze(in_ghost._renderer.get_hero_position()) current_maze_coord = translate_screen_to_maze(in_ghost.get_position()) path = self.game_controller.p.get_path(current_maze_coord[1], current_maze_coord[0], player_position[1],player_position[0]) new_path = [translate_maze_to_screen(item) for item in path] in_ghost.set_new_path(new_path) def calculate_direction_to_next_target(self) -> Direction: if self.next_target is None: if self._renderer.get_current_mode() == GhostBehaviour.CHASE and not self._renderer.is_kokoro_active(): self.request_path_to_player(self) else: self.game_controller.request_new_random_path(self) return Direction.NONE diff_x = self.next_target[0] - self.x diff_y = self.next_target[1] - self.y if diff_x == 0: return Direction.DOWN if diff_y > 0 else Direction.UP if diff_y == 0: return Direction.LEFT if diff_x < 0 else Direction.RIGHT if self._renderer.get_current_mode() == GhostBehaviour.CHASE and not self._renderer.is_kokoro_active(): self.request_path_to_player(self) else: self.game_controller.request_new_random_path(self) return Direction.NONE</code></pre><h2>Animace a textury<br></h2><p>Duchy a Pacmana upravíme tak, aby se místo dosavadních základních geometrických tvarů zobrazovali jako textury, respektive “sprites”. Do <em>MovableObject</em> třídy přidáme proměnnou image a upravíme funkci draw následovně:<span style="font-size:15px;"></span></p><pre> <code class="language-python hljs"># class MovableObject def __init__(self, in_surface, x, y, in_size: int, in_color=(255, 0, 0), is_circle: bool = False): self.image = pygame.image.load('images/ghost.png') def draw(self): self.image = pygame.transform.scale(self.image, (32, 32)) self._surface.blit(self.image, self.get_shape()) </code></pre><p>Referencované obrázky jsou dostupné na mém <a href="https://github.com/janjilecek/pacman_python_pygame" target="_blank">githubu</a>.<br></p><p>Každý duch bude mít jiný obrázek (specifikujeme ve funkci main) a když hráč aktivuje powerup, přepnou se duchové na texturu <em>fright</em>.<span style="font-size:15px;"></span></p><pre> <code class="language-python hljs"># class Ghost def __init__(self, in_surface, x, y, in_size: int, in_game_controller, sprite_path="images/ghost_fright.png"): super().__init__(in_surface, x, y, in_size) self.game_controller = in_game_controller self.sprite_normal = pygame.image.load(sprite_path) self.sprite_fright = pygame.image.load("images/ghost_fright.png") def draw(self): self.image = self.sprite_fright if self._renderer.is_kokoro_active() else self.sprite_normal super(Ghost, self).draw() </code></pre> <img src="/Blog/PublishingImages/Stranky/Pacman2/pacman1.gif" data-themekey="#" alt="" style="width:100%;" /> <p>Animace otevírání a zavírání pusy Pacmana uděláme přes časovanou událost <em>_pakupaku_event</em>, která se volá každých 200ms (implementujeme v kapitole níže). Ta zneguje binární hodnotu mouth_open a podle toho se vykreslí jeden nebo druhý sprite Pacmana.</p><pre> <code class="language-python hljs"># class Hero def __init__(self, in_surface, x, y, in_size: int): super().__init__(in_surface, x, y, in_size, (255, 255, 0), False) self.last_non_colliding_position = (0, 0) self.open = pygame.image.load("images/paku.png") self.closed = pygame.image.load("images/man.png") self.image = self.open self.mouth_open = True def draw(self): half_size = self._size / 2 self.image = self.open if self.mouth_open else self.closed self.image = pygame.transform.rotate(self.image, self.current_direction.value) super(Hero, self).draw() # class GameRenderer def _handle_events(self): if event.type == self._pakupaku_event: if self._hero is None: break self._hero.mouth_open = not self._hero.mouth_open </code> </pre><h2>Koncové stavy hry a textové UI<br></h2><p>Zobrazení stavu hry je na konec jednoduché. Funkcí <em>display_text</em> vykreslíme text o dané velikosti na danou pozici. V hlavní tick funkci zobrazíme na základě výsledku <em>get_won </em>text pro výhru “YOU WON”. Pokud neexistuje objekt hráče - což mohlo nastat jen při “smrti”, když objekt zničíme - tak zobrazíme text “YOU DIED”.</p><pre> <code class="language-python hljs"># class GameRenderer def display_text(self, text, in_position=(32, 0), in_size=30): font = pygame.font.SysFont('Arial', in_size) text_surface = font.render(text, False, (255, 255, 255)) self._screen.blit(text_surface, in_position) def set_won(self): self._won = True def get_won(self): return self._won def tick(self, in_fps: int): black = (0, 0, 0) self.handle_mode_switch() pygame.time.set_timer(self._pakupaku_event, 200) # open close mouth while not self._done: for game_object in self._game_objects: game_object.tick() game_object.draw() self.display_text( f"[Score: {self._score}] [Lives: {self._lives}]") if self._hero is None: self.display_text("YOU DIED", (self._width / 2 - 256, self._height / 2 - 256), 100) if self.get_won(): self.display_text("YOU WON", (self._width / 2 - 256, self._height / 2 - 256), 100) pygame.display.flip() self._clock.tick(in_fps) self._screen.fill(black) self._handle_events() </code></pre> <img src="/Blog/PublishingImages/Stranky/Pacman2/pacman2.gif" data-themekey="#" alt="" style="width:100%;" /> <h2>Závěrem</h2><p>Ve finální části seriálu o vývoji hry Pac-Man v Pythonu jsme se zaměřili na implementaci několika důležitých prvků hry.<br></p><p>Nejprve jsme si ukázali, jak můžeme implementovat kolize s duchy a počítat skóre hráče. Poté jsme se zaměřili na umělou inteligenci duchů, která je důležitá pro realistický pohyb těchto objektů po mapě. Dále jsme se věnovali implementaci power-upů, které mohou hráčům pomoci zvýšit šance na vítězství.<br></p><p>V závěru jsme se podívali na koncové stavy hry a implementovali jsme animace a textury objektů hry. Díky těmto prvkům se nám podařilo vytvořit kompletní prototyp legendární hry Pac-Man. V případě nejasností je můj kód k dispozici na <a href="https://github.com/janjilecek/pacman_python_pygame/blob/main/pacman_final.py" target="_blank">githubu</a>.<br></p><p>Doufám, že vám tento seriál pomohl pochopit, jak vytvořit hru Pac-Man v Pythonu, a že jste se při implementaci dozvěděli něco nového. Pokud máte zájem o další informace o vývoji her v Pythonu, neváhejte se podívat na další <a href="/Blog/Stranky/hra-v-pythonu.aspx" target="_blank">články</a> na našem webu.<br></p><p> <em>Jan Jileček</em><br></p>​<br>odborné;#hobby;#
Jak vytvořit Pacmana v Pythonu - 1. částhttps://create-it.cz/Blog/Stranky/Pacman1.aspxJak vytvořit Pacmana v Pythonu - 1. část<p>​​Pacman je kultovní plošinovka, kterou zná pravděpodobně každý. Jméno “Pac-man" pochází z japonského slova “paku", které označuje otevírání a zavírání úst. Tvůrce Toru Iwatani se inspiroval u japonské pohádky o bytosti, která ochraňuje děti před monstry tím, že monstra požírá. Při tvorbě hry použil jako odrazový můstek klíčová slova z příběhu, a sloveso “jíst" se stalo základem všeho.<br></p><p>Monstra jsou znázorněna jako čtyři duchové, kteří na hráče útočí v postupných vlnách, podobně jako ve Space Invaders. Každý z duchů má také unikátní osobnost. V pohádce je ještě jeden důležitý element, totiž koncept životní síly “kokoro", která bytosti umožňovala požírat monstra. Ve hře je tato energie znázorněna jako power-up cookiesky, které Pacmanovi uděluji krátkodobou schopnost požírat monstra.</p><p>V návodu vás nejprve provedu základním nastavením, pak vytvoříme herní objekty pro zeď bludiště, Pacmana a duchy, zajistíme hledání cesty bludištěm, duchům přidáme náhodný pohyb, u hráče implementujeme ovládání šipkami a nakonec do bludiště rozmístíme jídlo ve formě cookies. Vše budu doprovázet obrázky a gify pro lepší znázornění.</p><h2>Základní nastavení</h2><p>Výsledná hra má přibližně 300 řádků kódu, proto zde uvádím pouze nejdůležitější části. Kód v úplné podobě je dostupný na <a href="https://github.com/janjilecek/pacman_python_pygame/blob/main/pacman.py">mém github repozitáři</a>. Prvním krokem je instalace potřebných balíčků. Budeme potřebovat <em>pygame, numpy </em>a<em> tcod</em>. Nainstalujte si všechny přes nástroj pip (jak na to najdete <a href="/Blog/Stranky/Python-aplikace.aspx">v článku o Python aplikacích</a>). Pokud používáte vývojové prostředí jako např. PyCharm (doporučuji), instalace proběhne po kliknutí na hlášku o chybějícím balíčku.</p><p>Nejprve si vytvoříme herní okno, podobným způsobem jako v <a href="/Blog/Stranky/hra-v-pythonu.aspx">předchozím návodu na hru Space Invaders</a> (ta měla pouhých 100 řádků). Zde připravím parametry pro specifikaci velikosti okna, název hry, obnovovací frekvenci a několik datových polí, které budou držet reference na herní objekty a hráče. Funkce <em>tick </em>všechny herní objekty opakovaně prochází a volá jejich vnitřní logiku a vykreslování. Pak zbývá už jen překreslit celou herní plochu a zajistit zpracování vstupních událostí, jako jsou kliknutí myši a vstup z klávesnice. K tomu bude sloužit funkce <em>_handle_events</em>.</p><pre>​ <code class="language-python hljs"> import pygame # importy balíků import numpy as np import tcod class GameRenderer: def __init__(self, in_width: int, in_height: int): pygame.init() self._width = in_width self._height = in_height self._screen = pygame.display.set_mode((in_width, in_height)) pygame.display.set_caption('Pacman') self._clock = pygame.time.Clock() self._done = False self._game_objects = [] self._walls = [] self._cookies = [] self._hero: Hero = None def tick(self, in_fps: int): black = (0, 0, 0) while not self._done: for game_object in self._game_objects: game_object.tick() game_object.draw() pygame.display.flip() self._clock.tick(in_fps) self._screen.fill(black) self._handle_events() print("Game over") def add_game_object(self, obj: GameObject): self._game_objects.append(obj) def add_wall(self, obj: Wall): self.add_game_object(obj) self._walls.append(obj) def _handle_events(self): pass # dodelame </code> </pre><p></p><p>Vytvoření třídy pro zeď pak bude vypadat jednoduše. Barvu pro zdi volím modrou podle originálního Pacmana (parametr color - Blue 255, zbytek 0). <br></p><pre> <code class="language-python hljs"> class Wall(GameObject): def __init__(self, in_surface, x, y, in_size: int, in_color=(0, 0, 255)): super().__init__(in_surface, x * in_size, y * in_size, in_size, in_color) </code> </pre><p>Kód pro vykreslování a objekt pro zdi máme připraven. Při psaní se ujistěte, že třídy <em>Wall </em>a <em>GameObject </em>jsou nad třídou <em>GameRenderer</em>, aby je třída “viděla". Dalším krokem je vykreslení bludiště na obrazovku. Ale ještě předtím musíme vytvořit jednu pomocnou třídu.<br></p><h2>Třída game controller</h2><p>Bludiště ve formě ASCII znaků uložím do proměnné v nové třídě <em>PacmanGameController</em>. Použiju velikost bludiště jako v originále - 28x31 dlaždic. Později budu muset zajistit, aby duchové mohli správně hledat cestu v bludišti a případně i najít hráče. Bludiště nejprve načtu jako znaky a převedu ho na pole jedniček a nul, kde zeď bude nula a průchodný prostor bude jedna. Tyto hodnoty slouží algoritmu hledání cesty jako tzv. cost funkce. Nula značí nekonečnou cenu průchodu, proto nebudou takto označené položky pole považovány za průchodné. Všimněte si pole <em>reachable_spaces</em>, které drží průchozí části bludiště. K tomu ale až později, jako první musím připravit struktury třídy. Bludiště v ASCII podobě můžete zkopírovat z mého <a href="https://github.com/janjilecek/pacman_python_pygame/blob/main/pacman.py">githubu</a>. Ve znakovém zápisu jsem použil “X" pro zeď, “P" pro Pacmana a “G" pro ducha. </p><pre> <code class="language-python hljs"> class PacmanGameController: def __init__(self): self.ascii_maze = [ "XXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XP XX X", "X XXXX XXXXX XX XXXXX XXXX X", "X XXXX XXXXX XX XXXXX XXXX X", "X XXXX XXXXX XX XXXXX XXXX X", "X X", "X XXXX XX XXXXXXXX XX XXXX X", "X XXXX XX XXXXXXXX XX XXXX X", "X XX XX XX X", "XXXXXX XXXXX XX XXXXX XXXXXX", "XXXXXX XXXXX XX XXXXX XXXXXX", "XXXXXX XX XX XXXXXX", "XXXXXX XX XXXXXXXX XX XXXXXX", "XXXXXX XX X G X XX XXXXXX", " X G X ", "XXXXXX XX X G X XX XXXXXX", # zkraceno pro clanek "XXXXXXXXXXXXXXXXXXXXXXXXXXXX", ] self.numpy_maze = [] self.cookie_spaces = [] self.reachable_spaces = [] self.ghost_spawns = [] self.size = (0, 0) self.convert_maze_to_numpy() #self.p = Pathfinder(self.numpy_maze) # pouzijeme pozdeji def convert_maze_to_numpy(self): for x, row in enumerate(self.ascii_maze): self.size = (len(row), x + 1) binary_row = [] for y, column in enumerate(row): if column == "G": self.ghost_spawns.append((y, x)) if column == "X": binary_row.append(0) else: binary_row.append(1) self.cookie_spaces.append((y, x)) self.reachable_spaces.append((y, x)) self.numpy_maze.append(binary_row) </code> </pre><h2>Vykreslení bludiště</h2><p>Vše nutné pro vykreslení bludiště je připraveno, takže už jen stačí vytvořit instance našich tříd <em>PacmanGameController,</em> projít 2D pole s pozicemi zdí a na těchto místech vytvořit objekt <em>Wall </em>(používám neuvedenou funkci <em>add_wall</em>, opět nahlédněte do úplného kódu na mém <a href="https://github.com/janjilecek/pacman_python_pygame/blob/main/pacman.py">githubu</a>). Obnovovací frekvenci nastavuji na 120 snímků za vteřinu. </p><pre> <code class="language-python hljs"> if __name__ == "__main__": unified_size = 32 pacman_game = PacmanGameController() size = pacman_game.size game_renderer = GameRenderer(size[0] * unified_size, size[1] * unified_size) for y, row in enumerate(pacman_game.numpy_maze): for x, column in enumerate(row): if column == 0: game_renderer.add_wall(Wall(game_renderer, x, y, unified_size)) game_renderer.tick(120) </code> </pre><p style="text-align:center;"> <img src="/Blog/PublishingImages/Stranky/Pacman1/unnamed-3.png" alt="pacman" data-themekey="#" style="max-width:400px;" /><br></p><h2>Přidání duchů</h2><p>V originálním Pacmanovi byli čtyři duchové jmény Blinky, Pinky, Inky a Clyde, každý s individuálním charakterem a schopnostmi. Koncept hry je založen na japonské pohádce (více <a href="https://www.gamedeveloper.com/design/the-pac-man-dossier">zde</a> a <a href="https://gameinternals.com/understanding-pac-man-ghost-behavior">zde</a>) a originální jména v japonštině i naznačují jejich schopnosti (např. Pinky má japonské jméno Lupič, Blinky je zase Stín). Pro naši hru ale nebudeme zacházet do takových detailů a každý z duchů bude používat jen základní behaviorální smyčku jako v originále - tzn. módy <em>Chase</em>, <em>Scatter </em>a <em>Frightened. </em>Tyto AI módy si popíšeme a zpracujeme ve druhém díle.</p><p>Třída pro ducha bude jednoduchá, většinu chování zdědí od rodičovské třídy <em>MovableObject </em>(nahlédněte na <a href="https://github.com/janjilecek/pacman_python_pygame/blob/main/pacman.py">github</a>, ta třída je o něco složitější a obsahuje logiku pro pohyb ve čtyřech směrech, následování trasy a ověřování kolize se zdí). </p><pre> <code class="language-python hljs"> class Ghost(MovableObject): def __init__(self, in_surface, x, y, in_size: int, in_game_controller, in_color=(255, 0, 0)): super().__init__(in_surface, x, y, in_size, in_color, False) self.game_controller = in_game_controller </code> </pre><p> </p><p>Do třídy <em>PacmanGameController</em> přidám hodnoty RGB barev jednotlivých duchů a ve funkci <em>main</em> vygeneruji čtyři barevné duchy. Připravím si také statickou funkci pro převod souřadnic, která jednoduše převede souřadnice bludiště (např. x=16 y=16 je přibližně střed bludiště, a pronásobením s velikostí buňky, neboli tile, dostanu souřadnici na herní ploše v pixelech). </p><pre> <code class="language-python hljs"> # v PacmanGameController self.ghost_colors = [ (255, 184, 255), (255, 0, 20), (0, 255, 255), (255, 184, 82) ] # ve funkci main for i, ghost_spawn in enumerate(pacman_game.ghost_spawns): translated = translate_maze_to_screen(ghost_spawn) ghost = Ghost(game_renderer, translated[0], translated[1], unified_size, pacman_game, pacman_game.ghost_colors[i % 4]) game_renderer.add_game_object(ghost) # obecné funkce pro převod souřadnic, umístěte na začátek kódu def translate_screen_to_maze(in_coords, in_size=32): return int(in_coords[0] / in_size), int(in_coords[1] / in_size) def translate_maze_to_screen(in_coords, in_size=32): return in_coords[0] * in_size, in_coords[1] * in_size </code> </pre><p>V této fázi se již budou po spuštění hry vykreslovat čtyři duchové v bludišti. Dále je chceme rozpohybovat. </p><h1>Hledání cesty bludištěm</h1><p>Nyní přichází možná nejsložitější část. Hledání cesty ve 2D prostoru, nebo grafu, je obtížný problém. Implementovat algoritmus pro vyřešení takového problému by dalo na další článek, proto použijeme hotové řešení. Nejefektivnějším algoritmem pro hledání cesty je <a href="https://cs.wikipedia.org/wiki/A%2a">A* algoritmus</a>. Ten nám poskytne balíček <em>tcod</em>, který jsme instalovali na začátku.</p><p>Vytvořím teď třídu Pathfinder. V konstruktoru inicializuji <em>numpy</em> pole s cenou průchodu (pole jedniček a nul, popsané výše) a vytvořím třídní proměnnou <em>pf, </em>která bude držet instanci A* pathfinderu. Funkce <em>get_path</em> nám pak po zavolání se souřadnicemi v bludišti (odkud, kam) vypočítá a vrátí trasu ve formě jednotlivých kroků polem. </p><pre> <code class="language-python hljs"> class Pathfinder: def __init__(self, in_arr): cost = np.array(in_arr, dtype=np.bool_).tolist() self.pf = tcod.path.AStar(cost=cost, diagonal=0) def get_path(self, from_x, from_y, to_x, to_y) -> object: res = self.pf.get_path(from_x, from_y, to_x, to_y) return [(sub[1], sub[0]) for sub in res] </code> </pre><p>Do funkce <em>main</em> přidám úsek pro demonstraci vyhledání trasy. Volím souřadnice začátku trasy [1,1] a cíle trasy [24,24].<br></p><pre> <code class="language-python hljs"> # Vykreslení cesty red = (255, 0, 0) green = (0, 255, 0) _from = (1, 1) _to = (24, 24) path_array = pacman_game.p.get_path(_from[1], _from[0], _to[1], _to[0]) # print(path_array) # [(1, 2), (1, 3), (1, 4), (1, 5), (2, 5), (3, 5), (4, 5), (5, 5), (6, 5), (6, 6), (6, 7) ... # white = (255, 255, 255) for path in path_array: game_renderer.add_game_object(Wall(game_renderer, path[0], path[1], unified_size, white)) # from_translated = translate_maze_to_screen(_from) game_renderer.add_game_object( GameObject(game_renderer, from_translated[0], from_translated[1], unified_size, red)) # to_translated = translate_maze_to_screen(_to) game_renderer.add_game_object( GameObject(game_renderer, to_translated[0], to_translated[1], unified_size, green)) </code> </pre><p>Ve hře vypadá vykreslení nejkratší trasy takto:</p><div style="text-align:center;"> <img src="/Blog/PublishingImages/Stranky/Pacman1/unnamed.gif" alt="pacman" data-themekey="#" style="max-width:400px;" />  </div><h2>Náhodný pohyb duchů</h2><p>Ve třídě <em>PacmanGameController </em>vytvářím novou funkci pro zvolení náhodného bodu z pole dosažitelných míst <em>reachable_spaces</em>. Každý duch tuto funkci použije po tom, co dorazí do cíle. Jednoduše si tak duchové donekonečna volí cestu ze své aktuální pozice v bludišti do náhodného cíle. Složitější chování, jako útěk a honění hráče, implementujeme v dalším díle. </p><pre> <code class="language-python hljs"> def request_new_random_path(self, in_ghost: Ghost): random_space = random.choice(self.reachable_spaces) current_maze_coord = translate_screen_to_maze(in_ghost.get_position()) path = self.p.get_path(current_maze_coord[1], current_maze_coord[0], random_space[1], random_space[0]) test_path = [translate_maze_to_screen(item) for item in path] in_ghost.set_new_path(test_path) </code> </pre><p>Duchovi přidáme ve třídě <em>Ghost </em>novou logiku pro následování trasy. Funkce <em>reached_target</em> je volaná každý snímek a kontroluje, zda duch již dorazil do cíle. Pokud ano, zjistí jakým směrem je další krok cesty bludištěm a podle toho začne měnit svoji pozici buď nahoru, dolů, doleva nebo doprava (logika pro pohyb je volaná v rodičovské třídě <em>MovableObject</em>). </p><pre> <code class="language-python hljs"> def reached_target(self): if (self.x, self.y) == self.next_target: self.next_target = self.get_next_location() self.current_direction = self.calculate_direction_to_next_target() def set_new_path(self, in_path): for item in in_path: self.location_queue.append(item) self.next_target = self.get_next_location() def calculate_direction_to_next_target(self) -> Direction: if self.next_target is None: self.game_controller.request_new_random_path(self) return Direction.NONE diff_x = self.next_target[0] - self.x diff_y = self.next_target[1] - self.y if diff_x == 0: return Direction.DOWN if diff_y > 0 else Direction.UP if diff_y == 0: return Direction.LEFT if diff_x < 0 else Direction.RIGHT self.game_controller.request_new_random_path(self) return Direction.NONE def automatic_move(self, in_direction: Direction): if in_direction == Direction.UP: self.set_position(self.x, self.y - 1) elif in_direction == Direction.DOWN: self.set_position(self.x, self.y + 1) elif in_direction == Direction.LEFT: self.set_position(self.x - 1, self.y) elif in_direction == Direction.RIGHT: self.set_position(self.x + 1, self.y) </code> <br><br></pre><p>Duchové se teď vytvoří na pozicích určených písmenem “G" v původním ASCII bludišti a začnou si hledat náhodnou cestu. Já jsem zavřel tři duchy do klece - jako v původním Pacmanovi budou vypouštěni postupně - a jeden bloudí bludištěm:</p><p style="text-align:center;"> <img src="/Blog/PublishingImages/Stranky/Pacman1/unnamed-2.gif" alt="pacman" data-themekey="#" style="max-width:400px;" /> <br> </p><h2>Přidání hráče a jeho ovládání</h2><p>Pro hráče dělám třídu Hero. Většina logiky pro ovládání hráče i duchů je řešena ve funkci <em>MovableObject</em>, proto stačí pouze pár funkcí pro upřesnění chování. V originále se Pacman hýbe ve čtyřech směrech, šipkami ovládáme jeho chůzi bludištěm. Pokud nezmáčkneme žádnou směrovou klávesu, bude pokračovat posledním validním směrem. Pokud zmáčkneme klávesu ve směru, kterým ještě nelze jít, směr se uloží a použije se při příští dostupné zatáčce. Stejné chování replikuji do naší hry a přidal jsem i Pacmanovu schopnost teleportovat se z jednoho konce bludiště na druhý - prostě zkontroluji, jestli je mimo herní plochu zleva nebo zprava, a podle toho nastavím jeho pozici na opačnou stranu bludiště. Pacman má taky upravenou funkci pro vykreslování, musíme ho vykreslit s poloviční velikostí, kterou by normálně zabíral jako čtverec (<em>pygame.rect</em>).<br></p><pre> <code class="language-python hljs"> class Hero(MovableObject): def __init__(self, in_surface, x, y, in_size: int): super().__init__(in_surface, x, y, in_size, (255, 255, 0), False) self.last_non_colliding_position = (0, 0) def tick(self): # TELEPORT if self.x < 0: self.x = self._renderer._width if self.x > self._renderer._width: self.x = 0 self.last_non_colliding_position = self.get_position() if self.check_collision_in_direction(self.direction_buffer)[0]: self.automatic_move(self.current_direction) else: self.automatic_move(self.direction_buffer) self.current_direction = self.direction_buffer if self.collides_with_wall((self.x, self.y)): self.set_position(self.last_non_colliding_position[0], self.last_non_colliding_position[1]) self.handle_cookie_pickup() def automatic_move(self, in_direction: Direction): collision_result = self.check_collision_in_direction(in_direction) desired_position_collides = collision_result[0] if not desired_position_collides: self.last_working_direction = self.current_direction desired_position = collision_result[1] self.set_position(desired_position[0], desired_position[1]) else: self.current_direction = self.last_working_direction def handle_cookie_pickup(self): collision_rect = pygame.Rect(self.x, self.y, self._size, self._size) cookies = self._renderer.get_cookies() game_objects = self._renderer.get_game_objects() for cookie in cookies: collides = collision_rect.colliderect(cookie.get_shape()) if collides and cookie in game_objects: game_objects.remove(cookie) def draw(self): half_size = self._size / 2 pygame.draw.circle(self._surface, self._color, (self.x + half_size, self.y + half_size), half_size) </code> </pre><p>Třídu <em>Hero</em> instancuji na konci funkce main. Pozice nastavuji na souřadnici [1,1] - <em>unified_size </em>je velikost jedné dlaždice. Do <em>GameRenderer</em> třídy ještě musíme přidat zpracování vstupních události, abychom mohli herní postavu ovládat.<br></p><pre> <code class="language-python hljs"> # ve třídě GameRenderer def add_hero(self, in_hero): self.add_game_object(in_hero) self._hero = in_hero def _handle_events(self): for event in pygame.event.get(): if event.type == pygame.QUIT: self._done = True pressed = pygame.key.get_pressed() if pressed[pygame.K_UP]: self._hero.set_direction(Direction.UP) elif pressed[pygame.K_LEFT]: self._hero.set_direction(Direction.LEFT) elif pressed[pygame.K_DOWN]: self._hero.set_direction(Direction.DOWN) elif pressed[pygame.K_RIGHT]: self._hero.set_direction(Direction.RIGHT) # na konci funkce main pacman = Hero(game_renderer, unified_size, unified_size, unified_size) game_renderer.add_hero(pacman) game_renderer.tick(120) </code> </pre><p>Po spuštění můžeme Pacmana vodit bludištěm!</p><p style="text-align:center;"> <img src="/Blog/PublishingImages/Stranky/Pacman1/unnamed-3.gif" alt="pacman" data-themekey="#" style="max-width:400px;" /><br></p><h2>Přidání cookies</h2><p>Nebyl by to Pacman bez cookies v bludišti. Z herního hlediska určují míru prozkoumanosti světa a některé cookies i obrací schopnosti duchů a Pacmana. Jsou tedy ultimátní odměnou pro hráče a hlavním ukazatelem jeho postupu úrovní. V dnešních hrách se běžně odměňuje chování, které chce herní designér podporovat ve hráči. Krásným příkladem je např. letošní <em>Elden Ring</em>, kde dostane odměnu každý, kdo prozkoumává všechny kouty světa. Čím nebezpečnější a odlehlejší, tím větší odměna. Naopak hry jako novodobý <em>Assassin's Creed</em> podporují plnění úkolů, takže máte při hraní pocit, že jste v práci, a ne ve hře.</p><p>Přidání cookies bude nejsnadnější věcí celého návodu, a proto jsem ji nechal na konec, jako třešničku na dortu. Vytvořím třídu <em>Cookie</em>. Její instance bude mít vždy velikost čtyři pixely, žlutou barvu a kruhový tvar. Ve funkci main vytvořím cookies na všech dlaždicích, které jsme na začátku uložili do pole <em>cookie_spaces</em> (totožné s <em>reachable_spaces</em>). Hráčovi přidám funkci <em>handle_cookie_pickup</em>, ve které si neustále ověřuji, jestli nedochází ke kolizi hráče s nějakou cookie. Pokud tomu tak je, cookie odstraním z pole a ta se přestane vykreslovat.<br></p><pre> <code class="language-python hljs"> class Cookie(GameObject): def __init__(self, in_surface, x, y): super().__init__(in_surface, x, y, 4, (255, 255, 0), True) # ve třídě GameRenderer přidat: def add_cookie(self, obj: GameObject): self._game_objects.append(obj) self._cookies.append(obj) # ve třídě Hero přidat: def handle_cookie_pickup(self): collision_rect = pygame.Rect(self.x, self.y, self._size, self._size) cookies = self._renderer.get_cookies() game_objects = self._renderer.get_game_objects() for cookie in cookies: collides = collision_rect.colliderect(cookie.get_shape()) if collides and cookie in game_objects: game_objects.remove(cookie) # ve funkci main: for cookie_space in pacman_game.cookie_spaces: translated = translate_maze_to_screen(cookie_space) cookie = Cookie(game_renderer, translated[0] + unified_size / 2, translated[1] + unified_size / 2) game_renderer.add_cookie(cookie) </code> </pre><p>Výsledek našeho snažení:<br></p><p style="text-align:center;"> <img src="/Blog/PublishingImages/Stranky/Pacman1/unnamed-4.gif" alt="pacman" data-themekey="#" style="max-width:400px;" />  </p><p> </p><p>Malá zajímavost za závěr - v originální hře se Pacman zastaví na dobu jednoho snímku po každém požití cookie, takže ho duchové snáze dohoní v počátku hry, když je ještě pole zaplněné. V příštím díle zpracujeme podobnou herní mechaniku a můžete se těšit i na umělou inteligenci duchů, počítání score, zvuky, animace, textury, power-upy, screen-shake efekty, životy a koncové stavy hry.<br></p><p><br></p><p><i>Jan Jileček</i></p><p> <br> </p>​<br>odborné;#hobby;#