Перейти к содержанию
Авторизация  
Vladimir_Kulkov

Спидометр для автомобилей

Рекомендуемые сообщения

Vladimir_Kulkov

В основном, после освоения азов систем регистраций, перед новичком(который только-только начинает писать СВОИ моды), стоит задача сделать функциональный, рабочий спидометр. Чаще всего возникает вопрос "как же сделать его"? Так вот, я заметил, большинство тем содержат в себе либо текстдравы(рисунок) либо функцию, но я почти не замечал где же обучение, за что отвечает та или иная строчка. Естественно расписывать очень подробно, всегда не легко, в любом случае я постараюсь уместить всю полезную информацию в один урок.

И так, для начала, необходимо будет придумать стиль спидометра, его дизайн. Если вы раньше не знали, то спидометры и прочую красивую ерунду, рисуют пользуясь текстдравами. Так вот очень удобно "рисовать" спидометры и т.д в IpleoMax Textdraw Editor, у него понятный интерфейс, также вам не придется по долгу возится с позициями и размерами текстдравов, поищите тему на форуме!

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

 

552bf11df6b6.png

 

Приступим же к скриптовому исполнению задуманного!

Для начала для нарисованных текстдравов, необходимо создать переменные:

new Text:SBox;
new Text:SBox1;
new PlayerText:CarSpeed[MAX_PLAYERS];
new PlayerText:CarFuel[MAX_PLAYERS];
new PlayerText:CarMilliage[MAX_PLAYERS];
new PlayerText:CarLights[MAX_PLAYERS];
new PlayerText:CarEngine[MAX_PLAYERS];

Переменные созданы, теперь создадим функции для создания самих текстдравов!

Глобальные:

stock CreateGlobalTextDraws()
{
       
        SBox = TextDrawCreate(626.000000, 384.540008, "usebox");
        TextDrawLetterSize(SBox, 0.000000, 5.905555);
        TextDrawTextSize(SBox, 430.799987, 0.000000);
        TextDrawAlignment(SBox, 1);
        TextDrawColor(SBox, 0);
        TextDrawUseBox(SBox, true);
        TextDrawBoxColor(SBox, 102);
        TextDrawSetShadow(SBox, 0);
        TextDrawSetOutline(SBox, 0);
        TextDrawFont(SBox, 0);

        SBox1 = TextDrawCreate(601.875000, 383.250061, "LD_SPAC:white");
        TextDrawLetterSize(SBox1, 0.000000, 0.000000);
        TextDrawTextSize(SBox1, 21.250000, 57.166625);
        TextDrawAlignment(SBox1, 1);
        TextDrawColor(SBox1, 255);
        TextDrawSetShadow(SBox1, 0);
        TextDrawSetOutline(SBox1, 0);
        TextDrawFont(SBox1, 4);
        return 1;
}

Персональные:

stock CreatePlayersTextDraw(playerid)
{
       
        CarSpeed[playerid] = CreatePlayerTextDraw(playerid, 442.399963, 386.026580, "SPEED: 100");
        PlayerTextDrawLetterSize(playerid, CarSpeed[playerid], 0.401249, 1.430832);
        PlayerTextDrawAlignment(playerid, CarSpeed[playerid], 1);
        PlayerTextDrawColor(playerid, CarSpeed[playerid], -1);
        PlayerTextDrawSetShadow(playerid, CarSpeed[playerid], 0);
        PlayerTextDrawSetOutline(playerid, CarSpeed[playerid], 1);
        PlayerTextDrawBackgroundColor(playerid, CarSpeed[playerid], 51);
        PlayerTextDrawFont(playerid, CarSpeed[playerid], 1);
        PlayerTextDrawSetProportional(playerid, CarSpeed[playerid], 1);

        CarFuel[playerid] = CreatePlayerTextDraw(playerid, 442.149963, 401.026672, "FUEL: 1000");
        PlayerTextDrawLetterSize(playerid, CarFuel[playerid], 0.401249, 1.430832);
        PlayerTextDrawAlignment(playerid, CarFuel[playerid], 1);
        PlayerTextDrawColor(playerid, CarFuel[playerid], -1);
        PlayerTextDrawSetShadow(playerid, CarFuel[playerid], 0);
        PlayerTextDrawSetOutline(playerid, CarFuel[playerid], 1);
        PlayerTextDrawBackgroundColor(playerid, CarFuel[playerid], 51);
        PlayerTextDrawFont(playerid, CarFuel[playerid], 1);
        PlayerTextDrawSetProportional(playerid, CarFuel[playerid], 1);

        CarMilliage[playerid] = CreatePlayerTextDraw(playerid, 441.899963, 416.610015, "MILLIAGE: 10000");
        PlayerTextDrawLetterSize(playerid, CarMilliage[playerid], 0.401249, 1.430832);
        PlayerTextDrawAlignment(playerid, CarMilliage[playerid], 1);
        PlayerTextDrawColor(playerid, CarMilliage[playerid], -1);
        PlayerTextDrawSetShadow(playerid, CarMilliage[playerid], 0);
        PlayerTextDrawSetOutline(playerid, CarMilliage[playerid], 1);
        PlayerTextDrawBackgroundColor(playerid, CarMilliage[playerid], 51);
        PlayerTextDrawFont(playerid, CarMilliage[playerid], 1);
        PlayerTextDrawSetProportional(playerid, CarMilliage[playerid], 1);

        CarLights[playerid] = CreatePlayerTextDraw(playerid, 608.125000, 386.166625, "L");
        PlayerTextDrawLetterSize(playerid, CarLights[playerid], 0.449999, 1.600000);
        PlayerTextDrawAlignment(playerid, CarLights[playerid], 1);
        PlayerTextDrawColor(playerid, CarLights[playerid], -1);
        PlayerTextDrawSetShadow(playerid, CarLights[playerid], 0);
        PlayerTextDrawSetOutline(playerid, CarLights[playerid], 1);
        PlayerTextDrawBackgroundColor(playerid, CarLights[playerid], 51);
        PlayerTextDrawFont(playerid, CarLights[playerid], 1);
        PlayerTextDrawSetProportional(playerid, CarLights[playerid], 1);

        CarEngine[playerid] = CreatePlayerTextDraw(playerid, 609.125000, 413.416778, "E");
        PlayerTextDrawLetterSize(playerid, CarEngine[playerid], 0.449999, 1.600000);
        PlayerTextDrawAlignment(playerid, CarEngine[playerid], 1);
        PlayerTextDrawColor(playerid, CarEngine[playerid], -1);
        PlayerTextDrawSetShadow(playerid, CarEngine[playerid], 0);
        PlayerTextDrawSetOutline(playerid, CarEngine[playerid], 1);
        PlayerTextDrawBackgroundColor(playerid, CarEngine[playerid], 51);
        PlayerTextDrawFont(playerid, CarEngine[playerid], 1);
        PlayerTextDrawSetProportional(playerid, CarEngine[playerid], 1);
        return 1;
}

