GetPlayerFacingDirection - узнаём в какую сторону света смотрит игрок (компас)
Описание:
Функция узнаёт в какую сторону света смотрит игрок.
Параметры:
playerid - ID игрока
Float:facing_angle - Текущее направление взгляда игрока
(необязательный параметр)
Пояснение: Второй параметр позволяет заранее указать направление взгляда игрока. Он сделан на случай, если Вы в своём коде уже вызывали GetPlayerFacingAngle до того, как вызвали мою функцию.
То бишь у Вас есть, например, такой код:
PHP код:
new Float:facing_angle;
GetPlayerFacingAngle(playerid, facing_angle);
//Тут Ваш остальной код, в котором Вы используете значение facing_angle
//И теперь Вам нужно узнать сторону света, в которую смотрит игрок.
//Вы можете сразу прописать направление взгляда во втором параметре, тем самым "отключив" вызов функции
//GetPlayerFacingAngle внутри GetPlayerFacingDirection
GetPlayerFacingDirection(playerid, facing_angle);
Если же этого не сделать (не указать второй параметр), вызов GetPlayerFacingAngle случится внутри самой функции GetPlayerFacingDirection. То бишь, можно сделать так:
PHP код:
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(newkeys & KEY_YES)
SendClientMessage(playerid, -1, side_of_the_world_list[GetPlayerFacingDirection(playerid)]);
return 1;
}
И теперь, при нажатии на "Y", в чат будет писать сторону света, в которую смотрит игрок.
Возвращаемое значение:
0 (DIRECTION_NORTH) - Игрок смотрит на Север
1 (DIRECTION_NORTH_WEST) - Игрок смотрит на Северо-Запад
2 (DIRECTION_WEST) - Игрок смотрит на Запад
3 (DIRECTION_SOUTH_WEST) - Игрок смотрит на Юго-Запад
4 (DIRECTION_SOUTH) - Игрок смотрит на Юг
5 (DIRECTION_SOUTH_EAST) - Игрок смотрит на Юго-Восток
6 (DIRECTION_EAST) - Игрок смотрит на Восток
7 (DIRECTION_NORTH_EAST) - Игрок смотрит на Северо-Восток
Код:
Открыть/закрыть
PHP код:
enum
{
DIRECTION_NORTH = 0,
DIRECTION_NORTH_WEST = 1,
DIRECTION_WEST = 2,
DIRECTION_SOUTH_WEST = 3,
DIRECTION_SOUTH = 4,
DIRECTION_SOUTH_EAST = 5,
DIRECTION_EAST = 6,
DIRECTION_NORTH_EAST = 7
};
PHP код:
stock GetPlayerFacingDirection(playerid, Float:facing_angle = -1.0)
{
static const
Float: side_of_the_world = 20.0,// Минимум: 0.0, Максимум - 45.0
Float: coord_indent = 0.1;
new const
Float: north_coord_min = 360.0-side_of_the_world,
Float: north_coord_max = 0.0+side_of_the_world,
Float: west_coord_min = 90.0-side_of_the_world,
Float: west_coord_max = 90.0+side_of_the_world,
Float: south_coord_min = 180.0-side_of_the_world,
Float: south_coord_max = 180.0+side_of_the_world,
Float: east_coord_min = 270.0-side_of_the_world,
Float: east_coord_max = 270.0+side_of_the_world;
if(!floatcmp(facing_angle, -1.0))
GetPlayerFacingAngle(playerid, facing_angle);
else if(floatcmp(facing_angle, 0.0) == -1)
facing_angle = 0.0;
else if(floatcmp(facing_angle, 360.0) == 1)
facing_angle = 360.0;
if(north_coord_min <= facing_angle <= 360.0 || 0.0 <= facing_angle <= north_coord_max)
return DIRECTION_NORTH;
else if(north_coord_max+coord_indent <= facing_angle <= west_coord_min-coord_indent)
return DIRECTION_NORTH_WEST;
else if(west_coord_min <= facing_angle <= west_coord_max)
return DIRECTION_WEST;
else if(west_coord_max+coord_indent <= facing_angle <= south_coord_min-coord_indent)
return DIRECTION_SOUTH_WEST;
else if(south_coord_min <= facing_angle <= south_coord_max)
return DIRECTION_SOUTH;
else if(south_coord_max+coord_indent <= facing_angle <= east_coord_min-coord_indent)
return DIRECTION_SOUTH_EAST;
else if(east_coord_min <= facing_angle <= east_coord_max)
return DIRECTION_EAST;
else //if(east_coord_max+coord_indent <= facing_angle <= north_coord_min-coord_indent)
return DIRECTION_NORTH_EAST;
}
Настройки:
В функции предусмотрена возможность настроить "чувствительность" поиска той или иной стороны света.
Настраивается она через константу "side_of_the_world".
Чем выше значение данной переменной, тем больше градусов выделяется под "основные" стороны света
("Север"/"Юг"/"Запад"/"Восток") и меньше под "второстепенные"
("Северо-Запад"/"Северо-Восток"/"Юго-Восток"/"Юго-Запад").
Пример в виде скриншота:
Минимальное значение для переменной - "
0.0"
(в этом случае игроку нужно смотреть чётко в координаты "0.0", "90.0", "180.0", "280.0" для того, чтоб функция определила "основные" стороны света)
Максимальное значение для переменной -
45.0 (в этом случае все "второстепенные" стороны стороны света перестанут определяться. Будут определяться лишь "основные")
Больше никаких настроек функция не требует.
Пример использования:
PHP код:
new const side_of_the_world_list[8][14] =
{
"Север",
"Северо-Запад",
"Запад",
"Юго-Запад",
"Юг",
"Юго-Восток",
"Восток",
"Северо-Восток"
};
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(newkeys & KEY_YES)
SendClientMessage(playerid, -1, side_of_the_world_list[GetPlayerFacingDirection(playerid)]);
return 1;
}
Автор:
DeimoS