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

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±

    Задумка со скоростью

    Решил попробовать создать вычислитель скорости не по GetPlayerVelocity, а по GetPlayerPos, только вот не знаю как подойти..
    фф тяжело же объяснить нубу)
    В общем все мы знаем что есть клео и собейты в которых есть Аир который не палится со своей нулевой скоростью..
    Вот и пришло на ум сделать что то вроде GetPlayerVelocity только на GetPlayerPos,
    начал сооружать скрипт и понял что нужно два раза замерять координаты чтобы их сравнить и начать вычитание,
    вот и вопрос сам:
    Как сделать 2 замера так чтобы они были разными,
    потому как чередование GetPlayerPos один за другим даёт результат = 0

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

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

  3. Пользователь сказал cпасибо:
    vovandolg (24.01.2016)
  4. #3
    Аватар для Profyan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2013
    Адрес
    Омск
    Сообщений
    196
    Репутация:
    22 ±
    Есть 2 варианта.Либо вызываешь паблик и в нем foreach прогоняешь по всем игрокам,либо для каждого игрока таймер.
    Я покажу 2 вариант.
    Создай одномерный массив,в котором для каждого игрока будет храниться id таймера,
    а также,либо в массив игрока(например PlayerInfo) создай 3 ячейки: Float:pos_x,Float:pos_y,Float:pos_z

    В OnPlayerConnect:
    PHP код:
    p_timer_getspeed[playerid] = SetTimerEx("@GetPlayerSpeed",250,0,"i",playerid); // на 1\4 секунды.Можешь изменить. 
    В OnPlayerDisconnect:
    PHP код:
    KillTimer(p_timer_getspeed[playerid]); 
    Потом сама функция:
    PHP код:
    @GetPlayerSpeed(playerid);
    @
    GetPlayerSpeed(playerid)
    {
        new 
    Float:p_x,Float:p_y,Float:p_z;
        
    GetPlayerPos(playerid,p_x,p_y,p_z);
        new 
    Float:p_distance =
            
    floatpower(p_x-PlayerInfo[playerid][pos_x],2) +
            
    floatpower(p_y-PlayerInfo[playerid][pos_y],2) +
            
    floatpower(p_z-PlayerInfo[playerid][pos_z],2);
            
    /*
        расстояние получилось в квадрате,т.к sqrt не желательно много раз использовать
        далее твои проверки*/
        
    PlayerInfo[playerid][pos_x] = p_x;
        
    PlayerInfo[playerid][pos_y] = p_y;
        
    PlayerInfo[playerid][pos_z] = p_z;
        return 
    SetTimerEx("@GetPlayerSpeed",250,0,"i",playerid);

    Еще проще способ:
    PHP код:
    @GetPlayerSpeed(playerid);
    @
    GetPlayerSpeed(playerid)
    {
        new 
    Float:p_distance =
        
    GetPlayerDistanceFromPoint(playerid,PlayerInfo[playerid][pos_x],PlayerInfo[playerid][pos_y],PlayerInfo[playerid][pos_z]);
         
    GetPlayerPos(playerid,PlayerInfo[playerid][pos_x],PlayerInfo[playerid][pos_y],PlayerInfo[playerid][pos_z]);
        return 
    SetTimerEx("@GetPlayerSpeed",250,0,"i",playerid);

    Последний раз редактировалось Profyan; 24.01.2016 в 09:10. Причина: еще один способ



    Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку
    Мартин Фаулер


    Skype
    profan99
    VK
    click




  5. Пользователь сказал cпасибо:
    vovandolg (24.01.2016)
  6. #4
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Инфа о местоположении обновляется при вызове OnPlayerUpdate. Там и вычисляйте расстояние от предыдущих координат (VectorSize). Результат можно записать в ячейку массива, чтобы использовать потом в других функциях.
    мм, забыл напомнить для версии 0.3е делаю, всё равно спасибо и на 0.3.7 заберу чтобы там проще было
    Цитата Сообщение от Profyan Посмотреть сообщение
    Есть 2 варианта.
    Спс, щяс буду пробовать

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

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Profyan, благодарю вас всё получилось, только вот я не понял тут:
    PHP код:
    /*
        расстояние получилось в квадрате,т.к sqrt не желательно много раз использовать
        далее твои проверки*/ 
    sqrt почему нельзя много раз юзать?
    + ещё, как мне можно проверить сколько времени выполняется этот трюк с определением скорости?
    Последний раз редактировалось vovandolg; 24.01.2016 в 19:47.

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

    Статус
    Оффлайн
    Регистрация
    23.12.2013
    Адрес
    Омск
    Сообщений
    196
    Репутация:
    22 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    Profyan, благодарю вас всё получилось, только вот я не понял тут:
    PHP код:
    /*
        расстояние получилось в квадрате,т.к sqrt не желательно много раз использовать
        далее твои проверки*/ 
    sqrt почему нельзя много раз юзать?
    + ещё, как мне можно проверить сколько времени выполняется этот трюк с определением скорости?
    sqrt - довольно затратная по времени функция.
    Паблик вызывается каждые 250мс, можешь изменить : SetTimerEx("@GetPlayerSpeed",250,0,"i",playerid);



    Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку
    Мартин Фаулер


    Skype
    profan99
    VK
    click




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

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Цитата Сообщение от Profyan Посмотреть сообщение
    Паблик вызывается каждые 250мс, можешь изменить : SetTimerEx("@GetPlayerSpeed",250,0,"i",playerid);
    Да это я то понял, но как определить сколько длится время выполнения паблика, так на будущее чтобы я знал как мерять время выполнения в таймерах и прочей куче проверок/функций.

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

    Статус
    Оффлайн
    Регистрация
    23.12.2013
    Адрес
    Омск
    Сообщений
    196
    Репутация:
    22 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    Да это я то понял, но как определить сколько длится время выполнения паблика, так на будущее чтобы я знал как мерять время выполнения в таймерах и прочей куче проверок/функций.
    gettime(), GetTickCount(), tickcount()



    Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку
    Мартин Фаулер


    Skype
    profan99
    VK
    click




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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Profyan Посмотреть сообщение
    sqrt - довольно затратная по времени функция.
    Вы так печётесь о производительности с floatsqrt, и в то же время не замечаете элементарных вещей...
    http://pro-pawn.ru/showthread.php?8347
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    9. Не путайте целые числа с вещественными.
    Пример плохого кода:
    PHP код:
    new Float:some_float 10;
    new 
    some_float_sqr floatpower(some_float2);
    new 
    Float:health;
    GetPlayerHealth(playeridhealth);
    SetPlayerHealth(playeridhealth 10); 
    Казалось бы, ничего особенного. Но давайте посмотрим, во что компилятор превращает этот код:
    PHP код:
    new Float:some_float float(10);
    new 
    some_float_sqr floatpower(some_floatfloat(2));
    new 
    Float:health;
    GetPlayerHealth(playeridhealth);
    SetPlayerHealth(playeridhealth float(10)); 
    Видите эти лишние вызовы функции float()? Компилятор подставляет их, если вы используете целые числа там, где нужно использовать вещественные.
    Это не смертельно, но может увеличить нагрузку на сервер, ведь он будет тратить лишнее время на то, чтобы преобразовать число из целочисленного формата в число с плавающей запятой (Float).
    И этих потерь в производительности можно избежать, просто указав вещественные числа вместо целых там, где это нужно.
    Пример хорошего кода:
    PHP код:
    new Float:some_float 10.0;
    some_float += 2.0;
    new 
    some_float_sqr floatpower(some_float2.0);
    new 
    Float:health;
    GetPlayerHealth(playeridhealth);
    SetPlayerHealth(playeridhealth 10.0); 
    Как видите, достаточно просто добавить ".0" к числам, чтобы сделать их вещественными. Это не сложно.
    Главное только, наоборот, не указывать вещественные числа там, где нужны целые, иначе это может привести к ошибкам.
    Цитата Сообщение от Profyan Посмотреть сообщение
    Код:
    	new Float:p_distance =
    		floatpower(p_x-PlayerInfo[playerid][pos_x],2) +
    		floatpower(p_y-PlayerInfo[playerid][pos_y],2) +
    		floatpower(p_z-PlayerInfo[playerid][pos_z],2);
    Но следовало бы отдать должное, спасибо за идею с кодом. Давно уже хотел обновить тот пункт, чтобы рассмотреть все случаи путаницы между вещ. и целыми числами, да только не знал, как это лучше показать.


    Цитата Сообщение от Profyan Посмотреть сообщение
    gettime(), GetTickCount(), tickcount()
    tickcount иногда возвращает неправильные значения. Из-за этого мне как-то пришлось сделать в профайлере сброс результатов на текущей итерации, если в одном из отрывков кода измеренное время окажется меньше нуля.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  12. Пользователь сказал cпасибо:
    Profyan (26.01.2016)
 

 

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

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

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

Ваши права

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