в OnGameModeInit закинем:

CreateGlobalTextDraws();

в OnPlayerConnect:

CreatePlayersTextDraw();

Теперь нам надо сделать так, чтобы игрок который сел в машину на место водителя, видел спидометр
За изменение позиции игрока относительно штата, отвечает паблик OnPlayerStateChange, закинем код туда:
 

if(newstate == PLAYER_STATE_DRIVER)
{
if(!noeng(GetPlayerVehicleID(playerid)))
{
new v = GetPlayerVehicleID(playerid);
VehicleInfo[v][vFuel] = 50.0;
GetPlayerPos(playerid, VehicleInfo[v][vPosx],VehicleInfo[v][vPosy],VehicleInfo[v][vPosz]);
TextDrawShowForPlayer(playerid, SBox);
TextDrawShowForPlayer(playerid, SBox1);
PlayerTextDrawShow(playerid, CarSpeed[playerid]);
PlayerTextDrawShow(playerid, CarFuel[playerid]);
PlayerTextDrawShow(playerid, CarMilliage[playerid]);
PlayerTextDrawShow(playerid, CarLights[playerid]);
PlayerTextDrawShow(playerid, CarEngine[playerid]);
SpeedTimer[playerid] = SetTimerEx("UpdateSpeed",200,1,"d",playerid);
return 1;
}
}
if(oldstate == PLAYER_STATE_DRIVER)
{
TextDrawHideForPlayer(playerid, SBox);
TextDrawHideForPlayer(playerid, SBox1);
PlayerTextDrawHide(playerid, CarSpeed[playerid]);
PlayerTextDrawHide(playerid, CarFuel[playerid]);
PlayerTextDrawHide(playerid, CarMilliage[playerid]);
PlayerTextDrawHide(playerid, CarLights[playerid]);
PlayerTextDrawHide(playerid, CarEngine[playerid]);
KillTimer(SpeedTimer[playerid]);
return 1;
}

теперь в начале мода, нам нужно создать массив для хранения характеристик авто

enum vInfo
{
        vEngine,
        Float:vFuel,
        Float:vMilliage,
        vLights,
        Float:vPosx,Float:vPosy,Float:vPosz
};
new VehicleInfo[MAX_VEHICLES][vInfo];

отлично!

Теперь создадим переменную для таймера, а также паблик самого таймера!

new SpeedTimer[MAX_PLAYERS];

и паблик:

