... | ... | @@ -27,17 +27,21 @@ Vytvorte si triedu `AbstractSwitchable` nech táto rozširuje `AbstractActor` a |
|
|
|
|
|
Metódy `Toggle(), IsOn(), TurnOn(), TurnOff()` v `Crystal` majú na prvý pohľad veľmi podobnú implementáciu ako aj v `PowerSource`. Rozdiel je len v `UpdateAnimation()` na ktorý sa odkazujú.
|
|
|
|
|
|
Z `Crystal` presuňte `Toggle, IsOn, TurnOn, TurnOff` do `AbstractSwitchable` (samozrejme to vymažte z `PowerSource`). Chýbajúcu `UpdateAnimation()` iba deklarujte ako `abstract` a ponechajte implementácie, ktoré už máte v `Crystal` a `PowerSource` - toto zabezpečí, že budú použité zodpovedajúce implementácie, ale nemusíte zbytočne opakovať kód, ktorý je spoločný.
|
|
|
Z `Crystal` presuňte `Toggle, IsOn, TurnOn, TurnOff` do `AbstractSwitchable` (samozrejme to vymažte z `PowerSource`). Chýbajúcu `UpdateAnimation()` iba deklarujte ako `abstract` a ponechajte implementácie, ktoré už máte v `Crystal` a `PowerSource` - toto zabezpečí, že budú použité zodpovedajúce implementácie, ale nemusíte zbytočne opakovať kód, ktorý je spoločný. __Nastala chyba...__ C# neumožňuje prekrývať ľubovoľné metódy, iba tie, ktoré sú na to označené - keyword `virtual`. Doplňte ho tam.
|
|
|
|
|
|
```csharp
|
|
|
private virtual void UpdateAnimation()
|
|
|
```
|
|
|
|
|
|
_`UpdateAnimation()` nepotrebujete volať z iných tried, teda by mala byť `private` - keďže ale ju chceme prekrývať, tak musí byť minimálne dostupná v triedach potomkov, ale nechceme aby bola verejná. Tu sa nám hodí použiť tretí modifikátor prístupu - `protected` (dostupné iba vrámci triedy a jej potomkov).
|
|
|
|
|
|
## 4.3 base class
|
|
|
|
|
|
Vytvorte si triedu `CrackedCrystal` - bude sa jednať o kryštál, ktorý je poškodený a dá sa rozsvietiť len x-krát. Ako predka(rodiča) zoberte `Crystal`.
|
|
|
|
|
|
Prekryte `TurnOn()` a... máme chybu. C# neumožňuje prekrývať ľubovoľné metódy, iba tie, ktoré sú označené - keyword `virtual`. Upravte teda v `Crystal` signatúru aby ho obsahovala:
|
|
|
Prekryte `TurnOn()` (nezabudnite v `AbstractSwitchable` upraviť deklaráciu aby obsahovala `virtual`)
|
|
|
|
|
|
|
|
|
```csharp
|
|
|
public virtual void TurnOn()
|
|
|
```
|
|
|
|
|
|
Teraz už je možné túto metódu prekryť, tak v `CrackedCrystal` upravte implementáciu tak, aby sa len x-krát zapol, potom sa už nič nestane.
|
|
|
|
... | ... | @@ -72,7 +76,7 @@ public class DerivedClass : BaseClass |
|
|
|
|
|
Nadišiel čas, vševediaci Merlin volá svojho učňa. Predstúp!
|
|
|
|
|
|
Vytvorte si triedu `Player` (rozširuje `AbstractActor`), ako animáciu použite `player.png` a `player_move.png` - v prípade, že sa hráč otočí, použite `Animation.FlipAnimation()`
|
|
|
Vytvorte si triedu `Player` (rozširuje `AbstractActor`), ako animáciu použite `player.png` - v prípade, že sa hráč otočí, použite `Animation.FlipAnimation()` a keď sa nehýbe `Animation.Stop()`
|
|
|
|
|
|
## 4.5 Didst thee forget how to moveth?
|
|
|
|
... | ... | @@ -80,9 +84,9 @@ Ale, ako sa hýbať? |
|
|
|
|
|
Asi najjednoduchšie by bolo priamo do update implementovať čítanie klávesnice a upravovať takto pozíciu. Ale prečo si to trošku neskomplikovať?
|
|
|
|
|
|
Vytvorte si interface `Movable` (nech sa nachádza v namespace `Merlin.Actors`) - tento interface v sebe nebude mať žiadnu funkcionalitu, jedná sa o tzv. marker interface - slúži len na odlíšenie tried.
|
|
|
Vytvorte si interface `IMovable` (nech sa nachádza v namespace `Merlin.Actors`) - tento interface v sebe nebude mať žiadnu funkcionalitu, jedná sa o tzv. marker interface - slúži len na odlíšenie tried.
|
|
|
|
|
|
Nech `Player` implementuje `Movable`
|
|
|
Nech `Player` implementuje `IMovable`
|
|
|
|
|
|
V engine máte definovaný ďalší interface:
|
|
|
|
... | ... | @@ -97,7 +101,11 @@ Jedná sa o základ rovnomenného návrhového vzoru. Teraz si ho implementujeme |
|
|
|
|
|
Vytvorte si priečinok `Commands` a pridajte si do neho triedu `Move` (implementuje `Command`).
|
|
|
|
|
|
Nech je konštruktor deklarovaný nasledovne: `public Move(Movable movable, int step, int dx, int dy)` kde step udáva rýchlosť a dx a dy udávajú smer pohybu. Nezabudnite vykonať typovú kontrolu, či ste dostali objekt, ktorý je aj `Actor`. Ak by to neplatilo, program nesmie pokračovať - vyvolajte chybu (s vhodnou chybovou hláškou):
|
|
|
Nech je konštruktor deklarovaný nasledovne: `public Move(IMovable movable, int step, int dx, int dy)` kde step udáva rýchlosť a dx a dy udávajú smer pohybu.
|
|
|
|
|
|
_Svet používa klasické indexovanie súradníc ako v poli, kde ľavý horný roh má [0,0], X-ová súradnica je vodorovná a rastie doprava, Y-ová je zvislá a rastie smerom dole._
|
|
|
|
|
|
Nezabudnite vykonať typovú kontrolu, či ste dostali objekt, ktorý je aj `Actor`. Ak by to neplatilo, program nesmie pokračovať - vyvolajte chybu (s vhodnou chybovou hláškou):
|
|
|
|
|
|
```csharp
|
|
|
throw new ArgumentException("error message goes here");
|
... | ... | @@ -105,7 +113,7 @@ throw new ArgumentException("error message goes here"); |
|
|
|
|
|
Ak chybu nikde v kóde neošetríme, toto spôsobí, že program spadne - čo je dnes náš cieľ.
|
|
|
|
|
|
V `Execute()` zabezpečte zmenu pozície `Movable` actora - využite metódy `GetX, GetY` a `SetPosition`
|
|
|
V `Execute()` zabezpečte zmenu pozície `IMovable` actora - využite metódy `GetX, GetY` a `SetPosition`
|
|
|
|
|
|
V triede `Player` si na vhodnom mieste (asi konštruktor) inicializujte veci potrebné pre pohyb zabezpečte, aby sa v metóde `Update` vykonalo čítanie z klávesnice a zodpovedajúci pohyb vykonajte pomocou návrhového vzoru command.
|
|
|
|
... | ... | |