Vladaman
Ученик
На форуме не нашел ни одного урока по созданию спидометра. Решил выложить.
Скажу сразу, если кому-то не нравится, то прошу не флудить здесь и не засорять тему ненужными высказываниями.
Вот скрин спидометра:
Для начала подумаем, как его сделать. Вариант функцией SendClientMessage сразу отпадает, так как текст, созданный ею, не может обновляться и отсылает сообщения в чат, а вниз экрана.
Функция GameTextForPlayer подошла бы, но не у всех стоят хорошие шрифты.
Единственный вариант сделать это в той или иной степени без багов, это использовать текстдрав (динамический).
Как вы видели на том скриншоте в спидометре 3 критерия: скорость, бензин и hp авто. Если hp автомобиля можно узнать встроенной функцией (GetVehicleHealth), то функции определения скорости и бензина придется сделать самим.
Теперь надо создать функцию для получения скорости. Нам поможет функция GetVehicleVelocity.
Вот мы создали функцию определения скорости.
Следующий шаг: создание самого спидометра
В начало мода вставляем:
Идем в public OnPlayerConnect и делаем textdraw.
Это мы создали текстдрав.
Теперь делаем, чтобы он обновлялся
В начало мода вставим:
В OnGameModeInit:
В конец мода:
Все. Теперь текстдрав будет обновляться.
Сделаем, чтобы он показывался игроку.
Вставляем в public OnPlayerStateChange:
Сделаем, чтобы он скрывался при выходе игрока из авто.
Вот и все.
При создании урока, я опирался не на мод gf и ему подобные, а на моды, которые пишутся с нуля, так как считаю gf безнадежным модом
P.S. Если есть замечания, пишите!
Скажу сразу, если кому-то не нравится, то прошу не флудить здесь и не засорять тему ненужными высказываниями.
Вот скрин спидометра:
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
(прошу не расценивать, как рекламу)Для начала подумаем, как его сделать. Вариант функцией SendClientMessage сразу отпадает, так как текст, созданный ею, не может обновляться и отсылает сообщения в чат, а вниз экрана.
Функция GameTextForPlayer подошла бы, но не у всех стоят хорошие шрифты.
Единственный вариант сделать это в той или иной степени без багов, это использовать текстдрав (динамический).
Как вы видели на том скриншоте в спидометре 3 критерия: скорость, бензин и hp авто. Если hp автомобиля можно узнать встроенной функцией (GetVehicleHealth), то функции определения скорости и бензина придется сделать самим.
Теперь надо создать функцию для получения скорости. Нам поможет функция GetVehicleVelocity.
PHP:
stock GetVehicleSpeed(playerid)
{
new Float:speed[4]; // Объявляем одномерный массив с вещественным типом переменных
if(IsPlayerInAnyVehicle(playerid)) GetVehicleVelocity(GetPlayerVehicleID(playerid),speed[0],speed[1],speed[2]); // Если игрок в каком-либо транспорте, то узнаем скорость его ТС по x, y и z и записываем их в массив
speed[3] = floatsqroot(floatpower(floatabs(speed[0]), 2.0) + floatpower(floatabs(speed[1]), 2.0) + floatpower(floatabs(speed[2]), 2.0)) * 253.3; // узнаем квадратный корень и записываем в speed[3]
return floatround(speed[3]); // возвращаем
}
Следующий шаг: создание самого спидометра
В начало мода вставляем:
PHP:
new Text:Speed[MAX_PLAYERS];
PHP:
Speed[playerid] = TextDrawCreate(260.0, 431.0,"~y~km/h: ~w~0 ~y~Benzin: ~w~0 ~y~Health: ~w~0"); // Делаем textdraw (~y~ - желтый цвет; ~w~ - белый) \
TextDrawAlignment(Speed[playerid],0); // Выравнивание. В данном случае 0 (нет 0) А вообще 1 - по левому краю, 2 - по ширине, 3 - по правому краю
TextDrawBackgroundColor(Speed[playerid],0x000000FF); // Цвет обводки (в данном случае черный)
TextDrawFont(Speed[playerid],1); // Тип ТекстДрава
TextDrawSetOutline(Speed[playerid], 2); //Толщина обводки
TextDrawLetterSize(Speed[playerid],0.350000,1.300000); // Размер символов
TextDrawColor(Speed[playerid],0xFFFFFFFF);//цвет символов
TextDrawSetProportional(Speed[playerid],1); //
Теперь делаем, чтобы он обновлялся
В начало мода вставим:
PHP:
forward SpeedUpdate();
PHP:
SetTimer("SpeedUpdate",1000,1); // 1000 - это время в миллисекундах, через которое будет обновляться текстдрав (1000 миллисекунд = 1 секунда)
PHP:
public SpeedUpdate()
{
new string[255]; // объявляем одномерный массив
for(new i; i<MAX_PLAYERS; i++) // объявляем цикл
{
if(GetPlayerState(i) == PLAYER_STATE_DRIVER) // Если игрок - водитель ТС
{
new Float:vhealth; // объявляем переменную вещественного типа (hp авто)
GetVehicleHealth(GetPlayerVehicleID(i), vhealth); // Узнаем hp авто и запишем его в переменную vhealth
format(string, sizeof(string), "~y~Km/h: ~w~%d ~y~Benzin: ~w~%d ~y~Health: ~w~%.f", GetVehicleSpeed(i), Fuel[GetPlayerVehicleID(i)], vhealth); // Создадим текст, который будет в текстдраве
TextDrawSetString(Speed[i], string); // Обновим текстдрав
}
}
return 1;
}
Сделаем, чтобы он показывался игроку.
Вставляем в public OnPlayerStateChange:
PHP:
if(newstate == PLAYER_STATE_DRIVER) // Если игрок стал водителем
{
TextDrawShowForPlayer(playerid, Speed[playerid]); // Теперь он будет показываться
}
Сделаем, чтобы он скрывался при выходе игрока из авто.
PHP:
if(newstate == PLAYER_STATE_ONFOOT) // Если игрок стал пешеходом
{
TextDrawHideForPlayer(playerid, Speed[playerid]); // скроем текстдрав
}
При создании урока, я опирался не на мод gf и ему подобные, а на моды, которые пишутся с нуля, так как считаю gf безнадежным модом
P.S. Если есть замечания, пишите!
Последнее редактирование:
