Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 20
  1. #1
    Аватар для 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++) PlayerTextDrawDestroy(playerid, td_speed[i]);
    7. return false;
    8. }
    9. new
    10. getspeed = GetVehicleSpeed(vehicleid),
    11. Float:carhp,
    12. engine,
    13. lights,
    14. alarm,
    15. bonnet,
    16. boot,
    17. objective,
    18. doors;
    19. GetVehicleHealth(vehicleid, carhp);
    20. GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    21. if(carhp <= 300.0)
    22. {
    23. if(engine == VEHICLE_PARAMS_ON) SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
    24. SetVehicleHealth(vehicleid, 300.0);
    25. SCM(playerid, COLOR_RED, !"[SERVER] Ваше транспортное средство повреждено!");
    26. }
    27. if(veh[vehicleid][v_fuel] > 0 && engine == VEHICLE_PARAMS_ON)
    28. {
    29. if(getspeed == 0) used_fuel_veh[vehicleid] += 1;
    30. else if(getspeed >= 1)
    31. {
    32. if(getspeed <= GetVehicleSpeed(vehicleid))
    33. {
    34. getspeed = GetVehicleSpeed(vehicleid);
    35. if(getspeed >= 1 && getspeed <= 20) used_fuel_veh[vehicleid] += 4;
    36. else if(getspeed >= 21 && getspeed <= 50) used_fuel_veh[vehicleid] += 6;
    37. else if(getspeed >= 51 && getspeed <= 70) used_fuel_veh[vehicleid] += 10;
    38. else if(getspeed >= 71 && getspeed <= 120) used_fuel_veh[vehicleid] += 14;
    39. else if(getspeed >= 121 && getspeed <= 300) used_fuel_veh[vehicleid] += 18;
    40. }
    41. else used_fuel_veh[vehicleid] += 1;
    42. }
    43. }
    44. if(used_fuel_veh[vehicleid] >= 250 && veh[vehicleid][v_fuel] > 0)
    45. {
    46. veh[vehicleid][v_fuel] -= 1;
    47. used_fuel_veh[vehicleid] = 0;
    48. if(veh[vehicleid][v_fuel] == 0)
    49. {
    50. GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    51. if(engine == VEHICLE_PARAMS_ON) SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
    52. SCM(playerid, COLOR_RED, !"[SERVER] В вашем транспортном средстве кончилось топливо!");
    53. }
    54. if(IsPlayerConnected(veh[vehicleid][v_ownerid]))
    55. {
    56. new
    57. str[128+1];
    58. format(str, sizeof(str), "UPDATE `vehicles` SET `fuel` = '%d' WHERE `tableid` = '%d'", veh[vehicleid][v_fuel], veh[vehicleid][v_tableid]);
    59. mysql_function_query(connect_mysql, str, false, "", "");
    60. }
    61. }
    62. new
    63. string[16];
    64. format(string, sizeof(string), "SPEED: %d KM/H", getspeed);
    65. PlayerTextDrawSetString(playerid, td_speed[1], string);
    66. format(string, sizeof(string), "FUEL: %d", veh[vehicleid][v_fuel]);
    67. PlayerTextDrawSetString(playerid, td_speed[2], string);
    68. format(string, sizeof(string), "LOCK: %s", (lock_veh{vehicleid} == true) ? ("LOCKED") : ("UNLOCKED"));
    69. PlayerTextDrawSetString(playerid, td_speed[3], string);
    70. for(new i = 1; i < 4; i++) PlayerTextDrawShow(playerid, td_speed[i]);
    71. speed_timer[vehicleid] = SetTimerEx("@_UpdateSpeed", 500, false, "dd", playerid, vehicleid);
    72. return true;
    73. }


    Хороша ли система и можно ли ускорить ее скорость, не потеряв работоспособности? Если да, то привидите пример.

  2. #2
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    (пару недель вообще ничего не писал, т.к. надоело)
    Важная информация.

    Хм..
    1.
    1. new
    2. getspeed = GetVehicleSpeed(vehicleid),

    2.
    1. if(getspeed <= GetVehicleSpeed(vehicleid))

    3.
    1. getspeed = GetVehicleSpeed(vehicleid);

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

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±
    В циклах лучше использовать sizeof, а не магические числа.

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

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от execution Посмотреть сообщение
    Хм..
    1.
    1. new
    2. getspeed = GetVehicleSpeed(vehicleid),

    2.
    1. if(getspeed <= GetVehicleSpeed(vehicleid))

    3.
    1. getspeed = GetVehicleSpeed(vehicleid);
    Сначала в getspeed записывается скорость автомобиля, потом если она меньше свежеполученной, значит авто ускоряется, а соответственно потребление топлива увеличивается. а приравнивание в конце для того, чтобы в getspeed была актуальная скорость.

    Цитата Сообщение от tnc Посмотреть сообщение
    В циклах лучше использовать sizeof, а не магические числа.
    Это не магические числа, а количества текстдравов. Да и чем эти варианты лучше?

    1. for(new i; i < sizeof(td_speed); i++) PlayerTextDrawDestroy(playerid, td_speed[i]);
    2. for(new i = 1; i < sizeof(td_speed); i++) PlayerTextDrawShow(playerid, td_speed[i]);
    Последний раз редактировалось SteveStage; 25.01.2020 в 17:50.

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

    Статус
    Оффлайн
    Регистрация
    22.04.2016
    Адрес
    Украина
    Сообщений
    157
    Репутация:
    35 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    Это не магические числа, а количества текстдравов. Да и чем эти варианты лучше?
    Тем, что если ты захочешь изменить количество текстдравов, то тебе не придётся лезть в каждый цикл и менять эти магические цифры. Да и я бы вообще воспользовался дополнительной константой для обозначение индекса каждого изменяемого текстдрава : TEXTDRAW_SPEED_INDEX, TEXTDRAW_LOCKED_INDEX. Но это уже субъективные предпочтение.

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

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от Pa4enka Посмотреть сообщение
    Тем, что если ты захочешь изменить количество текстдравов, то тебе не придётся лезть в каждый цикл и менять эти магические цифры. Да и я бы вообще воспользовался дополнительной константой для обозначение индекса каждого изменяемого текстдрава : TEXTDRAW_SPEED_INDEX, TEXTDRAW_LOCKED_INDEX. Но это уже субъективные предпочтение.
    Сам говорит про удобство изменения количества текстдравов и потом говорит про константы -_-
    Если удобство - sizeof, и никакие константы менять не придется.

  7. #7
    Аватар для Pa4enka
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.04.2016
    Адрес
    Украина
    Сообщений
    157
    Репутация:
    35 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    Сам говорит про удобство изменения количества текстдравов и потом говорит про константы -_-
    Если удобство - sizeof, и никакие константы менять не придется.
    О константе это уже моё мнение, то как я это делаю в основном. А sizeof это удобно, практично и более информативно, нежели магические числа. А вообще, открой какой нибудь серьёзный скрипт не на павн, и поймёшь, что там не встречаются никакие лишние числа. И как не странно, оно читается каждым человеком, который базово знаком с основами программирования.

  8. #8
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    Сначала в getspeed записывается скорость автомобиля, потом если она меньше свежеполученной, значит авто ускоряется, а соответственно потребление топлива увеличивается. а приравнивание в конце для того, чтобы в getspeed была актуальная скорость
    Это всё конечно хорошо, но в каждом срабатывании этого паблика - локальные переменные будут заново создаваться, и с чем ты теперь будешь сравнивать?)

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    Сам говорит про удобство изменения количества текстдравов и потом говорит про константы -_-
    Если удобство - sizeof, и никакие константы менять не придется.
    Константы и sizeof никак друг с другом не связаны.

    Именными константами ты помечаешь каждый конкретный текстдрав, чтоб вот тут:
    1. PlayerTextDrawSetString(playerid, td_speed[1], string);

    вместо непонятной единицы словами было написано, что это текстдрав, отображающий скорость. Так же и с остальными текстдравами. Использовать удобнее enum, а не отдельно константы объявлять.
    Только я бы не чистым капсом их называл, а вперемешку со строчными буквами или вообще смесью lowerCamelCase и snake_case, по типу "td_Speedometr_SpeedText" (а для PlayerText, соответственно, "ptd_..."). Ибо чисто заглавными обычно обозначают какие-либо константы, хранящие размер чего-то и т.п. Ну это моё ИМХО.

    А sizeof уже прописываешь в циклах. И, как уже писали, чтоб, в случае увеличения числа текстдравов, не пришлось изменять значения вручную. И чтоб если решишь уменьшить число текстдравов, не словить выход за пределы массива. Написав на несколько символов больше, ты обезопасишь себя от проблем в будущем. Так что лениться не стоит.

    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    Сначала в getspeed записывается скорость автомобиля, потом если она меньше свежеполученной, значит авто ускоряется, а соответственно потребление топлива увеличивается. а приравнивание в конце для того, чтобы в getspeed была актуальная скорость.
    Между вызовами двух getspeed даже пары тиков, скорее всего, не пройдёт, так что скорость 100% не будет отличаться. Смысла в этой проверке нет никакого.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Между вызовами двух getspeed даже пары тиков, скорее всего, не пройдёт, так что скорость 100% не будет отличаться. Смысла в этой проверке нет никакого.
    А как тогда узнать, ускоряется ли автомобиль? Создать еще одну переменную oldspeed и хранить в ней скорость предыдущего обновления?

    Это нормальная реализация?

    1. @_UpdateSpeed(playerid, vehicleid);
    2. @_UpdateSpeed(playerid, vehicleid)
    3. {
    4. if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
    5. {
    6. for(new i; i < sizeof(td_speed); i++) PlayerTextDrawDestroy(playerid, td_speed[i]);
    7. return false;
    8. }
    9. new
    10. getspeed = GetVehicleSpeed(vehicleid),
    11. oldspeed = GetPVarInt(playerid, "OldSpeed"),
    12. Float:carhp,
    13. engine,
    14. lights,
    15. alarm,
    16. bonnet,
    17. boot,
    18. objective,
    19. doors;
    20. GetVehicleHealth(vehicleid, carhp);
    21. GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    22. if(carhp < 300.0)
    23. {
    24. if(engine == VEHICLE_PARAMS_ON) SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
    25. SetVehicleHealth(vehicleid, 300.0);
    26. if(is_veh_dmg_first_time{vehicleid} == true)
    27. {
    28. SCM(playerid, COLOR_RED, !"[SERVER] Ваше транспортное средство повреждено!");
    29. is_veh_dmg_first_time{vehicleid} = false;
    30. }
    31. }
    32. if(veh[vehicleid][v_fuel] > 0 && engine == VEHICLE_PARAMS_ON)
    33. {
    34. if(getspeed == 0) used_fuel_veh[vehicleid] += 1;
    35. else if(getspeed >= 1)
    36. {
    37. if(getspeed <= oldspeed)
    38. {
    39. if(getspeed >= 1 && getspeed <= 20) used_fuel_veh[vehicleid] += 4;
    40. else if(getspeed >= 21 && getspeed <= 50) used_fuel_veh[vehicleid] += 6;
    41. else if(getspeed >= 51 && getspeed <= 70) used_fuel_veh[vehicleid] += 10;
    42. else if(getspeed >= 71 && getspeed <= 120) used_fuel_veh[vehicleid] += 14;
    43. else if(getspeed >= 121 && getspeed <= 300) used_fuel_veh[vehicleid] += 18;
    44. }
    45. else used_fuel_veh[vehicleid] += 1;
    46. }
    47. }
    48. if(used_fuel_veh[vehicleid] >= 250 && veh[vehicleid][v_fuel] > 0)
    49. {
    50. veh[vehicleid][v_fuel] -= 1;
    51. used_fuel_veh[vehicleid] = 0;
    52. if(veh[vehicleid][v_fuel] == 0)
    53. {
    54. GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    55. if(engine == VEHICLE_PARAMS_ON) SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
    56. SCM(playerid, COLOR_RED, !"[SERVER] В вашем транспортном средстве кончилось топливо!");
    57. }
    58. if(IsPlayerConnected(veh[vehicleid][v_ownerid]))
    59. {
    60. new
    61. str[128+1];
    62. format(str, sizeof(str), "UPDATE `vehicles` SET `fuel` = '%d' WHERE `tableid` = '%d'", veh[vehicleid][v_fuel], veh[vehicleid][v_tableid]);
    63. mysql_function_query(connect_mysql, str, false, "", "");
    64. }
    65. }
    66. new
    67. string[16];
    68. format(string, sizeof(string), "SPEED: %d KM/H", getspeed);
    69. PlayerTextDrawSetString(playerid, td_speed[1], string);
    70. format(string, sizeof(string), "FUEL: %d", veh[vehicleid][v_fuel]);
    71. PlayerTextDrawSetString(playerid, td_speed[2], string);
    72. format(string, sizeof(string), "LOCK: %s", (lock_veh{vehicleid} == true) ? ("LOCKED") : ("UNLOCKED"));
    73. PlayerTextDrawSetString(playerid, td_speed[3], string);
    74. for(new i = 1; i < sizeof(td_speed); i++) PlayerTextDrawShow(playerid, td_speed[i]);
    75. SetPVarInt(playerid, "OldSpeed", getspeed);
    76. speed_timer[vehicleid] = SetTimerEx("@_UpdateSpeed", 500, false, "dd", playerid, vehicleid);
    77. return true;
    78. }
    Последний раз редактировалось SteveStage; 26.01.2020 в 19:00.

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

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

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

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

Ваши права

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