Úloha 112: Ciferníky

Cílem je animovat "displej" skládající se s mnoha malých segmentů v podobě ciferníků, kterými se simulují jednoduché znaky (písmena, číslice).

Dials

Základ

Jako základ poslouží projekt 112dials z repository grcis. Je připravena jednoduchá aplikace, ve které se používá třída Simulation obsahující triviální implementace všech důležitých metod: Simulate(), Visualize(), Update(), Reset() a reakce na události myši Mouse*().

V aplikaci uživatel může ovlivnit velikost výsledného obrázku (v pixelech), startovat a zastavovat simulaci, resetovat ji, nastavovat parametry přes řetězec anebo interaktivně do animace zasahovat pomocí levého tlačítka myši.

Přechodové animace

Nechte se inspirovat níže odkazovanými animacemi a zkuste implementovat nějaké zajímavé přechodové animace mezi jednotlivými znaky. Například byste mohli udělat simulaci digitálního budíku - HH:MM, případně i se sekundami HH:MM:SS. Animace v reálném čase!

Alternativna: obecný displej schopný zobrazit libovolný nápis. Při zadání nového textu (přes string param) se může displej pomocí animace překreslit na požadovaný nový nápis.

Inspirace

Několik odkazů na stránky ukazující princip "ciferníkového" displeje:
ARCFLY animace,
Instalace od studia "Humans Since 1982",
Pinterest: time.

Grafické zobrazení

Momentálně je v metodě Visualize() ukázka animace jednoho velkého ciferníku přes celou plochu obrázku. Vy budete muset kreslit větší množství ciferníků (například 4x6 ciferníků na jeden zobrazovaný znak, to už záleží na Vás). Jednotlivé znaky je potřeba simulovat pomocí vhodné orientace velkých a malých ručiček na všech cifernících.

Interakce

V aplikaci je připraven základ pro interaktivní zásahy uživatele do simulace pomocí levého tlačítka myši. Můžete například zasahovat do simulovaného pole, startovat nebo ovlivňovat přechodovou animaci, apod. K dispozici máte obsluhu třech událostí: stisk levého tlačítka myši, uvolnění tlačítka a přesun ukazatele myši (drag).

Co předělat

Typicky budete muset předělat tyto metody:

  • Simulation.Simulate() - provede jeden simulační krok, pouze v paměti, zatím se nic nekreslí. Je na Vás, jestli se zde provede opravdu pouze jeden krok, či zda se nebudete řídit reálnou rychlostí počítače a neuděláte zde kroků více (K simulačních kroků na jeden vizualizační..).
  • Simulation.Visualize() - vizualizace simulace = převod do rastrového obrázku Bitmap. Doporučujeme v zájmu rychlosti použít vektorové kreslení pomocí Graphics nebo při přímém zápisu do bitmapy "unsafe" režim (viz Bitmap.LockBits()). Pozor: vizualizace by neměla žádným způsobem měnit stav simulovaných polí, aplikace ji může volat asynchronně a opakovaně (např. v případě GUI interakce dokonce z jiného vlákna).
  • Simulation.Reset() - nepovinná (ale doporučená) metoda, reinicializuje simulovaný systém.
  • Simulation.Update() - změna parametrů simulace, hodnoty se předávají v řetězci string param.
Při použití interakce též obsluhy událostí:
  • Simulation.MouseDown() - reakce na stisk levého tlačítka myši. Vrací true, jestliže je potřeba překreslit rastrový obrázek (viz Simulation.Visualize()).
  • Simulation.MouseUp() - reakce na uvolnění levého tlačítka myši. Vrací true, jestliže je potřeba překreslit rastrový obrázek (viz Simulation.Visualize()).
  • Simulation.MouseMove() - reakce na pohyb myši. Vrací true, jestliže je potřeba překreslit rastrový obrázek (viz Simulation.Visualize()).

Termín

Odevzdat do: 17. 12. 2017

Body

Základ: 8 bodů (kreslení aspoň omezené množiny znaků, např. číslic),
3 body za přechodové animace,
3 body za rozšířenou sadu znaků,
+ další bonus za invenční řešení, zajímavé prvky nebo animace.

Projekt

Visual Studio projekt: 112dials

Zdrojový soubor

Modifikujte a odevzdejte pouze soubor: Simulation.cs
Do funkce InitParams() napište své jméno!


Copyright (C) 2017 J.Pelikán, last change: 2019-05-09 17:52:59 +0200 (Thu, 09 May 2019)