public interface KreslenieTvaru
Rozhranie používané na kreslenie (vlastných) tvarov robota, začiatočných a koncových značiek spojníc robotov, definíciu kreslenia a export prvkov roja do formátu SVG, prípadne na ďalšie zákaznícky definované účely.
Implementácia tohto rozhrania je vstupom prislúchajúcich metód,
napríklad metódy definovania vlastného tvaru robota: GRobot.vlastnýTvar(tvar)
; metód
na definovanie tvarov značiek spojníc: Spojnica.definujZnačkuZačiatku(kreslenie)
,
Spojnica.definujZnačkuKonca(kreslenie)
a podobne.
Upozornenie: Vlastné kreslenie
tvaru vždy zálohuje vlastnosti robota pred začatím kreslenia
tvaru a obnovuje ich po skončení kreslenia. Pozor však na
spúšťanie automatického prekresľovania počas inicializácie
projektu. Tento proces totiž funguje inak. Preto ak
programujete komplexnejší projekt, tak vždy vypnite automatické prekresľovanie pred
začatím inicializácie a obnovte
ho po dokončení inicializácie projektu, prípadne vytvorte
iný spôsob prekresľovania – pozri napríklad príklad s prekresľovaním v časovači v rámci
opisu metódy nebolPrekreslený.
Inicializácia
totiž spúšťa prekresľovanie iným spôsobom ako pri „klasickom“
prekresľovaní, ktorý nedokáže zálohovať hodnoty vlastností.
Vlastné kreslenie je určené najmä pre komplexnejšie projekty,
pri ktorých sa predpokladá vypnutie automatického
prekresľovania. Zapnuté automatické prekresľovanie je zase
predpokladané pri jednoduchších projektoch, pri ktorých by
zložitejšie mechanizmy boli zbytočnou komplikáciou a bránili
by študentovi priamo vidieť priebeh procesu kreslenia. Tieto
dve roviny fungovania programovacieho rámca nie sú vzájomne
kompatibilné.
Príklad:
import
knižnica.*;public
class
GKruhextends
GRobot
{// Statická inštancia kreslenia vlastného tvaru – statickosť znamená, že
// bude vytvorený jediný objekt pre všetky inštancie triedy GKruh (pozri
// hlavnú metódu nižšie).
public
static
KreslenieTvaru
tvarKruhu =new
KreslenieTvaru
() {public
void
kresli
(GRobot
r) {// Vlastné kreslenie:
r.kruh
(); } };// Konštruktor
private
GKruh() {// Všetky objekty budú mať spoločné kreslenie vlastného tvaru, ktoré
// však bude prispôsobované podľa individuálnych vlastností robotov:
vlastnýTvar
(tvarKruhu); }// Hlavná metóda
public
static
void
main(String
[] args) {// Vytvoríme tri objekty typu GKruh:
GKruh gKruh1 =new
GKruh(); GKruh gKruh2 =new
GKruh(); GKruh gKruh3 =new
GKruh();// Každý umiestnime na náhodnú pozíciu:
gKruh1.náhodnáPoloha
(); gKruh2.náhodnáPoloha
(); gKruh3.náhodnáPoloha
();// Zmeníme mu náhodú farbu:
gKruh1.náhodnáFarba
(); gKruh2.náhodnáFarba
(); gKruh3.náhodnáFarba
();// A určíme mu náhodnú veľkosť v rozmedzí 10
// (čo je aktuálna veľkosť pri jednotkovej mierke) až 30
// (čo je trojnásobok tejto hodnoty):
gKruh1.náhodnáVeľkosť
(3
)); gKruh2.náhodnáVeľkosť
(3
)); gKruh3.náhodnáVeľkosť
(3
)); } }
Výsledok:
Ukážka
možného vzhľadu po vykonaní príkladu
(plátno na
obrázku je zmenšené).
Použitie rozhrania môže vyzerať komplikovane, preto bolo
robotu umožnené zmeniť tvar aj (z hľadiska začínajúceho
programátora) jednoduchším spôsobom. Metódami GRobot
.
kresliTvar
()
alebo GRobot
.
kresliSeba
()
(myslíme tým prekrytie jednej z nich).
Z vnútorného (technického) hľadiska je však činnosť uvedených
metód zabezpečované komplikovanejším mechanizmom s mierne vyššími
režijnými nákladmi na vykonávanie, preto skúsenejším programátorom
odporúčame využitie tohto rozhrania.
Táto verzia programovacieho rámca je závislá od použitia
verzie Javy 8. V tejto verzii Javy sa dá použiť aj skrátená
(funkcionálna) syntax kreslenia vlastného tvaru s použitím
tohto rozhrania. Ide o takzvaný lambda výraz (priamo vo volaní
metódy robota vlastnýTvar
, ako to ukazuje nasledujúci príklad, ho odporúčame
použiť iba v prípade unikátneho kreslenia tvaru jedinej
inštancie robota, keďže pri každom takomto použití by bola
vytvorená unikátna inštancia implementácie rozhrania, čím by
sa strácal celkový zmysel jeho použitia):
vlastnýTvar
((GRobot
r) -> r.krúžok
());
Prípadne, ak „jednoducho vieme,“ že r
je robot
a nepotrebujeme to dávať najavo nikomu tretiemu, tak môžeme
zápis ešte viac skrátiť:
vlastnýTvar
(r -> r.krúžok
());
Viac príkazov kreslenia je potrebné uzavrieť do bloku:
vlastnýTvar
(r -> { r.kružnica
(); r.dopredu
();// …
});
A nakoniec, lambda výraz je použiteľný aj priamo na univerzálnu implementáciu rozhrania použiteľnú s viacerými inštanciami robota:
GRobot
prvý =new
GRobot
();GRobot
druhý =new
GRobot
();GRobot
tretí =new
GRobot
();// …
KreslenieTvaru
tvar = r -> { r.kružnica
(); r.dopredu
();// …
}; prvý.vlastnýTvar
(tvar); druhý.vlastnýTvar
(tvar); tretí.vlastnýTvar
(tvar);// …
GRobot.vlastnýTvar(KreslenieTvaru)
Modifikátor a typ | Metóda a opis |
---|---|
void |
kresli(GRobot r)
Jediná metóda rozhrania určená na vykonanie určenej činnosti
(napríklad kreslenie vlastného tvaru robota, zabezpečenie exportu
prvkov do externého formátu a podobne).
|
void kresli(GRobot r)
Jediná metóda rozhrania určená na vykonanie určenej činnosti
(napríklad kreslenie vlastného tvaru robota, zabezpečenie exportu
prvkov do externého formátu a podobne). Prijíma parameter typu
GRobot
, teda objekt (inštanciu) robota, ktorý má
primárne slúžiť na vykonanie alebo podporu vykonania určenej
činnosti – kreslenie vlastného tvaru, kreslenie značiek spojníc,
kedy je automaticky použitý zdrojový
alebo cieľový robot) a podobne.
V prípade kreslenia vlastného tvaru dodržujte zásadu, že kreslenie
má byť čo najjednoduchšie a malo by využívať len metódy kreslenia
inštancie „r“ prijatej v argumente tejto metódy.
Príklad:
vlastnýTvar
(new
KreslenieTvaru
() {public
void
kresli
(GRobot
r) {// Vždy modrá kružnica s „nosom“
r.farba
(modrá
); r.kružnica
(); r.dopredu
(2
* r.veľkosť
()); } });
Ukážka
vzhľadu.
Poznámky: Niektoré metódy upravujú
v rámci kreslenia vlastného tvaru svoje správanie. Napríklad
skupina metód domov
vráti a otočí robot
do aktuálnej pozície a smeru – to jest do polohy a smeru v čase
začatia vlastného kreslenia a to bez ohľadu na to, ako je
v skutočnosti definovaný aktuálny domov robota. Metódy uhol
, smer
, uholDoma
a smerDoma
vracajú hodnotu upravenú o aktuálne pootočenie tvaru (pozri metódu
pootočenieTvaru
).
Dôležitou informáciou je tiež to, že hodnoty takmer všetkých
(dostatočne elementárnych) vlastností ako poloha, smer, stav pera
(a mnoho iných) sú pred začatím kreslenia vlastného tvaru robota
zálohované a po dokončení tejto činnosti sú opätovne vrátené do
pôvodného stavu. Pero robota je pri začatí kreslenia vlastného tvaru
vždy položené bez ohľadu na jeho
skutočný stav a tiež je (bez ohľadu na skutočný stav) zapnuté
kreslenie tvarov robotom.
Zálohovanie sa nevzťahuje na iné použitia tohto rozhrania (napríklad
kreslenie roja kresliacim robotom). Každé iné použitie tohto rozhrania
má svoje vlastné pravidlá.
r
– inštancia robota použitý na vykonanie určenej činnosti
alebo jej podporu (nakreslenie vlastného tvaru a pod.);
v prípade kreslenia vlastného tvaru je to presne tá inštancia,
ktorá požaduje kreslenie vlastného tvaru