Projekt Obrázek strana 135



Podobné dokumenty
Obrázek. Základní popis, zadání úkolu. Struktura tříd,

15. Projekt Kalkulačka

20. Projekt Domácí mediotéka

17. Projekt Trojúhelníky

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

8 Třídy, objekty, metody, předávání argumentů metod

19. Projekt Adventura

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Více o konstruktorech a destruktorech

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Projekt Škola strana 179

Programování v jazyku LOGO - úvod

Comenius Logo. Úterý 20. března. Princip programování. Prostředí Comenius Logo

Konstruktory a destruktory

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

DUM 06 téma: Tvorba makra pomocí VBA

Algoritmizace a programování

1. Dědičnost a polymorfismus

Principy objektově orientovaného programování

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Objektově orientované programování v jazyce Python

Třída DrawingTool. Obrázek 1: Prázdné okno připravené pro kreslení

11. Dědičnost. Dědičnost strana 103

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Z. Kotala, P. Toman: Java ( Obsah )

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

7. Datové typy v Javě

Objektově orientované programování v jazyce Python

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Výčtový typ strana 67

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

Programátorská dokumentace

Java - Kresba. 2/28/11 1/8 Java - kresba

Dalším příkladem může být například výstup dat na různá zařízení, souborů, grafických rozhraní, sítě atd.

Mezinárodní kolo soutěže Baltík 2010, kategorie C a D

Comenius Logo. Princip programování. Prostředí Comenius Logo

KAPITOLA 3 - ZPRACOVÁNÍ TEXTU

Střední průmyslová škola strojnická Olomouc, tř.17. listopadu 49

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Generické programování

Úvod do programovacích jazyků (Java)

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Př. program s popojíždějícím autíčkem o 50 pixelů při každém stisku Popojeď

KTE / ZPE Informační technologie

Závěrečná práce. AutoCAD Inventor (Zadání D1)

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++

IRAE 07/08 Přednáška č. 1

02. HODINA. 2.1 Typy souborů a objektů. 2.2 Ovládací prvky Label a TextBox

ALGORITMIZACE PRAKTICKÉ

PŘETĚŽOVÁNÍ OPERÁTORŮ

Programování v Javě I. Únor 2009

Kombinované úlohy - cvičení

Programování v C++ 3, 3. cvičení

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

Teoretické minimum z PJV

Obsah přednášky. Příkaz for neúplný. Příkaz for příklady. Cyklus for each (enhanced for loop) Příkaz for příklady

Programování II. Návrh programu I 2018/19

Programování v Javě I. Leden 2008

1. Programování proti rozhraní

24. listopadu 2013, Brno Připravil: David Procházka

1. Projekt Kalkulačka

Kreslící program. V této lekci se naučíš vytvořit si vlastní kreslící program! Následujte postupně tyto INSTRUKCE

MRBT. Stacionární průmyslový robot EPSON C3 aplikace pro prezentaci

Svolávací systém Uživatelský manuál

Název: VY_32_INOVACE_PG4113 Relativní pozicovaní a jeho využití

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 7

Tvorba fotogalerie v HTML str.1

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Copyright 2013 Martin Kaňka;

OOPR_05. Případové studie

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Nástroje v InDesignu. Panel nástrojů 1. část. Nástroje otevřeme Okna Nástroje

Př. další použití pointerů

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

Nejzajímavější jsou události MouseDown a KeyDown.

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Mělká a hluboká kopie

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Metodický list k didaktickému materiálu

Nastavení a ovládání aplikace ifoxtrot

TÉMATICKÝ OKRUH Softwarové inženýrství

Abstraktní datové typy: zásobník

Registrační číslo projektu: CZ.1.07/1.5.00/ Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost

Tvorba aplikace pro porovnání map

3. Třídy. Základní pojmy objektového programování. Třídy

Macromedia Flash 8. Druhy animace: Snímek po snímku. F5 vložit snímek (insert frame) F6 vložit klíčový snímek (insert key frame)

1. Téma 12 - Textové soubory a výjimky

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Paměť počítače. alg2 1

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Vývojové nástroje jazyka Java

Objektové programování

Regionální kolo soutěže Baltík 2008, kategorie A a B

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Jazyk C# (seminář 6)

Transkript:

