Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 9 из 9
  1. #1
    Аватар для Витёк
    Пользователь

    Статус
    Оффлайн
    Регистрация
    26.09.2015
    Сообщений
    215
    Репутация:
    1 ±

    Вопрос по повороту игрока

    Добрый день
    подскажите есть ли какай нибуть функция котороя позволяет определить куда смотрит игрок на север, запад и тд
    пробовал сделать с GetPlayerFacingAngle но у меня почемуто не получается
    пробовал делать по такому примеру

    Прошу помощи
    Последний раз редактировалось Витёк; 08.12.2016 в 11:00.
    Разработка •  • Ч Е Р Н О Б Ы Л Ь •  • Выживание в припяти •

  2. #2
    Аватар для middlematt
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.01.2016
    Сообщений
    40
    Репутация:
    7 ±
    Направлен игрок в какую строну или куда направлена его камера?

  3. #3
    Аватар для Витёк
    Пользователь

    Статус
    Оффлайн
    Регистрация
    26.09.2015
    Сообщений
    215
    Репутация:
    1 ±
    Цитата Сообщение от middlematt Посмотреть сообщение
    Направлен игрок в какую строну или куда направлена его камера?
    игрок (я ж написал функция GetPlayerFacingAngle что обозночает как игрок стоит (там туловешем на север задом на юг))
    Разработка •  • Ч Е Р Н О Б Ы Л Ь •  • Выживание в припяти •

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

    Статус
    Оффлайн
    Регистрация
    22.01.2016
    Сообщений
    40
    Репутация:
    7 ±
    Цитата Сообщение от Витёк Посмотреть сообщение
    игрок (я ж написал функция GetPlayerFacingAngle что обозночает как игрок стоит (там туловешем на север задом на юг))
    А знаешь почему? Редко когда игрок встает ровно по вращению.
    Если у тебя проверка

    PHP код:
    if (GetPlayerFacingAngle(playerid) == float(0)) SendClientMessage(playerid, -1"north"); 
    А нуль - это 0.0000. Если игрок стоит во вращении 0.0001 то у тебя уже проверка пройдет мимо.

    Не знаю, правильно ли я написал этот код, ибо недавно встал и мозги не варят:
    PHP код:
    switch (GetPlayerFacingAngle(playerid))
    {
        case 
    float(-2)..float(2): SendClientMessage(playerid, -1"north");
        case 
    float(88)..float(92): SendClientMessage(playerid, -1"west");
        case 
    float(178)..float(182): SendClientMessage(playerid, -1"south");
        case 
    float(268)..float(272): SendClientMessage(playerid, -1"east");

    Последний раз редактировалось middlematt; 08.12.2016 в 11:44.

  5. #5
    Аватар для Витёк
    Пользователь

    Статус
    Оффлайн
    Регистрация
    26.09.2015
    Сообщений
    215
    Репутация:
    1 ±
    Цитата Сообщение от middlematt Посмотреть сообщение
    А знаешь почему? Редко когда игрок встает ровно по вращению.
    Если у тебя проверка

    PHP код:
    if (GetPlayerFacingAngle(playerid) == float(0)) SendClientMessage(playerid, -1"north"); 
    А нуль - это 0.0000. Если игрок стоит во вращении 0.0001 то у тебя уже проверка пройдет мимо.

    Не знаю, правильно ли я написал этот код, ибо недавно встал и мозги не варят:
    PHP код:
    switch (GetPlayerFacingAngle(playerid))
    {
        case 
    float(-2)..float(2): SendClientMessage(playerid, -1"north");
        case 
    float(88)..float(92): SendClientMessage(playerid, -1"west");
        case 
    float(178)..float(182): SendClientMessage(playerid, -1"south");
        case 
    float(268)..float(272): SendClientMessage(playerid, -1"east");

    Не робит
    Разработка •  • Ч Е Р Н О Б Ы Л Ь •  • Выживание в припяти •

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

    Статус
    Оффлайн
    Регистрация
    13.06.2016
    Адрес
    Одесса, Украина
    Сообщений
    281
    Репутация:
    51 ±
    Цитата Сообщение от Витёк Посмотреть сообщение
    Не робит
    А ты куда эти функции засунул? это же хотя бы в секнудном таймере проверять нужно. + попробуй получать поворот камеры.

  7. #7
    Аватар для Витёк
    Пользователь

    Статус
    Оффлайн
    Регистрация
    26.09.2015
    Сообщений
    215
    Репутация:
    1 ±
    Цитата Сообщение от qwezert Посмотреть сообщение
    А ты куда эти функции засунул? это же хотя бы в секнудном таймере проверять нужно. + попробуй получать поворот камеры.
    я токо куда и не вставлял чтобы не проверить
    мне нужен токо поворот игрок с камерой могут быть проблемы если он не так смотрит
    Разработка •  • Ч Е Р Н О Б Ы Л Ь •  • Выживание в припяти •

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

    Статус
    Оффлайн
    Регистрация
    13.06.2016
    Адрес
    Одесса, Украина
    Сообщений
    281
    Репутация:
    51 ±
    Цитата Сообщение от Витёк Посмотреть сообщение
    я токо куда и не вставлял чтобы не проверить
    мне нужен токо поворот игрок с камерой могут быть проблемы если он не так смотрит
    Задебагай вот это вот - GetPlayerFacingAngle(playerid) - выводом результата в чате. Будешь видеть какие данные возвращает функция и тогда поймешь как делать.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от middlematt Посмотреть сообщение
    PHP код:
    switch (GetPlayerFacingAngle(playerid))
    {
        case 
    float(-2)..float(2): SendClientMessage(playerid, -1"north");
        case 
    float(88)..float(92): SendClientMessage(playerid, -1"west");
        case 
    float(178)..float(182): SendClientMessage(playerid, -1"south");
        case 
    float(268)..float(272): SendClientMessage(playerid, -1"east");

    Во-первых, что это за извращение с вызовом float?
    Во-вторых, когда это у нас на компасе появились отрицательные значения градусов?
    В-третьих, когда это GetPlayerFacingAngle стала возвращать градусы не через второй параметр?


    Функция:
    PHP код:
    stock GetDirectionInWhichPlayerLooks(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 280.0-side_of_the_world,
            
    Floateast_coord_max 280.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 
    0;
        else if(
    north_coord_max+coord_indent <= facing_angle <= west_coord_min-coord_indent)
            return 
    1;

        else if(
    west_coord_min <= facing_angle <= west_coord_max)
            return 
    2;
        else if(
    west_coord_max+coord_indent <= facing_angle <= south_coord_min-coord_indent)
            return 
    3;

        else if(
    south_coord_min <= facing_angle <= south_coord_max)
            return 
    4;
        else if(
    south_coord_max+coord_indent <= facing_angle <= east_coord_min-coord_indent)
            return 
    5;

        else if(
    east_coord_min <= facing_angle <= east_coord_max)
            return 
    6;
        else 
    //if(east_coord_max+coord_indent <= facing_angle <= north_coord_min-coord_indent)
            
    return 7;

    И вариант массива, в котором уже заранее хранятся имена сторон света
    PHP код:
    new side_of_the_world_list[8][14] =
    {
        
    "Север",
        
    "Северо-Запад",
        
    "Запад",
        
    "Юго-Запад",
        
    "Юг",
        
    "Юго-Восток",
        
    "Восток",
        
    "Северо-Восток"
    }; 
    Чтоб настроить "чувствительность" функции к определению сторон света (то бишь, тот промежуток координат, при котором будет определять север, а при котором уже северо-запад), нужно изменить значение вот этой переменной
    PHP код:
    Floatside_of_the_world 20.0
     Скрин-пояснение





    Указанное значение расширяет интервал координат для каждой из стороны света в обе стороны (прибавляет и отнимает). А уже все те значения, которые не будут входить в интервалы, станут "северо-западом" и т.п.

    Если указать 40, интервал в общем станет равен 80.
    Укажешь 45 и все "промежуточные" стороны света ("юго-восток", "северо-запад" и т.п.) пропадут. Останутся лишь основные "Север/Юг/Запад/Восток"

    Больше никаких настроек не нужно производить.


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

    PHP код:
    public OnPlayerKeyStateChange(playeridnewkeysoldkeys)
    {
        if(
    newkeys KEY_YES)
            
    SendClientMessage(playerid, -1side_of_the_world_list[GetDirectionInWhichPlayerLooks(playerid)]);
        return 
    1;

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

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

    Steve Pavlina

  10. Пользователь сказал cпасибо:
    Витёк (09.12.2016)
 

 

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

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

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

Ваши права

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