Search
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.
Movable
Actuator
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
Down
Left
Right
ParallellyComposingActuator
AmplifyingActuator
actuate
factor
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.
SequentiallyComposingActuator
true
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
Homework5.getSecondActuator
Homework5.getThirdActuator
Keyboard.leftArrowPressedDown
Keyboard.rightArrowPressedDown
Homework5.getThirdActuator(Actuator firstActuator, Actuator secondActuator)
firstActuator
secondActuator
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.
Homework5
homeworks/Homework5.java
Keyboard
~~DISCUSSION:off~~