На этом уроке мы сделаем анимацию раскладывания всех плашек домино на столе. Для этого напишем метод RollDomino(), а ещё нам потребуется отлавливать момент, когда все доминошки уже выложены на стол. Для этого мы добавим поле string mode, чтобы в таймере отловить этот момент.
Дата отправки отчёта:
10 июня 2015 г.
Задание выполнено: за
25 мин.
Чему научился:
Модифицировать метод RollDomino.
Что было сложным:
Ничего
Комментарии:
Сделал рандомное появление плашек домино - отдельно слева и справа.
Научился: Так как работа анимации привязана к таймеру и не зависит от основного потока управления программы, то научился определять момент завершения анимации, с помощью проверки статуса stopped. Трудности: Придумать свой вариант анимации, в моем случае четные строки появляются слева, нечетные справа. В начале урока был разговор об альтернативных вариантах дизайна классов анимаций. На мой взгляд, анимация это некий процесс, действие, которое не привязано к домино. Текущий дизайн не позволяет мне использовать эту иерархию классов для того же самого Аполлона, так как в базовом классе Animate мы явно указали зависимость от SpriteDomino.
В качестве возможного решения, можно разделить данные от алгоритмов. Данные - это спрайты. Алгоритмы - это анимации. Данные реализовать в виде иерархии классов Sprite. В классе Sprite добавить поле Animate, которое будет означать текущую анимацию, которую можно потом гибко менять по ситуации.
struct Point {
int x;
int y;
}
interface Animate {
void play();
Point position();
}
class AnimateStatic : Animate{}
class AnimateMove : Animate{}
class AnimateTurn : Animate{}
class Sprite {
Animate animation;
int x, y;
public void set_animation(Animate a)
{
animation = a;
}
public virtual void Draw()
{
animation.play();
Point location = animation.position();
x = location.x;
y = location.y;
}
}
class SpriteDomino : Sprite {}
class SpriteFlower : Sprite {}
void test()
{
Sprite domino = new SpriteDomino();
domino.set_animation(new AnimateMove());
domino.Draw();
domino.set_animation(new AnimateTurn());
domino.Draw();
Sprite flower = new SpriteFlower();
flower.set_animation(new AnimateMove());
flower.Draw();
}