Во всех играх у существ необходимо знать направление их взгляда в зависимости от этого меняется их спрайты анимации и они как бы поворачиваются в сторону куда смотрят.
Тип переменной где храниться ориентация удобно сделать перечислением, например так:
enum directions { Left, LeftUp, Up, RightUp, Right, RightDown, Down, LeftDown, Center};
Тип переменной где храниться ориентация удобно сделать перечислением, например так:
enum directions { Left, LeftUp, Up, RightUp, Right, RightDown, Down, LeftDown, Center};
Вообще в некоторых играх существует 16 направлений и для них созданы спрайты, в других 8 - по направлениям, указанным выше в перечислении. А вот Fallout 2 использует только 6 - по количеству сторон шестиугольника на которые разбито все игровое поле.
Анимация существ Fallout пронумерованы следующим образом:
0 - RightUp
1 - Right
2 - RightDown
3 - LeftDown
4 - Left
5 - LeftUp
То есть если персонаж смотрит вправо, он должен использовать 1 набор анимации.
Как определить направление взгляда существа?
Определяется оно очень просто. Обычно он смотрит туда куда вы кликните мышкой. Пускай у нас есть точка на экране x1, y1 в которой отображается кадр анимации существа и точка x2, y2 куда вы кликнули мышкой. Тогда функция для получения направления взгляда для Fallout следующая:
directions direction(int x1, int y1, int x2, int y2)
{
static const directions orientations[25] =
{
LeftUp, LeftUp, RightUp, RightUp, RightUp,
LeftUp, LeftUp, RightUp, RightUp, Right,
Left, Left, Center, Right, Right,
LeftDown, LeftDown, RightDown, RightDown, Right,
LeftDown, LeftDown, LeftDown, RightDown, RightDown
};
int dx = x2 - x1;
int dy = y2 - y1;
int div = imax(iabs(dx), iabs(dy));
if(!div)
return Center;
if(div>3)
div /= 2;
int ax = dx/div;
int ay = dy/div;
return orientations[(ay+2)*5+ax+2];
}
int d2o(directions d)
{
static int dt[] = {4, 5, 0, 0, 1, 2, 2, 3, 0};
return dt[d];
}
Алгоритм вычисления построен на разбитии всей области на квадраты с центром посредине. Затем мы вычисляем пропорциональные координаты и получаем индекс из массива. Для того чтобы формула работала с 8 или 16 возможными направлениями взгляда - необходимо переделать содержимое массива 'orientations'.
Комментариев нет:
Отправить комментарий