forward UpdateSpeed(playerid);
public UpdateSpeed(playerid)
{
        new string[256];
        new v = GetPlayerVehicleID(playerid);
        format(string,sizeof(string),"SPEED: %d",SpeedVehicle(playerid));
        PlayerTextDrawSetString(playerid, CarSpeed[playerid], string);
        format(string,sizeof(string),"FUEL: %d",floatround(VehicleInfo[v][vFuel]));
        PlayerTextDrawSetString(playerid, CarFuel[playerid], string);
        format(string,sizeof(string),"MILLIAGE: %d",floatround(VehicleInfo[v][vMilliage]));
        PlayerTextDrawSetString(playerid, CarMilliage[playerid], string);
        switch(VehicleInfo[v][vLights])
        {
            case 0: PlayerTextDrawSetString(playerid, CarLights[playerid], "~w~L");
            case 1: PlayerTextDrawSetString(playerid, CarLights[playerid], "~b~L");
        }
        if(VehicleInfo[v][vEngine]) PlayerTextDrawSetString(playerid, CarEngine[playerid], "~b~E");
        else PlayerTextDrawSetString(playerid, CarEngine[playerid],"~w~E");
        if(VehicleInfo[v][vFuel] <= 0)
        {
            VehicleInfo[v][vEngine] = 0;
            VehicleInfo[v][vFuel] = 0.0;
            SetVehicleParamsEx(v, VehicleInfo[v][vEngine], VehicleInfo[v][vLights],0,0,0,0,0);
        }
        if(GetPlayerDistanceFromPoint(playerid, VehicleInfo[v][vPosx], VehicleInfo[v][vPosy], VehicleInfo[v][vPosz]) > 50.0)
        {
            VehicleInfo[v][vMilliage] += 0.1;
            VehicleInfo[v][vFuel] -= 0.05;
            GetPlayerPos(playerid, VehicleInfo[v][vPosx],VehicleInfo[v][vPosy],VehicleInfo[v][
vPosz]);
        }
        return 1;
}

Теперь сделаем заводку двигателя:

в OnPlayerKeyStateChange
 

if(newkeys & KEY_ACTION)
        {
            if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
            {
                        new v = GetPlayerVehicleID(playerid);
                        if(!noeng(v))
                        {
                            if(!VehicleInfo[v][vFuel]) return 1;
                            if(!VehicleInfo[v][vEngine]) VehicleInfo[v][vEngine] = 1;
                            else VehicleInfo[v][vEngine] = 0;
                            SetVehicleParamsEx(v, VehicleInfo[v][vEngine], VehicleInfo[v][vLights], 0, 0, 0, 0, 0);
                            return 1;
                        }
                }
        }

Вот и все! Наш спидометр готов!

Автор кода: wAx
Чуть не забыл, функция проверки на автомобиль  noeng(vehicleid) и функция вычисления скорости
 

stock noeng(carid)
{
        new model = GetVehicleModel(carid);
        if(model == 462||model == 448||model == 509|| model == 510||model == 481||model==468||model == 471 ||
        model == 511 || model == 512||model == 593||model == 520||model == 577||model == 476||model == 519 ||
        model == 460 || model == 513||model == 472||model==473||model == 493||model == 595 || model == 484 ||
        model == 430 || model == 453||model == 452||model == 446||model == 454 ||model == 548 ||model == 425||
        model == 417||model == 487||model == 488||model == 497||model == 563||model == 447||model == 469||model == 553) return 1;
        return 0;
}
stock SpeedVehicle(playerid)
{
    new Float:ST[4];
    if(IsPlayerInAnyVehicle(playerid))
        GetVehicleVelocity(GetPlayerVehicleID(playerid),ST[0],ST[1],ST[2]);
        else GetPlayerVelocity(playerid,ST[0],ST[1],ST[2]);
    ST[3] = floatsqroot(floatpower(floatabs(ST[0]), 2.0) + floatpower(floatabs(ST[1]), 2.0) + floatpower(floatabs(ST[2]), 2.0)) * 100.3;
    return floatround(ST[3]);
}

Оптимизированный вариант stock noeng

stock noeng(carid)
{
        switch(GetVehicleModel(carid))
        {
            case 462,448,509,510,481,468,471,511,512,593,520,577,476,519,460,513,472,473,493,595,484,430: return 1;
            case 453,452,446,454,548,425,417,487,488,497,563,447,469,553: return 1;
            default: return 0;
        }
        return 0;
}
Изменено пользователем Vladimir_Kulkov
  • Like 3

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
kommunits

Спасибо,взял для себя

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
#DNAIKe

Будь добр, укажи автора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
hteppl

Ох,как же ты не красиво поступаешь.В свободном доступе много раз видел этот спидометр.Хоть бы описание чуть подкорректировал,или же скриншот свой сделал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Vladimir_Kulkov

Всм? Автор указан, как бы.

, хм.. Я же уже отвечал в другой теме, если не читал, извини, я игру удалил, так как проблема с пк, у меня видюха нагревается комп выкл сразу. А в игру зайти не могу. Секунд 30 и все сразу.. Выключается комп.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
kommunits

Вставил спидометр! Захожу в машину а там только серый бокс и всё! Помогите исправить 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Vladimir_Kulkov

Все правильно сделали?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
kommunits

@Vladimir_Kulkov, Да! Можете связаться со мной в ЛС форума? Прошу в ЛС подробнее рассказать в чём проблема. Спасибо за внимание 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.