Projekt Obrázek strana 135 14. Projekt Obrázek 14.1. Základní popis, zadání úkolu Pracujeme na projektu Obrázek, který je ke stažení na http://java.vse.cz/. Po otevření v BlueJ vytvoříme instanci třídy Obrazek a zavoláme metodu kresli(). Výsledkem je obrázek domečku: Obrázek 14.1 Obrázek domečku z projektu Obrázek Naším úkolem je: přidat do obrázku sluníčko, doplnit obsah metody, po jejímž zavolání projede na obrázku před domečkem auto, doplnit metodu pro východ slunce a metodu pro západ slunce. Tento projekt má následující cíle: ukázat doplnění datového atributu (slunce) a příslušného kódu do projektu, na třídě Auto ukázat, že pro vytvoření instance (objektu) může být více konstruktorů, na doplnění auta do obrázku ukázat rozdíl mezi lokální proměnnou a datovým atributem, ukázat, jak doplnit obsah předpřipravené metody (prujezdauta()), ukázat, jak doplnit celé metody (vychodslunce() a zapadslunce()), ukázat volání jiné metody stejné instance (volání setcernobily() v metodě zapadslunce()). 14.2. Struktura tříd Projekt Obrázek se skládá ze šesti tříd: Platno tato třída představuje prostor (plátno), na kterém se vykreslují jednotlivé tvary, Kruh, Ctverec, Trojuhelnik toto jsou jednotlivé tvary, které se kreslí na plátno, lze s nimi po plátně pohybovat, měnit jejich velikost a barvu, Auto obdoba předchozích tříd na plátně se vykreslí auto, Obrazek představuje obrázek domečku vykreslí dva čtverce (zeď a okno) a jeden trojúhelník na plátně.

Projekt Obrázek strana 136 Následuje diagram tříd (obrázek z BlueJ): Obrázek 14.2 Diagram tříd projektu Obrázek, převzato z BlueJ 14.3. Popis metod jednotlivých tříd Nejprve popíšeme metody tříd Auto, Ctverec, Kruh a Trojuhelnik. Třídu Platno podrobně popisovat nebudeme, třída zajišťuje plochu o velikosti 300x300 bodů pro vykreslování jednotlivých instancí tříd Auto, Ctverec, Kruh, Trojuhelnik a Obrazek. Jedna instance této třídy je společ ná pro všechny vykreslované tvary. třída konstruktor popis konstruktoru Ctverec Ctverec() vytvoří červený čtverec o straně 30 bodů na souřadnicích 60,50 a vykreslí ho na plátno Kr uh Kruh() vytvoří modrý kruh o průměru 30 bodů na souřadnicích 20,60 a vykreslí ho na plátno Trojuhelnik Trojuhelnik() vytvoří zelený trojúhelník o šířce 40 a výšce 30 bodů na souřadnicích 50,15 a vykreslí ho na plátno Auto Auto() vytvoří modré auto na souřadnicích 60,40 a vykreslí ho na plátno Auto(int xpozice,int ypozice ) Tabulka 14.1 Přehled konstruktorů tříd projektu vytvoří modré auto na zadaných souřadnicích

