Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 6 из 6
  1. #1
    Аватар для SteveStage
    Пользователь

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

    Система коробки передач.

    Натолкните меня на мысль, как сделать ускорение автомобиля? Основа уже есть, но при ее использовании авто беспорядочно кидает в разные стороны.

    1. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    2. {
    3. switch(newkeys)
    4. {
    5. case KEY_ANALOG_UP:
    6. {
    7. if(!IsPlayerInAnyVehicle(playerid)) return false;
    8. new
    9. vehicleid = GetPlayerVehicleID(playerid);
    10. switch(veh[vehicleid][v_gear])
    11. {
    12. case GEAR_1: // set gear 2
    13. {
    14. new
    15. Float:z;
    16. GetVehicleVelocity(vehicleid, z, z, z);
    17. SetVehicleVelocity(vehicleid, 0.9, 0.9, z);
    18. veh[vehicleid][v_gear] = GEAR_2;
    19. }
    20. case GEAR_2: // set gear 3
    21. {
    22. new
    23. Float:z;
    24. GetVehicleVelocity(vehicleid, z, z, z);
    25. SetVehicleVelocity(vehicleid, 1.2, 1.2, z);
    26. veh[vehicleid][v_gear] = GEAR_3;
    27. }
    28. case GEAR_3: // set gear 4
    29. {
    30. new
    31. Float:z;
    32. GetVehicleVelocity(vehicleid, z, z, z);
    33. SetVehicleVelocity(vehicleid, 1.5, 1.5, z);
    34. veh[vehicleid][v_gear] = GEAR_4;
    35. }
    36. case GEAR_4: // set gear 5
    37. {
    38. new
    39. Float:z;
    40. GetVehicleVelocity(vehicleid, z, z, z);
    41. SetVehicleVelocity(vehicleid, 1.8, 1.8, z);
    42. veh[vehicleid][v_gear] = GEAR_5;
    43. }
    44. case GEAR_5: // set gear r
    45. {
    46. new
    47. Float:z;
    48. GetVehicleVelocity(vehicleid, z, z, z);
    49. SetVehicleVelocity(vehicleid, 0.0, 0.0, z);
    50. veh[vehicleid][v_gear] = GEAR_R;
    51. }
    52. case GEAR_R: // set gear 1
    53. {
    54. new
    55. Float:z;
    56. GetVehicleVelocity(vehicleid, z, z, z);
    57. SetVehicleVelocity(vehicleid, 0.7, 0.7, z);
    58. veh[vehicleid][v_gear] = GEAR_1;
    59. }
    60. default: veh[vehicleid][v_gear] = GEAR_1;
    61. }
    62. new
    63. str[24+1],
    64. gear[1+1];
    65. if(veh[vehicleid][v_gear] == GEAR_R) strmid(gear, "R", 0, sizeof(gear));
    66. else valstr(gear, veh[vehicleid][v_gear]);
    67. format(str, sizeof(str), "VEHICLE GEAR CHANGE TO %s", gear);
    68. TextForPlayer(playerid, str, 3000, 2);
    69. printf("%d - gear", veh[vehicleid][v_gear]);
    70. }
    71. case KEY_ANALOG_DOWN:
    72. {
    73. if(!IsPlayerInAnyVehicle(playerid)) return false;
    74. new
    75. vehicleid = GetPlayerVehicleID(playerid);
    76. switch(veh[vehicleid][v_gear])
    77. {
    78. case GEAR_1: // set gear r
    79. {
    80. new
    81. Float:z;
    82. GetVehicleVelocity(vehicleid, z, z, z);
    83. SetVehicleVelocity(vehicleid, 0.0, 0.0, z);
    84. veh[vehicleid][v_gear] = GEAR_R;
    85. }
    86. case GEAR_2: // set gear 1
    87. {
    88. new
    89. Float:z;
    90. GetVehicleVelocity(vehicleid, z, z, z);
    91. SetVehicleVelocity(vehicleid, 0.7, 0.7, z);
    92. veh[vehicleid][v_gear] = GEAR_3;
    93. }
    94. case GEAR_3: // set gear 2
    95. {
    96. new
    97. Float:z;
    98. GetVehicleVelocity(vehicleid, z, z, z);
    99. SetVehicleVelocity(vehicleid, 0.9, 0.9, z);
    100. veh[vehicleid][v_gear] = GEAR_4;
    101. }
    102. case GEAR_4: // set gear 3
    103. {
    104. new
    105. Float:z;
    106. GetVehicleVelocity(vehicleid, z, z, z);
    107. SetVehicleVelocity(vehicleid, 1.2, 1.2, z);
    108. veh[vehicleid][v_gear] = GEAR_5;
    109. }
    110. case GEAR_5: // set gear 4
    111. {
    112. new
    113. Float:z;
    114. GetVehicleVelocity(vehicleid, z, z, z);
    115. SetVehicleVelocity(vehicleid, 1.5, 1.5, z);
    116. veh[vehicleid][v_gear] = GEAR_R;
    117. }
    118. case GEAR_R: // set gear 5
    119. {
    120. new
    121. Float:z;
    122. GetVehicleVelocity(vehicleid, z, z, z);
    123. SetVehicleVelocity(vehicleid, 1.8, 1.8, z);
    124. veh[vehicleid][v_gear] = GEAR_1;
    125. }
    126. default: veh[vehicleid][v_gear] = GEAR_1;
    127. }
    128. new
    129. str[24+1],
    130. gear[1+1];
    131. if(veh[vehicleid][v_gear] == GEAR_R) strmid(gear, "R", 0, sizeof(gear));
    132. else valstr(gear, veh[vehicleid][v_gear]);
    133. format(str, sizeof(str), "VEHICLE GEAR CHANGE TO %s", gear);
    134. TextForPlayer(playerid, str, 3000, 2);
    135. printf("%d - gear", veh[vehicleid][v_gear]);
    136. return true;
    137. }
    138. }
    139. return true;
    140. }


    Как сделать нормальную макс. скорость авто на разных передачах?

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Такое есть смысл делать только на стороне клиента, ибо если делать на стороне сервера, то с пингом больше 100 эта система уже будет ощущаться не очень комфортно для игрока.

    Ну а если очень хочется, то SetVehicleVelocity + функция изменения гравитации для конкретного игрока из YSF или подобного плагина. Увеличением гравитации можно добиться более сильного прижатия к дороге и, соответственно, авто будет меньше носить.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    Полностью согласен по поводу пинга. У тех людей у кого пинг большой, будут испытывать большие проблемы с вашей системой, даже если ваша система будет удовлетворять всем стандартам, и будут оптимизирована. Всегда стоит помнить о том, что SA-MP является архитектурой "Клиент->Сервер" и наоборот. То есть, если клиент не отдаст свои данные, то следовательно, сервер их не получит, до тех пор, пока пакеты не дойдут до сервера (исправьте меня обязательно, если я не прав!). И да, система "коробок передач" не заключается в том, чтобы "разгонять" транспорт. Насколько я знаю, при переключении передач, скорость остаётся неизменной, либо наоборот(?) уменьшается в несколько единиц.
    Поэтому, мне кажется, необходимо оставлять скорость неизменной при переходе на новую ступень.

    По поводу кода ничем не смогу помочь на данный момент.
    Последний раз редактировалось L0ndl3m; 30.01.2020 в 21:16.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от L0ndl3m Посмотреть сообщение
    Полностью согласен по поводу пинга. У тех людей у кого пинг большой, будут испытывать большие проблемы с вашей системой, даже если ваша система будет удовлетворять всем стандартам, и будут оптимизирована. Всегда стоит помнить о том, что SA-MP является архитектурой "Клиент->Сервер" и наоборот. То есть, если клиент не отдаст свои данные, то следовательно, сервер их не получит, до тех пор, пока пакеты не дойдут до сервера (исправьте меня обязательно, если я не прав!). И да, система "коробок передач" не заключается в том, чтобы "разгонять" транспорт. Насколько я знаю, при переключении передач, скорость остаётся неизменной, либо наоборот(?) уменьшается в несколько единиц.
    Поэтому, мне кажется, необходимо оставлять скорость неизменной при переходе на новую ступень.

    По поводу кода ничем не смогу помочь на данный момент.
    Так он и пытается сделать так, чтоб скорость была неизменной. Правда делает он это кривовато. Стоило посмотреть как реализованы функции, по типу "SetVehicleSpeed"
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

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

    1. stock SetVehicleSpeed(vehicleid, Float:speed)
    2. {
    3. new Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2, Float:a;
    4. GetVehicleVelocity(vehicleid, x1, y1, z1);
    5. GetVehiclePos(vehicleid, x2, y2, z2);
    6. GetVehicleZAngle(vehicleid, a); a = 360 - a;
    7. x1 = (floatsin(a, degrees) * (speed/100) + floatcos(a, degrees) * 0 + x2) - x2;
    8. y1 = (floatcos(a, degrees) * (speed/100) + floatsin(a, degrees) * 0 + y2) - y2;
    9. SetVehicleVelocity(vehicleid, x1, y1, z1);
    10. }


    но вычисление скорости авто у меня такое:

    1. stock GetVehicleSpeed(vehicleid)
    2. {
    3. new
    4. Float:x, Float:y, Float:z;
    5. GetVehicleVelocity(vehicleid, x, y, z);
    6. return floatround(floatsqroot(x*x+y*y+z*z)*100);
    7. }


    а они могут отличаться в вычислении => скорость не будет выставляться корректно. Вот это и тормозит меня.

    Может быть вот так?

    1. @_UpdateSpeed(playerid, vehicleid, oldspeed);
    2. @_UpdateSpeed(playerid, vehicleid, oldspeed)
    3. {
    4. new
    5. getspeed = GetVehicleSpeed(vehicleid),
    6. Float:carhp,
    7. string[16],
    8. engine,
    9. lights,
    10. alarm,
    11. bonnet,
    12. boot,
    13. objective,
    14. doors;
    15. GetVehicleHealth(vehicleid, carhp);
    16. GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    17. if(carhp <= 300.0)
    18. {
    19. if(engine == VEHICLE_PARAMS_ON) SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
    20. SetVehicleHealth(vehicleid, 300.0);
    21. if(is_veh_dmg_first_time{vehicleid} == true)
    22. {
    23. SCM(playerid, COLOR_RED, !"[SERVER] Ваше транспортное средство повреждено!");
    24. is_veh_dmg_first_time{vehicleid} = false;
    25. }
    26. }
    27. if(getspeed >= veh[vehicleid][v_max_speed] && getspeed >= 1) SetVehicleSpeed(vehicleid, veh[vehicleid][v_max_speed] - 1.0);
    28. if(veh[vehicleid][v_fuel] > 0 && engine == VEHICLE_PARAMS_ON)
    29. {
    30. if(getspeed == 0) used_fuel_veh[vehicleid] += 1;
    31. else if(getspeed >= 1)
    32. {
    33. if(getspeed >= oldspeed)
    34. {
    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. }
    55. format(string, sizeof(string), "SPEED: %d KM/H", getspeed);
    56. PlayerTextDrawSetString(playerid, td_speed[1], string);
    57. format(string, sizeof(string), "FUEL: %d", veh[vehicleid][v_fuel]);
    58. PlayerTextDrawSetString(playerid, td_speed[2], string);
    59. format(string, sizeof(string), "LOCK: %s", (veh[vehicleid][v_lock] == true) ? ("LOCKED") : ("UNLOCKED"));
    60. PlayerTextDrawSetString(playerid, td_speed[3], string);
    61. for(new i = 1; i < sizeof(td_speed); i++) PlayerTextDrawShow(playerid, td_speed[i]);
    62. speed_timer[vehicleid] = SetTimerEx("@_UpdateSpeed", 250, false, "ddd", playerid, vehicleid, getspeed);
    63. return true;
    64. }


    1. {
    2. switch(newkeys)
    3. {
    4. case KEY_ANALOG_UP:
    5. {
    6. if(!IsPlayerInAnyVehicle(playerid)) return false;
    7. new
    8. vehicleid = GetPlayerVehicleID(playerid);
    9. switch(veh[vehicleid][v_gear])
    10. {
    11. case GEAR_1: // set gear 2
    12. {
    13. veh[vehicleid][v_max_speed] = 70.0;
    14. veh[vehicleid][v_gear] = GEAR_2;
    15. }
    16. case GEAR_2: // set gear 3
    17. {
    18. veh[vehicleid][v_max_speed] = 90.0;
    19. veh[vehicleid][v_gear] = GEAR_3;
    20. }
    21. case GEAR_3: // set gear 4
    22. {
    23. veh[vehicleid][v_max_speed] = 120.0;
    24. veh[vehicleid][v_gear] = GEAR_4;
    25. }
    26. case GEAR_4: // set gear 5
    27. {
    28. veh[vehicleid][v_max_speed] = 150.0;
    29. veh[vehicleid][v_gear] = GEAR_5;
    30. }
    31. case GEAR_5: // set gear r
    32. {
    33. veh[vehicleid][v_max_speed] = 0.0;
    34. veh[vehicleid][v_gear] = GEAR_R;
    35. }
    36. case GEAR_R: // set gear 1
    37. {
    38. veh[vehicleid][v_max_speed] = 50.0;
    39. veh[vehicleid][v_gear] = GEAR_1;
    40. }
    41. default: veh[vehicleid][v_gear] = GEAR_1;
    42. }
    43. new
    44. str[24+1],
    45. gear[1+1];
    46. if(veh[vehicleid][v_gear] == GEAR_R) strmid(gear, "R", 0, sizeof(gear));
    47. else valstr(gear, veh[vehicleid][v_gear]);
    48. format(str, sizeof(str), "VEHICLE GEAR CHANGE TO %s", gear);
    49. TextForPlayer(playerid, str, 3000, 2);
    50. printf("%d - gear", veh[vehicleid][v_gear]);
    51. }
    52. case KEY_ANALOG_DOWN:
    53. {
    54. if(!IsPlayerInAnyVehicle(playerid)) return false;
    55. new
    56. vehicleid = GetPlayerVehicleID(playerid);
    57. switch(veh[vehicleid][v_gear])
    58. {
    59. case GEAR_1: // set gear r
    60. {
    61. veh[vehicleid][v_max_speed] = 0.0;
    62. veh[vehicleid][v_gear] = GEAR_R;
    63. }
    64. case GEAR_2: // set gear 1
    65. {
    66. veh[vehicleid][v_max_speed] = 50.0;
    67. veh[vehicleid][v_gear] = GEAR_3;
    68. }
    69. case GEAR_3: // set gear 2
    70. {
    71. veh[vehicleid][v_max_speed] = 70.0;
    72. veh[vehicleid][v_gear] = GEAR_4;
    73. }
    74. case GEAR_4: // set gear 3
    75. {
    76. veh[vehicleid][v_max_speed] = 90.0;
    77. veh[vehicleid][v_gear] = GEAR_5;
    78. }
    79. case GEAR_5: // set gear 4
    80. {
    81. veh[vehicleid][v_max_speed] = 120.0;
    82. veh[vehicleid][v_gear] = GEAR_R;
    83. }
    84. case GEAR_R: // set gear 5
    85. {
    86. veh[vehicleid][v_max_speed] = 150.0;
    87. veh[vehicleid][v_gear] = GEAR_1;
    88. }
    89. default: veh[vehicleid][v_gear] = GEAR_1;
    90. }
    91. new
    92. str[24+1],
    93. gear[1+1];
    94. if(veh[vehicleid][v_gear] == GEAR_R) strmid(gear, "R", 0, sizeof(gear));
    95. else valstr(gear, veh[vehicleid][v_gear]);
    96. format(str, sizeof(str), "VEHICLE GEAR CHANGE TO %s", gear);
    97. TextForPlayer(playerid, str, 3000, 2);
    98. printf("%d - gear", veh[vehicleid][v_gear]);
    99. return true;
    100. }
    101. }
    102. return true;
    103. }


    Суть в том, что передача меняет макс. скорость, а настоящая скорость не меняется, только уменьшается, если она достигает максимальной.

    Проверил: машину все равно кидает в стороны. Как это реализовывать и можно ли - я хз, а главное - стоят ли усилия над коробкой передач того? Я думаю нет.
    Последний раз редактировалось SteveStage; 31.01.2020 в 01:16.

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

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

    1. stock SetVehicleSpeed(vehicleid, Float:speed)
    2. {
    3. new Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2, Float:a;
    4. GetVehicleVelocity(vehicleid, x1, y1, z1);
    5. GetVehiclePos(vehicleid, x2, y2, z2);
    6. GetVehicleZAngle(vehicleid, a); a = 360 - a;
    7. x1 = (floatsin(a, degrees) * (speed/100) + floatcos(a, degrees) * 0 + x2) - x2;
    8. y1 = (floatcos(a, degrees) * (speed/100) + floatsin(a, degrees) * 0 + y2) - y2;
    9. SetVehicleVelocity(vehicleid, x1, y1, z1);
    10. }


    но вычисление скорости авто у меня такое:

    1. stock GetVehicleSpeed(vehicleid)
    2. {
    3. new
    4. Float:x, Float:y, Float:z;
    5. GetVehicleVelocity(vehicleid, x, y, z);
    6. return floatround(floatsqroot(x*x+y*y+z*z)*100);
    7. }


    а они могут отличаться в вычислении => скорость не будет выставляться корректно. Вот это и тормозит меня.
    Не совсем понимаю кто или что может отличаться от вычислений и почему скорость будет выставляться некорректно? Если ты не можешь под свою функцию составить формулу изменения скорости, то просто возьми уже готовые функции как получения, так и изменения скорости, работающие по одному принципу

    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    Суть в том, что передача меняет макс. скорость, а настоящая скорость не меняется, только уменьшается, если она достигает максимальной.
    Если это не то, что ты задумывал, то так происходит, ибо ты сам такое условие составил, не?

    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    Проверил: машину все равно кидает в стороны.
    Я уже выше писал, что тут только ковыряние гравитации может хоть немного ситуацию изменить. Но всё равно будет кривовато и игроки с большим пингом будут страдать.

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

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

    Steve Pavlina

 

 

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

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

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

Ваши права

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