Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 3 1 2 3 ПоследняяПоследняя
Показано с 1 по 10 из 21
  1. #1
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±

    GetPlayerFacingDirection - узнаём в какую сторону света смотрит игрок (компас)

    Описание:
    Функция узнаёт в какую сторону света смотрит игрок.

    Параметры:
    playerid - ID игрока
    Float:facing_angle - Текущее направление взгляда игрока (необязательный параметр)
     Пояснение:
    Второй параметр позволяет заранее указать направление взгляда игрока. Он сделан на случай, если Вы в своём коде уже вызывали GetPlayerFacingAngle до того, как вызвали мою функцию.

    То бишь у Вас есть, например, такой код:
    PHP код:
    new Float:facing_angle
    GetPlayerFacingAngle(playeridfacing_angle);
    //Тут Ваш остальной код, в котором Вы используете значение facing_angle
    //И теперь Вам нужно узнать сторону света, в которую смотрит игрок. 
    //Вы можете сразу прописать направление взгляда во втором параметре, тем самым "отключив" вызов функции
    //GetPlayerFacingAngle внутри GetPlayerFacingDirection

    GetPlayerFacingDirection(playeridfacing_angle); 
    Если же этого не сделать (не указать второй параметр), вызов GetPlayerFacingAngle случится внутри самой функции GetPlayerFacingDirection. То бишь, можно сделать так:

    PHP код:
    public OnPlayerKeyStateChange(playeridnewkeysoldkeys)
    {
        if(
    newkeys KEY_YES)
            
    SendClientMessage(playerid, -1side_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(playeridFloat:facing_angle = -1.0)
    {
        static const
            
    Floatside_of_the_world 20.0,// Минимум: 0.0, Максимум - 45.0
            
    Floatcoord_indent 0.1;

        new const
            
    Floatnorth_coord_min 360.0-side_of_the_world,
            
    Floatnorth_coord_max 0.0+side_of_the_world,

            
    Floatwest_coord_min 90.0-side_of_the_world,
            
    Floatwest_coord_max 90.0+side_of_the_world,

            
    Floatsouth_coord_min 180.0-side_of_the_world,
            
    Floatsouth_coord_max 180.0+side_of_the_world,

            
    Floateast_coord_min 270.0-side_of_the_world,
            
    Floateast_coord_max 270.0+side_of_the_world;


        if(!
    floatcmp(facing_angle, -1.0))
            
    GetPlayerFacingAngle(playeridfacing_angle);
        else if(
    floatcmp(facing_angle0.0) == -1)
            
    facing_angle 0.0;
        else if(
    floatcmp(facing_angle360.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(playeridnewkeysoldkeys)
    {
        if(
    newkeys KEY_YES)
            
    SendClientMessage(playerid, -1side_of_the_world_list[GetPlayerFacingDirection(playerid)]);
        return 
    1;


    Автор:
    DeimoS
    Последний раз редактировалось DeimoS; 13.12.2017 в 12:20.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  2. 4 пользователя(ей) сказали cпасибо:
    Blood (09.12.2016) Saibot (10.12.2016) [ForD] (11.12.2016) Витёк (09.12.2016)
  3. #2
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Не сказал бы, что максимально удобно использовать. Добавь enum с константами названием сторон света. Будет куда лучше, чем запоминать цифры от 0-7 (я у себя сделал, но крайне сомнительные название констант -_-)
    PHP код:
    enum 
    {
        
    SIDE_WORLD_NORTH 0,
        
    SIDE_WORLD_NORTH_WEST 1,
        
    SIDE_WORLD_WEST 2,
        
    SIDE_WORLD_SOUTH_WEST 3,
        
    SIDE_WORLD_SOUTH 4,
        
    SIDE_WORLD_SOUTH_EAST 5,
        
    SIDE_WORLD_EAST 6,
        
    SIDE_WORLD_NORTH_EAST 7
    }; 
    Последний раз редактировалось $continue$; 17.06.2017 в 04:13.
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

  4. #3
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Небольшое замечание: обычно в названиях функции не используют "which" и прочие местоимения. Можно было бы назвать функцию GetPlayerFacingDirection, по аналогии с GetPlayerFacingAngle.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  5. #4
    Аватар для TheMallard
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2015
    Адрес
    San Fierro
    Сообщений
    217
    Репутация:
    39 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    Не сказал бы, что максимально удобно использовать. Добавь enum с константами названием сторон света. Будет куда лучше, чем запоминать цифры от 0-7 (я у себя сделал, но крайне сомнительные название констант -_-)
    PHP код:
    enum 
    {
        
    SIDE_WORLD_NORTH 0,
        
    SIDE_WORLD_NORTH_WEST 1,
        
    SIDE_WORLD_WEST 2,
        
    SIDE_WORLD_SOUTH_WEST 3,
        
    SIDE_WORLD_SOUTH 4,
        
    SIDE_WORLD_SOUTH_EAST 5,
        
    SIDE_WORLD_EAST 6,
        
    SIDE_WORLD_NORTH_EAST 7
    }; 
    PHP код:
    DIRECTION_NORTH 0, ... 

  6. #5
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Небольшое замечание: обычно в названиях функции не используют "which" и прочие местоимения. Можно было бы назвать функцию GetPlayerFacingDirection, по аналогии с GetPlayerFacingAngle.
    Ок, переименовал


    Цитата Сообщение от $continue$ Посмотреть сообщение
    Не сказал бы, что максимально удобно использовать. Добавь enum с константами названием сторон света. Будет куда лучше, чем запоминать цифры от 0-7 (я у себя сделал, но крайне сомнительные название констант -_-)
    PHP код:
    enum 
    {
        
    SIDE_WORLD_NORTH 0,
        
    SIDE_WORLD_NORTH_WEST 1,
        
    SIDE_WORLD_WEST 2,
        
    SIDE_WORLD_SOUTH_WEST 3,
        
    SIDE_WORLD_SOUTH 4,
        
    SIDE_WORLD_SOUTH_EAST 5,
        
    SIDE_WORLD_EAST 6,
        
    SIDE_WORLD_NORTH_EAST 7
    }; 
    Цитата Сообщение от TheMallard Посмотреть сообщение
    PHP код:
    DIRECTION_NORTH 0, ... 
    Вообще подразумевалось, что каждый сам уже сделает нужную ему "надстройку" функции: будь то массив с названиями, как я показал в теме или же константы. Но ок, добавлено
    Последний раз редактировалось DeimoS; 17.06.2017 в 14:35.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  7. #6
    Аватар для Nash_Brigers
    Пользователь

    Статус
    Оффлайн
    Регистрация
    06.03.2016
    Адрес
    Moscow
    Сообщений
    167
    Репутация:
    44 ±
    Честно, не представляю, где это может быть использовано.. Просветите?
    Член сообщества Green Square.

  8. #7
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Сейчас пишу возврат в полигон. Есть зависимость от сторон света, где дистанция от выхода из полигона +/-. Используя функцию GetPointInFront2D нужно передать дистанцию, чтобы игрок оказался в полигоне. Вот такие вот костыли =)
    Цитата Сообщение от Nash_Brigers Посмотреть сообщение
    Честно, не представляю, где это может быть использовано.. Просветите?
    В возврат функции, наверное будет лучше добавить константы, вместо значении
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Но ок, добавлено
    Последний раз редактировалось $continue$; 17.06.2017 в 15:29.
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

  9. Пользователь сказал cпасибо:
    DeimoS (17.06.2017)
  10. #8
    Аватар для whale
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.04.2014
    Сообщений
    74
    Репутация:
    17 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    Сейчас пишу возврат в полигон. Есть зависимость от сторон света, где дистанция от выхода из полигона +/-. Используя функцию GetPointInFront2D нужно передать дистанцию, чтобы игрок оказался в полигоне. Вот такие вот костыли =)


    В возврат функции, наверное будет лучше добавить константы, вместо значении
    Это Вы имели ввиду, я так понимаю:

    PHP код:
    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

  11. #9
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Именно.
    Цитата Сообщение от Twixyck Посмотреть сообщение
    Это Вы имели ввиду, я так понимаю:

    PHP код:
    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
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

  12. #10
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Nash_Brigers Посмотреть сообщение
    Честно, не представляю, где это может быть использовано.. Просветите?
    Я писал её по чьей-то просьбе (не помню уже кто просил), так что, видимо, предназначение ей можно придумать, помимо того, что предложил $continue$.

    Обновил тему.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

 

 
Страница 1 из 3 1 2 3 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •