четверг, 12 июня 2014 г.

Ориентация

Во всех играх у существ необходимо знать направление их взгляда в зависимости от этого меняется их спрайты анимации и они как бы поворачиваются в сторону куда смотрят.


Тип переменной где храниться ориентация удобно сделать перечислением, например так:

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'.

Комментариев нет:

Отправить комментарий