Tento a příští domácí úkol spolu budou volně spojeny, jejich společným tématem je herní engine.
Hlavními rozhraními tohoto úkolu jsou rozhraní Movable, resp. Actuator: rozhraní Movable reprezentuje objekty, které se mohou pohybovat, a rozhraní Actuator reprezentuje objekty, které hýbou nějakými jinými objekty.
interface Movable { /** Vrati aktualni polohu. */ Pair<Integer, Integer> getPosition(); /** Pohne timto objektem o dx pixelu doprava a dy dolu. */ void move(int dx, int dy); } interface Actuator { /** Pohne objektem v parametru. */ void actuate(Movable movable); } /** Instance tridy Pair reprezentuji dvojice hodnot. */ class Pair<A, B> { final A first; final B second; public Pair(A first, B second) { this.first = first; this.second = second; } }
Vaším úkolem je dopsat kód tříd Up, Down, Left, Right, ParallellyComposingActuator a AmplifyingActuator podle následující specifikace:
Up při jednom volání metody actuate pohne zadaným objektem o jeden pixel nahoru,
Down pohne zadaným objektem o jeden pixel dolů,
Left pohne zadaným objektem o jeden pixel doleva,
Right pohne zadaným objektem o jeden pixel doprava,
ParallellyComposingActuator sečte pohyby všech aktuátorů zadaných v konstruktoru do jednoho a
AmplifyingActuator zopakuje pohyb aktuátorem zadaným v konstruktoru factor-krát.
class Up implements Actuator { @Override public void actuate(Movable movable) { } } class Down implements Actuator { @Override public void actuate(Movable movable) { } } class Left implements Actuator { @Override public void actuate(Movable movable) { } } class Right implements Actuator { @Override public void actuate(Movable movable) { } } class ParallellyComposingActuator implements Actuator { public ParallellyComposingActuator(ImmutableList<Actuator> motors) { } @Override public void actuate(Movable movable) { } } class AmplifyingActuator implements Actuator { public AmplifyingActuator(Actuator motor, int factor) { } @Override public void actuate(Movable movable) { } }
Chování třídy SequentiallyComposingActuator je malinko složitější. Tato třída v konstruktoru dostane (nekonečný) seznam dvojic (predikát, aktuátor). Aktuátor z první dvojice vrácené iterátorem používá pro pohyb zadaného objektu tak dlouho, dokud první predikát na zadaném objektu vrací true. Poté přejde na druhou dvojici, pak na třetí atd.
class SequentiallyComposingActuator implements Actuator { public SequentiallyComposingActuator(Iterable<Pair<Predicate<Movable>, Actuator>> iterable) { } @Override public void actuate(Movable movable) { } }
Nakonec naimplementujte metody Homework5.getFirstActuator, Homework5.getSecondActuator a Homework5.getThirdActuator:
Homework5.getFirstActuator vrátí aktuátor, který zadaným objektem pohne o jeden pixel doprava a o jeden pixel nahoru,
Homework5.getSecondActuator vrátí aktuátor, který zadaným objektem pohne o jeden pixel doleva, pokud uživatel stiskl klávesu doleva (indikováno metodou Keyboard.leftArrowPressedDown), o jeden pixel doprava, pokud uživatel stiskl klávesu doprava (indikováno metodou Keyboard.rightArrowPressedDown) a nepohne nikam, pokud uživatel nestiskl ani jednu z kláves nebo stiskl obě naráz,
Homework5.getThirdActuator(Actuator firstActuator, Actuator secondActuator) vrátí aktuátor, který pro pohyb střídá dva zadané aktuátory - nejprve desetkrát použije firstActuator, potom dvacetkrát secondActuator, pak opět desetkrát firstActuator atd.
class Keyboard { static boolean leftArrowPressedDown() { /* kod */ } static boolean rightArrowPressedDown() { /* kod */ } } class Homework5 { static Actuator getFirstActuator() { } static Actuator getSecondActuator() { } static Actuator getThirdActuator(final Actuator firstActuator, Actuator secondActuator) { } }
Odevzdávaný kód (tzn. třídy Up, Down, Left, Right, ParallellyComposingActuator, AmplifyingActuator, SequentiallyComposingActuator a Homework5) uložte do svého repozitáře do adresáře homeworks/Homework5.java. Třídu Keyboard neodevzdávejte, dodá si ji testovací systém. Pro tento úkol potřebujete knihovnu Guava. Dokumentaci k Predicate naleznete zde. Termín odevzdání je 22. 5. 2016 ve 24:00.
~~DISCUSSION:off~~