Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 8 из 8
  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. if(used_fuel_veh[vehicleid] >= 2 && veh[vehicleid][v_fuel] > 0)
    10. {
    11. veh[vehicleid][v_fuel] -= 1;
    12. used_fuel_veh[vehicleid] = 0;
    13. if(veh[vehicleid][v_fuel] == 0)
    14. {
    15. GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    16. SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
    17. SCM(playerid, COLOR_RED, !"[SERVER] В вашем транспортном средстве кончилось топливо!");
    18. SCM(playerid, COLOR_RED, !"[SERVER] Вы можете вызвать эвакуатор, который отбуксирует вас до ближайшей АЗС");
    19. }
    20. if(IsPlayerConnected(veh[vehicleid][v_ownerid]))
    21. {
    22. new
    23. str[128+1];
    24. format(str, sizeof(str), "UPDATE `vehicles` SET `fuel` = '%d' WHERE `tableid` = '%d'", veh[vehicleid][v_fuel], veh[vehicleid][v_tableid]);
    25. mysql_function_query(connect_mysql, str, false, "", "");
    26. }
    27. }
    28. new
    29. string[16],
    30. getspeed = GetVehicleSpeed(vehicleid);
    31. format(string, sizeof(string), "SPEED: %d KM/H", getspeed);
    32. PlayerTextDrawSetString(playerid, td_speed[1], string);
    33. format(string, sizeof(string), "FUEL: %d", veh[vehicleid][v_fuel]);
    34. PlayerTextDrawSetString(playerid, td_speed[2], string);
    35. format(string, sizeof(string), "LOCK: %s", (lock_veh{vehicleid} == true) ? ("LOCKED") : ("UNLOCKED"));
    36. PlayerTextDrawSetString(playerid, td_speed[3], string);
    37. for(new i = 1; i < 4; i++) PlayerTextDrawShow(playerid, td_speed[i]);
    38. speed_timer[vehicleid] = SetTimerEx("@_UpdateSpeed", 500, false, "dd", playerid, vehicleid);
    39. return true;
    40. }


    1. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    2. {
    3. switch(newkeys)
    4. {
    5. case KEY_SPRINT:
    6. {
    7. if(IsPlayerInAnyVehicle(playerid))
    8. {
    9. new
    10. vehicleid = GetPlayerVehicleID(playerid),
    11. getspeed = GetVehicleSpeed(vehicleid);
    12. if(getspeed >= 1 && veh[vehicleid][v_fuel] > 0) used_fuel_veh[vehicleid] += 1;
    13. printf("used fuel - %d, fuel - %d", used_fuel_veh[vehicleid], veh[vehicleid][v_fuel]);
    14. return true;
    15. }
    16. }
    17. }
    18. return true;
    19. }


    И если я буду задрачивать кнопку "w", то бензин будет отниматься быстрее, чем если я просто зажму её. Как можно реализовать нормальную систему бензина, где что при нажатии, что при зажатии "w" бензина будет отниматься одинаково, а если "w" не нажата - вовсе не отнимать бензин? (Знаю, что надо еще отнятие бензина и на "s" сделать, но мне бы логику действий понять хотя бы)

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

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

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

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

    Steve Pavlina

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

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

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    У меня так было раньше, но это как-то нечестно. Если игрок не нажимает на газ, то автомобиль движется по инерции, соответственно бензин не должен тратиться. А так даже при движении по инерции топливо тратится. Но, похоже, что нормально реализовать это я не смогу.
    Эмм, почитай о том, как работает двигатель :) Например, вот так погугли. А так же учитывай, что люди обсуждают современные авто, а в игре 1992 год :)

    Ну если всё ещё хочется извращений - читай и пробуй сделать за счёт отслеживания времени зажатия (игрок нажал на кнопку - таймер обновления бензина запустился. Игрок отпустил кнопку - таймер остановился). Разумной такую реализацию не назвать, как, собственно, и реалистичной (в реальности двигатель работает "чуточку" сложнее. При этом, во многом всё зависит от модели двигателя/автомобиля), но если очень хочется, то дерзай.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Эмм, почитай о том, как работает двигатель :) Например, вот так погугли. А так же учитывай, что люди обсуждают современные авто, а в игре 1992 год :)

    Ну если всё ещё хочется извращений - читай и пробуй сделать за счёт отслеживания времени зажатия (игрок нажал на кнопку - таймер обновления бензина запустился. Игрок отпустил кнопку - таймер остановился). Разумной такую реализацию не назвать, как, собственно, и реалистичной (в реальности двигатель работает "чуточку" сложнее. При этом, во многом всё зависит от модели двигателя/автомобиля), но если очень хочется, то дерзай.
    Я понял. Цитирую отсюда:

    Топливо же будет тратиться только на поддержание работы двигателя.

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

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

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    30.07.2019
    Адрес
    Беларусь, Витебск
    Сообщений
    23
    Репутация:
    0 ±
    Не судьба создать таймер при заведенном движке автомобиля? И по формуле вычисление 1л бензина на 1км километража - получать число.
    Если где-то неправ, извиняюсь

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

    Статус
    Оффлайн
    Регистрация
    08.12.2018
    Адрес
    Россия
    Сообщений
    146
    Репутация:
    25 ±
    Мысль конечно хорошая, что-то близко к реальности. Тут стоит учитывать физику самой игры (GTA SA), то бишь когда отпускаешь W (газ), скорость автомобиля начинает резко снижаться, поэтому как таковой инерции нет и следовательно погрешность в расчетах будешь крайне мала, или как минимум она не будет стоить того чтобы выделять на нее ресурсы сервера или игрока.
    DeimoS на мой взгляд верно заметил что делать расчет по скорости (добавлю от себя, при работающем двигателе) будет весьма неплохо. Если мы представим реальную ситуацию, то можно заметить что расход топлива повышается в зависимости от скорости автомобиля. Физика игры не предусматривает ступени коробки передач (хотя ее можно реализовать), если бы она была, тут можно было бы все сделать все очень просто.
    Пример (при условии использования в секундном таймере:
    Код:
    new Float:SpeedCar[MAX_VEHICLES]; // Скорость кара
    new Float:GasCar[MAX_VEHICLES]; // Бензин кара
    new GearStage[MAX_VEHICLES]; // Ступень в коробке передач
    stock GasConsumption(vehicleid)
    {
    	if(GearStage[vehicleid] == 1)
    	{
    		GasCar[vehicleid] -= (SpeedCar[vehicleid]*0.15)/3600 
    		// 0.15 - Это процент из расчета: 15 литров / 100 км.
    		// 3600 - Это секунды (При условии что GasConsumption будет использоваться в секундном таймере)
    	}
    	else if(GearStage[vehicleid] == 2)
    	{
    		GasCar[vehicleid] -= (SpeedCar[vehicleid]*0.10)/3600
    	}
    	// И так далее
    	return 1;
    }

 

 

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

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

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

Ваши права

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