====== Pátý domácí úkol ======
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 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 {
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:
* instance třídy ''Up'' při jednom volání metody ''actuate'' pohne zadaným objektem o jeden pixel nahoru,
* instance třídy ''Down'' pohne zadaným objektem o jeden pixel dolů,
* instance třídy ''Left'' pohne zadaným objektem o jeden pixel doleva,
* instance třídy ''Right'' pohne zadaným objektem o jeden pixel doprava,
* instance třídy ''ParallellyComposingActuator'' sečte pohyby všech aktuátorů zadaných v konstruktoru do jednoho a
* instance třídy ''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 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, 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 [[http://search.maven.org/remotecontent?filepath=com/google/guava/guava/16.0.1/guava-16.0.1.jar|Guava]]. Dokumentaci k Predicate naleznete [[http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Predicate.html|zde]]. Termín odevzdání je 22. 5. 2016 ve 24:00.
~~DISCUSSION:off~~