Vladimir_Kulkov 87 Опубликовано 19 января, 2017 (изменено) В основном, после освоения азов систем регистраций, перед новичком(который только-только начинает писать СВОИ моды), стоит задача сделать функциональный, рабочий спидометр. Чаще всего возникает вопрос "как же сделать его"? Так вот, я заметил, большинство тем содержат в себе либо текстдравы(рисунок) либо функцию, но я почти не замечал где же обучение, за что отвечает та или иная строчка. Естественно расписывать очень подробно, всегда не легко, в любом случае я постараюсь уместить всю полезную информацию в один урок.И так, для начала, необходимо будет придумать стиль спидометра, его дизайн. Если вы раньше не знали, то спидометры и прочую красивую ерунду, рисуют пользуясь текстдравами. Так вот очень удобно "рисовать" спидометры и т.д в IpleoMax Textdraw Editor, у него понятный интерфейс, также вам не придется по долгу возится с позициями и размерами текстдравов, поищите тему на форуме!Нарисовав спидометр, нам необходимо создать текстдравы, я выбрал весьма простой дизай для своего спидометра: Приступим же к скриптовому исполнению задуманного!Для начала для нарисованных текстдравов, необходимо создать переменные: 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; } Изменено 19 января, 2017 пользователем Vladimir_Kulkov 3 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
kommunits 0 Опубликовано 6 февраля, 2017 Спасибо,взял для себя Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
#DNAIKe 180 Опубликовано 6 февраля, 2017 Будь добр, укажи автора. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
hteppl 214 Опубликовано 6 февраля, 2017 Ох,как же ты не красиво поступаешь.В свободном доступе много раз видел этот спидометр.Хоть бы описание чуть подкорректировал,или же скриншот свой сделал. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Vladimir_Kulkov 87 Опубликовано 6 февраля, 2017 Всм? Автор указан, как бы. , хм.. Я же уже отвечал в другой теме, если не читал, извини, я игру удалил, так как проблема с пк, у меня видюха нагревается комп выкл сразу. А в игру зайти не могу. Секунд 30 и все сразу.. Выключается комп. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
kommunits 0 Опубликовано 6 февраля, 2017 Вставил спидометр! Захожу в машину а там только серый бокс и всё! Помогите исправить Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Vladimir_Kulkov 87 Опубликовано 6 февраля, 2017 Все правильно сделали? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
kommunits 0 Опубликовано 6 февраля, 2017 @Vladimir_Kulkov, Да! Можете связаться со мной в ЛС форума? Прошу в ЛС подробнее рассказать в чём проблема. Спасибо за внимание Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты