PDA

Просмотр полной версии : [Вопрос] Система топлива



SteveStage
01.01.2020, 16:15
Вот моя система топлива (реализована в спидометре)

@_UpdateSpeed(playerid, vehicleid);
@_UpdateSpeed(playerid, vehicleid)
{
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
{
for(new i; i < 4; i++) PlayerTextDrawDestroy(playerid, td_speed[i]);
return false;
}
if(used_fuel_veh[vehicleid] >= 2 && veh[vehicleid][v_fuel] > 0)
{
veh[vehicleid][v_fuel] -= 1;
used_fuel_veh[vehicleid] = 0;
if(veh[vehicleid][v_fuel] == 0)
{
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
SCM(playerid, COLOR_RED, !"[SERVER] В вашем транспортном средстве кончилось топливо!");
SCM(playerid, COLOR_RED, !"[SERVER] Вы можете вызвать эвакуатор, который отбуксирует вас до ближайшей АЗС");
}
if(IsPlayerConnected(veh[vehicleid][v_ownerid]))
{
new
str[128+1];
format(str, sizeof(str), "UPDATE `vehicles` SET `fuel` = '%d' WHERE `tableid` = '%d'", veh[vehicleid][v_fuel], veh[vehicleid][v_tableid]);
mysql_function_query(connect_mysql, str, false, "", "");
}
}
new
string[16],
getspeed = GetVehicleSpeed(vehicleid);
format(string, sizeof(string), "SPEED: %d KM/H", getspeed);
PlayerTextDrawSetString(playerid, td_speed[1], string);
format(string, sizeof(string), "FUEL: %d", veh[vehicleid][v_fuel]);
PlayerTextDrawSetString(playerid, td_speed[2], string);
format(string, sizeof(string), "LOCK: %s", (lock_veh{vehicleid} == true) ? ("LOCKED") : ("UNLOCKED"));
PlayerTextDrawSetString(playerid, td_speed[3], string);
for(new i = 1; i < 4; i++) PlayerTextDrawShow(playerid, td_speed[i]);
speed_timer[vehicleid] = SetTimerEx("@_UpdateSpeed", 500, false, "dd", playerid, vehicleid);
return true;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
switch(newkeys)
{
case KEY_SPRINT:
{
if(IsPlayerInAnyVehicle(playerid))
{
new
vehicleid = GetPlayerVehicleID(playerid),
getspeed = GetVehicleSpeed(vehicleid);
if(getspeed >= 1 && veh[vehicleid][v_fuel] > 0) used_fuel_veh[vehicleid] += 1;
printf("used fuel - %d, fuel - %d", used_fuel_veh[vehicleid], veh[vehicleid][v_fuel]);
return true;
}
}
}
return true;
}

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

DeimoS
01.01.2020, 16:20
Разве что замерять время зажатия клавиши.
Но вообще вряд ли у тебя получится сделать подобную систему на стороне сервера. Если подобное и делать, то на стороне клиента. Все задержки, связанные с пингом и т.п., будут оказывать неприятное влияние на экспириенс игрока.

Да и смысл делать так, если можно просто в таймере проверять скорость автомобиля и если она выше определённой - повышать потребление топлива?

SteveStage
01.01.2020, 17:32
Да и смысл делать так, если можно просто в таймере проверять скорость автомобиля и если она выше определённой - повышать потребление топлива?

У меня так было раньше, но это как-то нечестно. Если игрок не нажимает на газ, то автомобиль движется по инерции, соответственно бензин не должен тратиться. А так даже при движении по инерции топливо тратится. Но, похоже, что нормально реализовать это я не смогу.

DeimoS
01.01.2020, 19:00
У меня так было раньше, но это как-то нечестно. Если игрок не нажимает на газ, то автомобиль движется по инерции, соответственно бензин не должен тратиться. А так даже при движении по инерции топливо тратится. Но, похоже, что нормально реализовать это я не смогу.

Эмм, почитай о том, как работает двигатель :) Например, вот так (https://www.google.com/search?q=%D1%82%D1%80%D0%B0%D1%82%D0%B8%D1%82%D1%81%D1%8F+%D0%BB%D0%B8+%D0%B1%D0%B5%D0%BD%D0%B7%D0%B8%D0%BD+%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0+%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%B0+%D0%BA%D0%B0%D1%82%D0%B8%D1%82%D1%81%D1%8F&oq=%D1%82%D1%80%D0%B0%D1%82%D0%B8%D1%82%D1%81%D1%8F+%D0%BB%D0%B8+%D0%B1%D0%B5%D0%BD%D0%B7%D0%B8%D0%BD+%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0+%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%B0+%D0%BA%D0%B0%D1%82%D0%B8%D1%82%D1%81%D1%8F&aqs=chrome..69i57.9146j0j7&sourceid=chrome&ie=UTF-8) погугли. А так же учитывай, что люди обсуждают современные авто, а в игре 1992 год :)

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

SteveStage
01.01.2020, 19:37
Эмм, почитай о том, как работает двигатель :) Например, вот так (https://www.google.com/search?q=%D1%82%D1%80%D0%B0%D1%82%D0%B8%D1%82%D1%81%D1%8F+%D0%BB%D0%B8+%D0%B1%D0%B5%D0%BD%D0%B7%D0%B8%D0%BD+%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0+%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%B0+%D0%BA%D0%B0%D1%82%D0%B8%D1%82%D1%81%D1%8F&oq=%D1%82%D1%80%D0%B0%D1%82%D0%B8%D1%82%D1%81%D1%8F+%D0%BB%D0%B8+%D0%B1%D0%B5%D0%BD%D0%B7%D0%B8%D0%BD+%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0+%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%B0+%D0%BA%D0%B0%D1%82%D0%B8%D1%82%D1%81%D1%8F&aqs=chrome..69i57.9146j0j7&sourceid=chrome&ie=UTF-8) погугли. А так же учитывай, что люди обсуждают современные авто, а в игре 1992 год :)

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

Я понял. Цитирую отсюда (https://nplus1.ru/blog/2015/07/08/mileage):


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

DeimoS
02.01.2020, 15:30
Я понял. Цитирую отсюда (https://nplus1.ru/blog/2015/07/08/mileage):

Как я уже писал, во многом всё зависит от внутренностей автомобиля, коих разновидностей существует великое множество.

red.inc
11.01.2020, 12:22
Не судьба создать таймер при заведенном движке автомобиля? И по формуле вычисление 1л бензина на 1км километража - получать число.
Если где-то неправ, извиняюсь

punkochel
23.01.2020, 00:22
Мысль конечно хорошая, что-то близко к реальности. Тут стоит учитывать физику самой игры (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;
}