Question

как сделать спидометр. Я пытался но ничего не вышло вот код:

//глобал
new speed;
OnGameModeInit()
{

    speed = CreatePlayerTextDraw(playerid, 577.916625427.259338"КМ/H");
    return 1;
}

//в конце мода
stock getspeed(playerid)
{
    new cord[5];
    new carid;
    carid = GetPlayerVehicleID(playerid);
    new veloc = GetVehicleVelocity(carid,cord[0]],cord[1],cord[2]);
    new str[60];
    format(str,sizeof(str),"Скорость(velocity) %f",veloc);
    PlayerTextDrawSetString(speed,str);
    PlayerTextDrawShow(playerid,speed);
    return 1;
}
public OnPlayerStateChange(функции не все помню,т.к пишу с телефона)
{
    if(newstate == PLAYER_STATE_DRIVER)
    {
        SetTimer("getspeed",500,true);

    }
    if(oldstate == PLAYER_STATE_DRIVER)
    {
        PlayerTextDrawHide(playerid,speed);
    }
    return 1;
}

 

Edited by Antoxa39
Причина: надо

Share this post


Link to post

7 answers to this question

  • 2

@Antoxa39 А это уже ваш косяк, не были обозначены переменные (new Float:name), неправильно находилась скорость автомобиля.

Вот вам более оптимизированный код:

public getspeed(playerid)
{
    new Float:cord[3];
    GetVehicleVelocity(GetPlayerVehicleID(playerid),cord[0], cord[1], cord[2]);
    new veloc = floatsqroot(vx * vx + vy * vy + vz * vz);
    new str[25];
    format(str,sizeof(str),"Скорость(velocity) %f",veloc);
    PlayerTextDrawSetString(speed,str);
    return 1;
}

 

Share this post


Link to post
  • 1
3 часа назад, Antoxa39 сказал:

@Sleash`en Все что я не понял,это функцию floatsqroot. Для чего она нужна здесь?

 

Вот вам и математика, и физика :haha:

 

Мы на сервере играем в трехмерном пространстве. Скорость, с которой мы движемся, - векторная величина, которая, соответственно, может быть представлена как вектор. Вектор можно разложить на составляющие (спроецировать вектор на оси). В нашем случае есть некоторый вектор AB, который можно спроецировать оси OXOY и OZ. Графически это выглядит примерно так (см. спойлер).

 

Спойлер

изображение_2022-01-24_222051.png

 

Именно эти величины (OX, OY, OZ) и возвращает функция GetVehicleVelocity.

 

Длина вектора AB (это же называется модулем вектора AB и это же в нашем случае является скоростью) - корень из суммы квадратов координат вектора, то есть его составляющих: |AB| = sqrt(x^2 + y^2 + z^2). Именно эта формула и записана в функции:

floatsqroot(vx * vx + vy * vy + vz * vz);

 

Share this post


Link to post
  • 0

Я только недавно делал урок по таймерам.

В вашем случае следует использовать - SetTimerEx

И для таймеров используется ТОЛЬКО forward + public

P. S. ссылка на урок: *click*

 

Если не понятно, то вот решение:

Переменная кстати должна быть такая:

new Text: speed;

Дальше добавляем форвард для паблика:

forward getspeed(playerid);

Дальше сам паблик:

public getspeed(playerid) 

{

    // Код из, стока

И таймер ставим так:

SetTimerEx("getspeed", 500, true, "d", playerid);

И кстати, после изменения строки в текстдрав не обязательно его по-новой показывать, изменения проходят в реальном времени

Edited by Sleash`en

Share this post


Link to post
  • 0

@Sleash`en Извиняюсь, но оно не работает. Значение всегда на 0.

Share this post


Link to post
  • 0

@Sleash`en cпасибо большое. Все что я не понял,это функцию floatsqroot. Для чего она нужна здесь? Вот офф ответ из samp-wiki: floatsqroot Вычисляет квадратный корень из числа.

 

