А я бы подругому решал эту проблему.
У тебя есть некоторое исполнительное устройство (Вася). Вася может выполнять следующий набор команд:
- POP(S): взять ящик со склада (должен быть на этом складе и Вяся и ящик и у Васи не должно быть ящика);
- PUT(S): положить ящик; (Вася должен быть на нужном складе, у него д.б. ящик и на складе должно быть место)
-MOVE(S): перемещаться между складами.
Теперь о командах пользователя.
Команда пользователя представляет собой микропрограмму.
Путь надо отнести ящик со склада 1 на склад 2.
Тогда микропрограмма выглядит так:
MOVE(1)
POP(1)
MOVE(2)
PUT(2)
Если после выполнения команды пользователя Вася должен вернуться на изначальный склад, то надо добавить
MOVE(1)
Каждый шаг отрабатывается отдельно (у тебя в коде).
Т.е. для каждой команды надо написать процедуру, которая будет делать анимацию. Делать сама и не возвращать управление, пока не выполнит.
Тогда у тебя будет некоторый унифицированный механизм исполнения потока таких команд.
Теперь про отрисовку. У тебя должен быть объект, который себя отрисовывает в нужных координатах по тем условиям (есть у Васи ящик или нет), которые заданны в нем (объекте).
Все. Осталост только заблокировать ввод пользователя до конца исполнения программы
