Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 5 из 5

Тема: Спидометр

  1. #1
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±

    Спидометр

    Вот моя система спидометра:

    1. new speed_timer[MAX_VEHICLES];


    1. public OnPlayerStateChange(playerid, newstate, oldstate)
    2. {
    3. if(newstate == PLAYER_STATE_DRIVER)
    4. {
    5. td_speed[0] = TextDrawCreate(641.531494, 378.333312, "usebox");
    6. TextDrawLetterSize(td_speed[0], 0.000000, 7.525930);
    7. TextDrawTextSize(td_speed[0], 500.723266, 0.000000);
    8. TextDrawUseBox(td_speed[0], true);
    9. TextDrawBoxColor(td_speed[0], 102);
    10. speed_timer[vehicleid] = SetTimerEx("@_UpdateSpeed", 500, false, "dd", playerid, vehicleid);
    11. }
    12. }


    1. @_UpdateSpeed(playerid, vehicleid);
    2. @_UpdateSpeed(playerid, vehicleid)
    3. {
    4. if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
    5. {
    6. KillTimer(speed_timer[vehicleid]);
    7. for(new i; i < 4; i++) TextDrawHideForPlayer(playerid, td_speed[i]);
    8. return false;
    9. }
    10. for(new i; i < 4; i++) TextDrawHideForPlayer(playerid, td_speed[i]);
    11. new
    12. string1[15],
    13. string2[10],
    14. string3[15];
    15. format(string1, sizeof(string1), "SPEED: %d KM/H", GetVehicleSpeed(playerid, vehicleid));
    16. format(string2, sizeof(string2), "FUEL: %d", veh[vehicleid][v_fuel]);
    17. format(string3, sizeof(string3), "LOCK: %s", (lock_veh{vehicleid} == true) ? ("LOCKED") : ("UNLOCKED"));
    18. TD_ChangeSpeed(string1, string2, string3);
    19. for(new i; i < 4; i++) TextDrawShowForPlayer(playerid, td_speed[i]);
    20. speed_timer[vehicleid] = SetTimerEx("@_UpdateSpeed", 500, false, "dd", playerid, vehicleid);
    21. return true;
    22. }


    1. stock TD_ChangeSpeed(const speed[], const fuel[], const lock[])
    2. {
    3. new
    4. color = COLOR_ORANGE;
    5. td_speed[1] = TextDrawCreate(511.200000, 384.666596, speed);
    6. TextDrawLetterSize(td_speed[1], 0.449999, 1.600000);
    7. TextDrawAlignment(td_speed[1], 1);
    8. TextDrawColor(td_speed[1], color);
    9. TextDrawSetShadow(td_speed[1], 0);
    10. TextDrawSetOutline(td_speed[1], 1);
    11. TextDrawBackgroundColor(td_speed[1], 255);
    12. TextDrawFont(td_speed[1], 3);
    13. TextDrawSetProportional(td_speed[1], 1);
    14.  
    15. td_speed[2] = TextDrawCreate(511.200000, 402.916687, fuel);
    16. TextDrawLetterSize(td_speed[2], 0.449999, 1.600000);
    17. TextDrawAlignment(td_speed[2], 1);
    18. TextDrawColor(td_speed[2], color);
    19. TextDrawSetShadow(td_speed[2], 0);
    20. TextDrawSetOutline(td_speed[2], 1);
    21. TextDrawBackgroundColor(td_speed[2], 255);
    22. TextDrawFont(td_speed[2], 3);
    23. TextDrawSetProportional(td_speed[2], 1);
    24.  
    25. td_speed[3] = TextDrawCreate(511.200000, 421.166778, lock); // 18,250091
    26. TextDrawLetterSize(td_speed[3], 0.449999, 1.600000);
    27. TextDrawAlignment(td_speed[3], 1);
    28. TextDrawColor(td_speed[3], color);
    29. TextDrawSetShadow(td_speed[3], 0);
    30. TextDrawSetOutline(td_speed[3], 1);
    31. TextDrawBackgroundColor(td_speed[3], 255);
    32. TextDrawFont(td_speed[3], 3);
    33. TextDrawSetProportional(td_speed[3], 1);
    34. }


    Как вы можете видеть, в UpdateSpeed создаются 3 локальных массива, в них форматируются нужные значения, и после нового запуска они удаляются и потом снова создаются

    А вот если я создам эти 3 массива, но глобальных, и буду форматировать их (первая мера - айди игрока), то уменьшится ли нагрузка от создания и удаления 3 локальных массивов, и как лучше это реализовать?

    P.S. Опечатался в названии, не спмдометр, а спидометр =)

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    3 массива можно спокойно заменить на 1 и записывать строки поочерёдно.
    К тому же у тебя сейчас происходит спам текстдравами, ибо старые текстдравы ты не удаляешь, а скрываешь и поверх создаёшь новую пачку.
    И непонятно зачем там KillTimer, если таймер у тебя создаётся без повторения и при срабатывании условия он и так прекратит своё существование.



    Сильного влияния инициализация массива не будет оказывать. Но если очень хочется ускорить работу кода, то можно просто сделать так:
    1. goto __skip;
    2. new
    3. string1[15],
    4. string2[10],
    5. string3[15];
    6. __skip:

    В этом случае массивы всё так же будут созданы, но не будут инициализированы нулями (то есть, ячейки будут хранить те данные, которые были записаны ранее в стеке). В твоём случае инициализация нулями всё равно не нужна, так что подобный вариант будет работать корректно.
    Хотя, как я изначально написал, корректнее всего создавать 1 массив, а не 3.


    А вот если я создам эти 3 массива, но глобальных, и буду форматировать их (первая мера - айди игрока), то уменьшится ли нагрузка от создания и удаления 3 локальных массивов, и как лучше это реализовать?
    Никакой меры с ID игрока тут не нужно. У тебя код в одном потоке обрабатывается. Зачем тебе создавать для каждого игрока свой массив?
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. #3
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    3 массива можно спокойно заменить на 1 и записывать строки поочерёдно.
    К тому же у тебя сейчас происходит спам текстдравами, ибо старые текстдравы ты не удаляешь, а скрываешь и поверх создаёшь новую пачку.
    И непонятно зачем там KillTimer, если таймер у тебя создаётся без повторения и при срабатывании условия он и так прекратит своё существование.
    Ты говорил про подобную реализацию?

    1. @_UpdateSpeed(playerid, vehicleid);
    2. @_UpdateSpeed(playerid, vehicleid)
    3. {
    4. for(new i; i < 4; i++) TextDrawDestroy(td_speed[i]);
    5. if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return false;
    6. td_speed[0] = TextDrawCreate(641.531494, 378.333312, "usebox");
    7. TextDrawLetterSize(td_speed[0], 0.000000, 7.525930);
    8. TextDrawTextSize(td_speed[0], 500.723266, 0.000000);
    9. TextDrawUseBox(td_speed[0], true);
    10. TextDrawBoxColor(td_speed[0], 102);
    11. if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return false;
    12. new
    13. string[3];
    14. format(string[0], 15, "SPEED: %d KM/H", GetVehicleSpeed(playerid, vehicleid));
    15. format(string[1], 10, "FUEL: %d", veh[vehicleid][v_fuel]);
    16. format(string[2], 11, "LOCK: %s", (lock_veh{vehicleid} == true) ? ("LOCKED") : ("UNLOCKED"));
    17. TD_ChangeSpeed(string[0], string[1], string[2]);
    18. for(new i; i < 4; i++) TextDrawShowForPlayer(playerid, td_speed[i]);
    19. speed_timer[vehicleid] = SetTimerEx("@_UpdateSpeed", 500, false, "dd", playerid, vehicleid);
    20. return true;
    21. }


    UPD: Проверил, и получил такие сообщения от крашдетекта:

    1. [14:33:26] [debug] Run time error 6: "Invalid instruction"
    2. [14:33:26] [debug] Unknown opcode 0x2700 at address 0x00000043
    3. [14:33:26] [debug] AMX backtrace:
    4. [14:33:26] [debug] #0 00000000 in public @_UpdateSpeed ()


    Все равно не понимаю, как можно создать 1 массив, если TD_ChangeSpeed требует 3...
    Последний раз редактировалось SteveStage; 30.12.2019 в 15:54.

  4. #4
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Эмм, нет. Я говорю про вариант, при котором ты код из TD_ChangeSpeed переносишь в таймер и делаешь так:
    1. new string[15];
    2. format(string, sizeof(string), "SPEED: %d KM/H", GetVehicleSpeed(playerid, vehicleid));
    3. td_speed[1] = TextDrawCreate(511.200000, 384.666596, string);
    4. /*...*/
    5.  
    6. format(string, sizeof(string), "FUEL: %d", veh[vehicleid][v_fuel]);
    7. td_speed[2] = TextDrawCreate(511.200000, 402.916687, fuel);
    8. /*...*/
    9.  
    10. //И т.п.


    И зачем тебе две одинаковых проверки?
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Получилось вот так (вместе с системой топлива):

    1. @_UpdateSpeed(playerid, vehicleid);
    2. @_UpdateSpeed(playerid, vehicleid)
    3. {
    4. if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
    5. {
    6. for(new i; i < 4; i++) TextDrawDestroy(td_speed[i]);
    7. return false;
    8. }
    9. new
    10. getspeed = GetVehicleSpeed(vehicleid);
    11. if(getspeed >= 1 && veh[vehicleid][v_fuel] > 0)
    12. {
    13. switch(getspeed)
    14. {
    15. case 1..20: used_fuel_veh[vehicleid] += 1;
    16. case 21..40: used_fuel_veh[vehicleid] += 2;
    17. case 41..80: used_fuel_veh[vehicleid] += 3;
    18. case 81..100: used_fuel_veh[vehicleid] += 4;
    19. case 101..130: used_fuel_veh[vehicleid] += 5;
    20. }
    21. }
    22. if(used_fuel_veh[vehicleid] == 180 && veh[vehicleid][v_fuel] > 0)
    23. {
    24. veh[vehicleid][v_fuel] -= 1;
    25. used_fuel_veh[vehicleid] = 0;
    26. if(veh[vehicleid][v_fuel] == 0)
    27. {
    28. GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    29. SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
    30. SCM(playerid, COLOR_RED, !"[SERVER] В вашем транспортном средстве кончилось топливо!");
    31. SCM(playerid, COLOR_RED, !"[SERVER] Вы можете вызвать эвакуатор, который отбуксирует вас до ближайшей АЗС");
    32. }
    33. if(IsPlayerConnected(veh[vehicleid][v_ownerid]))
    34. {
    35. new
    36. str[128+1];
    37. format(str, sizeof(str), "UPDATE `vehicles` SET `fuel` = '%d' WHERE `tableid` = '%d'", veh[vehicleid][v_fuel], veh[vehicleid][v_tableid]);
    38. mysql_function_query(connect_mysql, str, false, "", "");
    39. }
    40. }
    41. new
    42. string[16];
    43. format(string, sizeof(string), "SPEED: %d KM/H", getspeed);
    44. TextDrawSetString(td_speed[1], string);
    45. format(string, sizeof(string), "FUEL: %d", veh[vehicleid][v_fuel]);
    46. TextDrawSetString(td_speed[2], string);
    47. format(string, sizeof(string), "LOCK: %s", (lock_veh{vehicleid} == true) ? ("LOCKED") : ("UNLOCKED"));
    48. TextDrawSetString(td_speed[3], string);
    49. speed_timer[vehicleid] = SetTimerEx("@_UpdateSpeed", 500, false, "dd", playerid, vehicleid);
    50. return true;
    51. }


    1. public OnPlayerStateChange(playerid, newstate, oldstate)
    2. {
    3. if(newstate == PLAYER_STATE_DRIVER)
    4. {
    5. TD_CreateSpeed();
    6. for(new i; i < 4; i++) TextDrawShowForPlayer(playerid, td_speed[i]);
    7. speed_timer[vehicleid] = SetTimerEx("@_UpdateSpeed", 500, false, "dd", playerid, vehicleid);
    8. }
    9. }


    1. stock TD_CreateSpeed()
    2. {
    3. td_speed[0] = TextDrawCreate(641.531494, 378.333312, "usebox");
    4. TextDrawLetterSize(td_speed[0], 0.000000, 7.525930);
    5. TextDrawTextSize(td_speed[0], 500.723266, 0.000000);
    6. TextDrawUseBox(td_speed[0], true);
    7. TextDrawBoxColor(td_speed[0], 102);
    8.  
    9. td_speed[1] = TextDrawCreate(511.200000, 384.666596, "SPEED: 0 KM/H");
    10. TextDrawLetterSize(td_speed[1], 0.449999, 1.600000);
    11. TextDrawAlignment(td_speed[1], 1);
    12. TextDrawColor(td_speed[1], COLOR_ORANGE);
    13. TextDrawSetShadow(td_speed[1], 0);
    14. TextDrawSetOutline(td_speed[1], 1);
    15. TextDrawBackgroundColor(td_speed[1], 255);
    16. TextDrawFont(td_speed[1], 3);
    17. TextDrawSetProportional(td_speed[1], 1);
    18.  
    19. td_speed[2] = TextDrawCreate(511.200000, 402.916687, "FUEL: 50");
    20. TextDrawLetterSize(td_speed[2], 0.449999, 1.600000);
    21. TextDrawAlignment(td_speed[2], 1);
    22. TextDrawColor(td_speed[2], COLOR_ORANGE);
    23. TextDrawSetShadow(td_speed[2], 0);
    24. TextDrawSetOutline(td_speed[2], 1);
    25. TextDrawBackgroundColor(td_speed[2], 255);
    26. TextDrawFont(td_speed[2], 3);
    27. TextDrawSetProportional(td_speed[2], 1);
    28.  
    29. td_speed[3] = TextDrawCreate(511.200000, 421.166778, "LOCK: UNLOCKED"); // 18,250091
    30. TextDrawLetterSize(td_speed[3], 0.449999, 1.600000);
    31. TextDrawAlignment(td_speed[3], 1);
    32. TextDrawColor(td_speed[3], COLOR_ORANGE);
    33. TextDrawSetShadow(td_speed[3], 0);
    34. TextDrawSetOutline(td_speed[3], 1);
    35. TextDrawBackgroundColor(td_speed[3], 255);
    36. TextDrawFont(td_speed[3], 3);
    37. TextDrawSetProportional(td_speed[3], 1);
    38. }


    В общем можно просто создать текстдравы спидометра один раз и изменять их через SetString, и нагрузки это не вызовет, да и цвет текста не меняется, а если гг не в машине - удалять текстдравы. И использовать 1 массив для каждого текстдрава поочередно.
    Если кто-либо хочет сделать замечание - пожалуйста. Тему не закрывайте.
    Последний раз редактировалось SteveStage; 30.12.2019 в 18:57. Причина: Доработка

 

 

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

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

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

Ваши права

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