Projekt Obrázek strana 137 metoda posunvpravo() posunvlevo() popis metody posune daný tvar o 20 bodů vpravo posune daný tvar o 20 bodů vlevo p osunnahoru() posune daný tvar o 20 bodů nahoru posundolu() posunhorizontalne(int vzdalenost) posune daný tvar o 20 bodů dolu posune daný tvar o zadaný počet bodů (+ vpravo, vlevo) posunvertikalne(int vzdalenost) posune vertikálně daný tvar o zadaný počet bodů (+ dolů, nahoru) pomaluposunhorizontalne(int pomalé posunutí tvaru o zadaný počet bodů horizontálně vzdalenost) pomaluposunvertikalne(int pomalé posunutí tvaru o zadaný počet bodů vertikálně vzdalenost) zmenvelikost(int novavelikost) změní velikost daného tvaru, tato metoda neexistuje u třídy Auto (plátno umí nakreslit jen jednu velikost auta) zmenbarvu(string novabarva) změní barvu zadaného tvaru Tabulka 14. 2 Přehled metod tříd Kruh, Ctverec, Trojuhelnik a Auto Vysvětlíme si následující část kódu s instancí třídy Ctverec: Ctverec zed; zed = new Ctverec(); zed.posunvertikalne(80); zed.zmenvelikost(100); Na prvním řádku je deklarace proměnné zed typu Ctverec, na druhém řádku se vytvoří instance t řídy Ctverec (zavolá se konstruktor) a odkaz se uloží do proměnné zed čtverec se nakreslí na plátno. Na třetím řádku se instanci čtverce pošle zpráva, aby se posunula vertikálně o 80 bodů doprava u instance, na kterou odkazuje proměnná zed se zavolá metoda posunvertikalne(80). Na čtvrtém řádku se zvětší velikost strany čtverce na velikost 100 bodů. 14.4. Kód třídy Obrazek 1 /** 2 * Tato tř ída reprezentuje jednoduchý obrázek. 3 * Obráze k se nakreslí po zavolání metody kresli. 4 * Obrázek může být změněn - můžete ho upravit na černobílý 5 * a zpět na barevný. 6 * Tato třida je napsána jako jeden z prvních příkladů 7 * pro výuku Javy v BlueJ. 8 * 9 * @author Michael Kolling 10 * @author Luboš Pavlíček 11 * @version 1.0 (15 July 2000) 12 * @version 1.1cz (30 July 2004) 13 */

Projekt Obrázek strana 138 14 public class Obrazek { 15 private Ctverec zed; 16 private Ctverec okno; 17 private Trojuhelnik strecha; 18 19 /** 20 * Konstruktor pro vytvoření instance třídy Obrazek 21 */ 22 public Obrazek() { 23 // zde není žádný obsah 24 // datové atributy mají automaticky počáteční hodnotu null 25 // a vlastní kreslení obrázku 26 //(a tim i inicializace datových atributů) 27 //je v metodě kresli() 28 } 29 /** 30 * Nakreslí obrázek. 31 */ 32 public void kresli() { 33 zed = new Ctverec(); 34 zed.posunvertikalne(80); 35 zed.zmenvelikost(100); 36 37 okno = new Ctverec(); 38 okno.zmenbarvu("cerna"); 39 okno.posunhorizontalne(20); 40 okno.posunvertikalne(100); 41 42 strecha = new Trojuhelnik(); 43 strecha.zmenvelikost(50, 140); 44 strecha.posunhorizontalne(60); 45 strecha.posunvertikalne(70); 46 } 47 48 /** 49 * změní obrázek na černobílý 50 */ 51 public void setcernobily() { 52 if (zed!= null) { // pouze pokud je již nakreslen 53 zed.zmenbarvu("cerna"); 54 okno.zmenbarvu("bila"); 55 strecha.zmenbarvu("cerna"); 56 } 57 } 58 59 /** 60 * změní obrázek zpět na barevný 61 */ 62 public void setbarevny() { 63 if (zed!= null) { // pouze pokud je již nakreslen domeček 64 zed.zmenbarvu("cervena"); 65 okno.zmenbarvu("cerna"); 66 strecha.zmenbarvu("zelena"); 67 } 68 } 69

Projekt Obrázek strana 139 70 /** 71 * při zavolání této metody by mělo před domečkem projet auto 72 */ 73 public void prujezdauta() { 74 if (zed!= null) { // pouze pokud je již nakreslen domeček 75 // ZDE DOPLNIT PŘÍSLUSNÝ KÓD 76 } 77 } 78 } Třída Obrazek má tři datové atributy (viz řádky 15 až 17 kódu): zed a okno typu Ctverec, atribut strecha typu Trojuhelnik. Tyto datové atributy vyjadřují základní prvky, ze kterých je sestaven obrázek. Na rozdíl od tříd Ctverec, Kruh a Trojuhelnik se instance třídy Obrazek nezobrazí na plátně po zavolání konstruktoru, ale až po zavolání metody kresli(). Konstruktor třídy Obrazek je proto prázdný. Metoda kresli() vytvoří instance jednotlivých částí obrázku, nastaví jejich umístění, velikost a barvu pomocí příslušných metod. Metody pro změnu na černobílý (metoda setcernobily() na řádcích 51 až 57) a barevný (metoda setbarevny() na řádcích 62 až 67) překreslují již vytvořený obrázek. Podmínka na začátku každé z těchto metod zjišťuje, zda je již nakreslena zeď (tj. zda byla vytvořena instance v metodě kresli() a uložena do proměnné zed). Pokud zavoláte metodu setbarevny() nebo metodu setcernobily() před zavoláním metody kresli(), nic se nestane. 14.5. Postup řešení 14.5.1. Dokreslení obrázku (přidání slunce) Naším prvním úkolem je přidat do obrázku slunce, které bude v této fázi řešení na obrázku neustále na jednom místě. Při změně na černobílý obrázek nebude slunce zobrazeno (je noc) barva slunce se změní na bílou. Slunce bude reprezentováno datovým atributem typu Kruh. Ve třídě Obrazek v části deklarace datových atributů (řádky 15 až 17 kódu) přibude následující řádek: private Kruh slunce; Metoda kresli() se doplní o vytvoření instance třídy Kruh a změnu barvy, velikosti a umístění této instance. Kód by mohl vypadat takto: slunce = new Kruh(); slunce.zmenbarvu("zluta"); slunce.posunhorizontalne(180); slunce.posunvertikalne(-50); slunce.zmenvelikost(60); Po přeložení, vytvoření instance třídy Obrazek a spuštění metody kresli() se zobrazí následující obrázek:

Projekt Obrázek strana 140 Obrázek 14.3 Vzhled obrá zku po přidání slunce Po úspěšném přeložení třídy Obrazek si všimněte, že se změnil diagram tříd zobrazený v BlueJ automaticky přibyla vazba užití od třídy Obrazek ke třídě Kruh, neboť ve třídě Obrazek se nyní používá třída Kruh. Ještě je potřeba upravit metody setcernobily() a setbarevny(). Do metody s etcernobily() přidáme řádek se změnou barvy slunce na bílou (nebude na bílém pozadí vidět) a v metodě setbarevny() řádek se změnou barvy slunce na žlutou. 14.5.2. Průjezd auta Pro ře šení druhého úkolu byla již ve zdrojovém kódu třídy Obrazek předpřipravena metoda prujezdau ta(), při jejím zavolání by před domečkem mělo projet auto. Je potřeba se rozhodnout, zda vytvořená instance třídy Auto bude datovým atributem či lokální prom ěnnou. Auto bude na obrázku pouze tehdy, když bude spuštěna tato metoda; nebude potřeba v žádné jiné metodě, při novém zavolání metody může vzniknout a projet nové auto. Z toho vyplývá, že instance třídy Auto může být lokální proměnná metody. V metodě prujezdauta() vytvoříme instance třídy Auto a zavoláme metodu pro jeho pomalý posun. Kód metody prujezdauta() vidíte v následujícím výpisu: 1 public void prujezdauta() { 2 if (zed!= null) { // pouze pokud je již nakreslen domeček 3 Auto ford = new Auto(0,240); 4 ford.pomaluposunhorizontalne(300); 5 } 6 } Animace auta je velmi nedokonalá při průjezdu auto bliká, při nesprávném umístění bude auto umazávat domeček atd. V rámci tohoto jednoduchého příkladu však tyto problémy nebudeme řešit, jejich odstranění by vyžadovalo použití vícevrstvého plátna. Po úspěšném přeložení třídy Obrazek se do diagramu tříd zobrazeného v BlueJ promítne další změna, přibude vazba užití od třídy Obrazek ke třídě Auto. 14.5.3. Východ a západ slunce Pro práci se sluncem si lze vytvořit dvě představy: každé ráno vznikne nové slunce, při západu slunce zaniká (pohled země-placka ) v této variantě v metodě vychodslunce() vzniká instance třídy Kruh, která představuje slunce,

Projekt Obrázek strana 141 v metodě zapadslunce() tato instance zaniká. Instance kruhu se vytváří také na začátku (v metodě kresli()), neboť se začíná dnem a ne nocí, slunce obíhá kolem dokola, večer zapadne, ráno vyjde (pohled geocentrický 34 ) v této variantě vzniká pouze jedna instance, při západu slunce se příslušný kruh přesune mimo viditelnou část plátna, při východu se přesune na viditelnou část plátna. Řešení metod ve variantě země-placka by mohlo vypadat následovně: 1 /** 2 * Při zavolání metody vyjde slunce, pokud již není na obloze. 3 */ 4 public void vychodslunce() { 5 if (slunce == null) {//zapadlé slunce se pozná dle hodnoty null 6 slunce = new Kruh(); 7 slunce.zmenbarvu("zluta"); 8 slunce.posunhorizontalne(-60); 9 slunce.posunvertikalne(-10); 10 slunce.zmenvelikost(60); 11 slunce.pomaluposunhorizontalne(60); 12 setbarevny(); // slunce je již na obrázku, nastává den 13 slunce.pomaluposunhorizontalne(180); 14 } 15 } 16 17 /** 18 * Při zavolání metody zapadne slunce, pokud je na obloze. 19 */ 20 public void zapadslunce () { 21 if (slunce!= null) { // slunce již musí existovat 22 slunce.pomaluposunhorizontalne(90); 23 setcernobily(); 24 slunce.pomaluposunhorizontalne(30); 25 slunce=null; // zde se zruší odkaz na instanci slunce 26 } 27 } V metodě vychodslunce() nejprve zjistíme, jestli je slunce na obrázku nebo ne (řádek 5 výpisu). Poku d na obrázku žádné slunce není (proměnná slunce odkazuje na hodnotu null), vytvoříme instanci třídy Kruh, nastavíme barvu, posuneme kruh na kraj plátna a změníme jeho velikost (řádky 6 až 10 výpisu). Poté spustíme animaci východu slunce pomocí metody p omaluposunhorizontalne(). Slunce popojde kousek po obrázku a nastane den pro obarvení obrázku zavoláme metodu setbarevny(). Na řádku 13 slunce pokračuje ve svém pohybu po obloze. Metoda pro západ slunce je velmi podobná. Pokud je slunce na obrázku (proměnná slunce odkazuje na instanci, tj. nemá hodnotu null), začne se pohybovat, obrázek se změní s barevného na černobílý a slunce zapadne úplně. Poté je instance zrušena, protože odkaz na ni je nastaven na hodnotu null. 34 Pohled heliocentrický je pro naši úlohu obtížně použitelný, neboť obrázek je kreslen z perspektivy uživatele na zemi.

Projekt Obrázek strana 142 Povšimněte si, že pokud spouštíme jinou metodu z téže třídy, uvádíme pouze název metody a případné parametry. Metoda bude spuštěna na té instanci, která spouští metodu obsahující toto volání (instance pošle zprávu sama sobě). Na řádku 12 výpisu se obrázek změní z černobílého na barevný provedou se na tomto místě všechny příkazy obsažené v metodě setbarevny(). Volání metody stejné instance by správně mělo obsahovat odkaz na sebe sama pomocí slova this: this.setbarevny(); Java programátorovi usnadňuje práci tím, že nevyžaduje zápis pomocí this překladač toto přiřazení do výsledného kódu doplní sám. V geocentrické variantě je potřeba pomocí dalšího datového atributu sledovat, zda je den či noc použijeme datový atribut jeden typu boolean, který bude mít hodnotu true, pokud je den a false, pokud je noc. Instance třídy Kruh představující slunce vzniká pouze jednou, a to v metodě kresli(). V noci (na konci metody zapadslunce()) se slunce přesune kolem zeměkoule na svoji výchozí pozici na východě. Deklarace a inicializace by mohla vypadat následovně: private boolean jeden; // datový atribut... public void kresli() {... jeden = true; // nastavení počáteční hodnoty // v metodě kresli... } Vlastní kód metod zapadslunce() a vychodslunce() bude vypadat následovně: 1 public void zapadslunce () { 2 if (jeden) { // je den 3 slunce.pomaluposunhorizontalne(80); 4 setcernobily(); 5 slunce.pomaluposunhorizontalne(20); 6 slunce.posunhorizontalne(-360); // posunu do výchozí pozice 7 jeden = false; // poznačím si, že je noc 8 } 9 } 10 public void vychodslunce() { 11 if (! jeden) { // je noc 12 slunce.pomaluposunhorizontalne(20); 13 setbarevny(); // slunce je již na obrázku, nastává den 14 slunce.pomaluposunhorizontalne(240); 15 jeden = true; // poznačím si, že je den 16 } 17 } 14.6. Domácí úkoly 1. Přidejte do projektu metody pro příjezd a odjezd auta. 2. Nakreslete si vlastní obrázek, např. sněhuláka či stromek.