Учитывая сложное анимационное поведение, которое вы ищете, я бы определенно ограничил необузданные обратные вызовы и тайм-ауты.
Я бы сделал что-то вроде этого:
// first define the atomic animation effects
function first_figure_moves_towards_second_figure() {
// animation calls
}
function first_figure_attacks() {
// animation calls
}
function second_figure_blocks_attack() {
// animation calls
}
var animation_script = [
{
at_time: 30 * 1000, // 30 seconds
animation: first_figure_moves_towards_second_figure
},
{
at_time: 31 * 1000, // 31 seconds
animation: first_figure_attacks
},
{
at_time: 32 * 1000, // 32 seconds
animation: second_figure_blocks_attack
}
];
Затем создайте основную функцию с управлением сценарием анимации, например:
var current_time = 0;
function animate_next() {
var next = animation_script.shift(),
time_between = next.at_time - current_time;
setTimeout(function () {
current_time = next.at_time;
next.animation();
animate_next();
}, time_between);
}
С помощью этого вы можете определить свою анимацию без перемешивания обратных вызовов, тайм-аутов и интервалов - и вместо этого сосредоточиться на сценарии анимации и строительных элементах атомарной анимации.
Редактировать после комментариев:
Обратите внимание, что имена функций в сценарии анимации (например, first_figure_attacks
) являются ссылками на функции - сохраняются для последующего выполнения. Добавление параметров сделает их вызовами функций - их выполнение немедленно.
Вы можете использовать анонимные функции для добавления таких параметров:
var animation_script = [
{
at_time: 5 * 1000,
animation: function () { doAttack('left', '#char1', '#char2', 2000); }
}
];
или, может быть, более эстетически, вы можете заключить doAttack, чтобы вернуть ссылку на функцию, например:
function doAttack(side, c1x, c2x, speed) {
// animation calls
}
function attackAnimation(side, c1x, c2x, speed) {
return function () {
doAttack(side, c1x, c2x, speed);
};
}
var animation_script = [
{
at_time: 5 * 1000,
animation: attackAnimation('left', '#char1', '#char2', 2000)
}
];