@Sleash`en округлить можно  с помощью floatround и floatpower?

 

@Sleash`en cразу спасибо за обьяснение) скрины жмякс:)

Share this post


Link to post
  • 0

@Antoxa39 очень сильно извиняюсь, буквально надо заменить удну букву. 

Вот это:

format(str,sizeof(str),"Скорость(velocity) %f",veloc); 

На это

format(str,sizeof(str),"Скорость(velocity) %d",veloc);

 

UPD: , Раз выводим int, то и также замените получение veloc на это:

new veloc = floatround(floatsqroot(vx * vx + vy * vy + vz * vz));

Edited by Sleash`en

Share this post


Link to post
  • 0

@Sleash`en, спасибо) но я уже и так все пофиксил) но вам все равно +сик

Edited by Cawfee
Причина: удалил цитату.

Заметка от Cawfee , создано

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

Share this post


Link to post
Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • Danny_Marcelo
      By Danny_Marcelo
      Всех приветствую. Сегодня я решил обновить систему мероприятий, т.к. на самом проекте Advance RP уже давно видоизменили систему, добавили нового функционала. Мы не должны стоять на месте и я решил тоже свою систему доработать. Вы можете использовать данную систему как аналог Advance RP или же доработать для своего проекта. Все в ваших руках как говорится.
       
      Что нового?
       
      Итак приступим:
      Находим свои переменные и вставляем:
       
      new settp = 0; // Флаг включения/выключения телепортации new Float:TeleportFloat[3]; // Координаты точки телепортации new TeleportInfo[2]; // Интерьер и виртуальный мир new Float:PlayerLastPos[MAX_PLAYERS][3]; // Последние координаты игрока new PlayerLastInt[MAX_PLAYERS]; // Последний интерьер игрока new PlayerLastVW[MAX_PLAYERS]; // Последний виртуальный мир игрока new PlayerWeapons[MAX_PLAYERS][13][2]; // Оружие игрока (слот и патроны) new PlayerUsedTP[MAX_PLAYERS]; // Флаг для отслеживания использования /tp  
      Далее идём в команды, мой случай на Pawn.CMD, но +/- везде одинаково, разве что меняется шапка
       
      CMD:settp(playerid, params[]) {     if (PlayerInfo[playerid][pAdmin] < 4) return 1;     new string[95];     if (settp == 0)     {         GetPlayerPos(playerid, TeleportFloat[0], TeleportFloat[1], TeleportFloat[2]);         TeleportInfo[0] = GetPlayerInterior(playerid);         TeleportInfo[1] = GetPlayerVirtualWorld(playerid);         settp = 1;         format(string, sizeof(string), "[A] %s[%d] установил точку телепорта для игроков. {00CC00}ТП включен.", PlayerInfo[playerid][pName], playerid);         SendAdminMessage(0x52B2B5FF, string);     }     else     {         format(string, sizeof(string), "[A] %s[%d] удалил точку телепорта для игроков. {FF6600}ТП отключен.", PlayerInfo[playerid][pName], playerid);         SendAdminMessage(0x52B2B5FF, string);         settp = 0;     }     return 1; } CMD:tp(playerid, params[]) {     if (settp == 0) return SendClientMessage(playerid, 0xCECECEFF, !"Функция отключена администратором.");     if (PlayerInfo[playerid][pJailed] >= 1) return SendClientMessage(playerid, 0xCECECEFF, !"Арестованным не разрешено покидать камеру.");     if (PlayerInfo[playerid][pRabota] != 0) return SendClientMessage(playerid, 0xCECECEFF, !"Необходимо завершить все начатые работы и активные действия.");     if (bolkam[playerid] == true) return SendClientMessage(playerid, 0xCECECEFF, !"Необходимо завершить все начатые работы и активные действия.");     GetPlayerPos(playerid, PlayerLastPos[playerid][0], PlayerLastPos[playerid][1], PlayerLastPos[playerid][2]);     PlayerLastInt[playerid] = GetPlayerInterior(playerid);     PlayerLastVW[playerid] = GetPlayerVirtualWorld(playerid);     for (new i = 0; i < 13; i++)     {         GetPlayerWeaponData(playerid, i, PlayerWeapons[playerid][i][0], PlayerWeapons[playerid][i][1]);     }     PlayerUsedTP[playerid] = 1;     ShowPlayerDialog(playerid, 22, DIALOG_STYLE_MSGBOX, !"{6699FF}Телепортация",         !"{FFFFFF}Вы уверены, что хотите попасть на место проведения мероприятия?\n{FFCD00}Ваше оружие будет изъято для хранения и возвращено позже.", !"Да", !"Нет");     return 1; }  
       
      CMD:back(playerid, params[]) {     if (!PlayerUsedTP[playerid])     {         return SendClientMessage(playerid, 0xCECECEFF, !"Эту функцию можно использовать после {FF9933}/tp, /go {CECECE}или по окончании {FF9933}мероприятий");     }     SetPlayerPos(playerid, PlayerLastPos[playerid][0], PlayerLastPos[playerid][1], PlayerLastPos[playerid][2]);     SetPlayerInterior(playerid, PlayerLastInt[playerid]);     SetPlayerVirtualWorld(playerid, PlayerLastVW[playerid]);     ResetPlayerWeapons(playerid);     for (new i = 0; i < 13; i++)     {         if (PlayerWeapons[playerid][i][0] != 0)         {             GivePlayerWeapon(playerid, PlayerWeapons[playerid][i][0], PlayerWeapons[playerid][i][1]);         }     }     PlayerUsedTP[playerid] = 0;     SendClientMessage(playerid, 0x3399FFFF, !"Вы вернулись туда, где были до телепортации");     return 1; } Ну и в OnDialogResponse:
      case 22: // Не забудьте проверить и при надобности изменить id диалога на вашу цифру или ID_NAME         {             if (response)             {                 SetPlayerPos(playerid, TeleportFloat[0], TeleportFloat[1], TeleportFloat[2]);                 SetPlayerInterior(playerid, TeleportInfo[0]);                 SetPlayerVirtualWorld(playerid, TeleportInfo[1]);                 ResetPlayerWeapons(playerid);                 SendClientMessage(playerid, 0x66CCFFFF, "Вы были доставлены на место проведения мероприятия");                 SendClientMessage(playerid, 0x66CCFFFF, "Чтобы вернуться обратно, введите {FF9900}/back");             }         } Скриншоты:
       
      Если игрок сидит в КПЗ и вводит /tp:

       
      При включенном /tp:

       
      При выключенном /tp:

       
      Сообщение администраторам:

       
      Если работаешь или лечишься в больнице:

       
      Текст после телепортации:

       
      При вводе /back 1 и более раз:

       
      P.S. Команду /tp на Advance можно нажимать бесконечно, по этому я не стал сюда пихать аналогичную проверку как в /back.
      Если что, не сложно будет добавить 1 строчку проверки. Просто имейте ввиду, что это не баг. Просто нужно же соответствовать названию темы "На 100% КОПИЯ"))
       
      Автор: Danny_Marcelo
      Размещая на другие порталы, обязательно указать автора
    • Wiggins
      By Wiggins
      Доброго времени суток, нуждаюсь в помощи. Если есть люди, которые шарят в pawno, нужна помощь. Короче, мод ART RP, там в донате есть строка "Уникальные аксессуары", когда на него нажмешь, открывается TextDraw менью, нужно переделать это на обычную менью (/mm например, там обычная менью), буду рад, если поможете, за ранее спасибо.

      Если не ошибаюсь, строка текстдрав аксессуаров начинается с 1416 до 1443.
      art4.pwn