Просмотр полной версии : [Вопрос] Снимаем бензин по километрам
Доброго времени суток пользователи портала.
Столкнулся с проблемой по расходу бензина за 1км
Делаю вот так:
new Float:sp = SpeedVehicle(playerid);
new Float:l = (sp/2)/1000;
new veh = GetPlayerVehicleID(playerid);
Fuell[veh] -= l;
И когда этот код срабатывает, вместо количества бензина показывает скорость автомобиля...
vovandolg
26.08.2016, 09:35
А ещё больше кода нельзя выложить?
new Float:sp = SpeedVehicle(playerid);
Что это за функция такая?
Что это за функция такая?
Скорее всего что то в роде этого
stock SpeedVehicle(playerid)
{
new Float:ST[4];
if(IsPlayerInAnyVehicle(playerid))
GetVehicleVelocity(GetPlayerVehicleID(playerid),ST[0],ST[1],ST[2]);
else GetPlayerVelocity(playerid,ST[0],ST[1],ST[2]);
ST[3] = floatsqroot(floatpower(floatabs(ST[0]), 2.0) + floatpower(floatabs(ST[1]), 2.0) + floatpower(floatabs(ST[2]), 2.0)) * 100.3;
return floatround(ST[3]);
}
Зачем использовать floatabs, если число возводится в квадрат? Более того, для вычисления длины вектора есть функция VectorSize, которая на порядок быстрее.
stock SpeedVehicle(playerid)
{
new
Float:x,
Float:y,
Float:z,
vehicleid;
vehicleid = GetPlayerVehicleID(playerid);
if (vehicleid != 0) {
GetVehicleVelocity(vehicleid, x, y, z);
} else {
GetPlayerVelocity(playerid, x, y, z);
}
return floatround(VectorSize(x, y, z) * 100.0);
}
Зачем использовать floatabs, если число возводится в квадрат? Более того, для вычисления длины вектора есть функция VectorSize, которая на порядок быстрее.
stock SpeedVehicle(playerid)
{
new
Float:z,
Float:y,
Float:z,
vehicleid;
vehicleid = GetPlayerVehicleID(playerid);
if (vehicleid != 0) {
GetVehicleVelocity(vehicleid, x, y, z);
} else {
GetPlayerVelocity(playerid, x, y, z);
}
return floatround(VectorSize(x, y, z)) * 100;
}
2 раза z объявил, поправь
UP: проверил, функция работает неправильно, когда еду на машине не показывает скорость больше 100, или 0 или 100
проверил, функция работает неправильно, когда еду на машине не показывает скорость больше 100, или 0 или 100
Исправил, просто обычно я не округляю скорость, а выдаю значение в виде Float числа, немного перепутал.
vovandolg
26.08.2016, 19:19
Зачем использовать floatabs, если число возводится в квадрат? Более того, для вычисления длины вектора есть функция VectorSize, которая на порядок быстрее.
stock SpeedVehicle(playerid)
{
new
Float:x,
Float:y,
Float:z,
vehicleid;
vehicleid = GetPlayerVehicleID(playerid);
if (vehicleid != 0) {
GetVehicleVelocity(vehicleid, x, y, z);
} else {
GetPlayerVelocity(playerid, x, y, z);
}
return floatround(VectorSize(x, y, z) * 100.0);
}
имхо, я так бы не назвал функцию, так как она вычисляет не только в авто, но и пешком)
имхо, я так бы не назвал функцию, так как она вычисляет не только в авто, но и пешком)
Претензию к автору темы
имхо, я так бы не назвал функцию, так как она вычисляет не только в авто, но и пешком)
Я бы тоже, название GetSpeed больше подходит (хотя я бы не объединял две функции в одну, а разделил бы на GetPlayerSpeed и GetVehicleSpeed).
Всегда интересовался, существенная разница есть?
Float:stock GetPlayerSpeed(playerid)
{
new Float:speed;
// тра ля ля
return speed;
}
stock GetPlayerSpeed(playerid, &Float:speed)
{
// ...
}
Всегда интересовался, существенная разница есть?
Float:stock GetPlayerSpeed(playerid)
{
new Float:speed;
// тра ля ля
return speed;
}
stock GetPlayerSpeed(playerid, &Float:speed)
{
// ...
}
Как по мне, разница существенная - первая функция не скомпилируется, вторая скомпилируется.
А по сути - нет, делай так, как удобно. Но стандартные функции SA-MP придерживаются второго варианта, поэтому имеет смысл использовать его (для сохранения общего стиля).
Но стандартные функции SA-MP придерживаются второго варианта, поэтому имеет смысл использовать его (для сохранения общего стиля).
Не все, например VectorSize(), поэтому и спросил, спасибо.
Сама функция:
stock SpeedVehicle(playerid)
{
if(!IsPlayerInAnyVehicle(playerid)) return 1;
new Float:X, Float:Y, Float:Z;
GetVehicleVelocity(GetPlayerVehicleID(playerid),X,Y,Z);
return floatround(VectorSize(X, Y, Z) * 100.3);
}
Капец вы в теме раздули. Я даже сказать ничего не могу....
Проблема вот в чём, не онемает бензин по километрам...
Сама функция:
stock SpeedVehicle(playerid)
{
if(!IsPlayerInAnyVehicle(playerid)) return 1;
new Float:X, Float:Y, Float:Z;
GetVehicleVelocity(GetPlayerVehicleID(playerid),X,Y,Z);
return floatround(VectorSize(X, Y, Z) * 100.3);
}
Капец вы в теме раздули. Я даже сказать ничего не могу....
Проблема вот в чём, не онемает бензин по километрам...
Зачем вызывать IsPlayerInAnyVehicle, если GetPlayerVehicleID вернет 0, если игрок не в авто? Покажи показ бензина, ты же на ТД делаешь спидометр? Скорее всего ты ошибся текстдравом
Зачем вызывать IsPlayerInAnyVehicle, если GetPlayerVehicleID вернет 0, если игрок не в авто? Покажи показ бензина, ты же на ТД делаешь спидометр? Скорее всего ты ошибся текстдравом
Да не ошибся я текстдравом, ты просто по смотри на код, который я показал выше, просто суть проблемы мне не ясна, и я не могу её решить в одиночку, по этому я решил поделиться проблемой со всеми.
Когда сработает хоть один раз:
new Float:sp = SpeedVehicle(playerid);
new Float:l = (sp/2)/1000;
new veh = GetPlayerVehicleID(playerid);
Fuell[veh] -= l;
То бензин на спидометре убирается, полностью, и в графе там где литраж автомобиля, начинается показывать скорость автомобиля...
Зачем вызывать IsPlayerInAnyVehicle, если GetPlayerVehicleID вернет 0
Захотелось, и сделал так.
Да не ошибся я текстдравом, ты просто по смотри на код, который я показал выше, просто суть проблемы мне не ясна, и я не могу её решить в одиночку, по этому я решил поделиться проблемой со всеми.
Когда сработает хоть один раз:
new Float:sp = SpeedVehicle(playerid);
new Float:l = (sp/2)/1000;
new veh = GetPlayerVehicleID(playerid);
Fuell[veh] -= l;
То бензин на спидометре убирается, полностью, и в графе там где литраж автомобиля, начинается показывать скорость автомобиля...
Зачем вызывать IsPlayerInAnyVehicle, если GetPlayerVehicleID вернет 0
Захотелось, и сделал так.
new Float:sp = SpeedVehicle(playerid);
new Float:l = (sp/2)/1000;
new veh = GetPlayerVehicleID(playerid);
printf("%d %f %f", veh, l, Fuell[veh]);
Fuell[veh] -= l;
printf("%f", Fuell[veh]);
Скинь лог
new Float:sp = SpeedVehicle(playerid);
new Float:l = (sp/2)/1000;
new veh = GetPlayerVehicleID(playerid);
printf("%d %f %f", veh, l, Fuell[veh]);
Fuell[veh] -= l;
printf("%f", Fuell[veh]);
Скинь лог
[00:05:05] 387 0.020999 1318926976.000000 || LOG
[00:05:05] 1318926976.000000 || LOG
Переменная Fuell у меня объявлена не как Float;
Сама функция:
stock SpeedVehicle(playerid)
{
if(!IsPlayerInAnyVehicle(playerid)) return 1;
new Float:X, Float:Y, Float:Z;
GetVehicleVelocity(GetPlayerVehicleID(playerid),X,Y,Z);
return floatround(VectorSize(X, Y, Z) * 100.3);
}
Капец вы в теме раздули. Я даже сказать ничего не могу....
Проблема вот в чём, не онемает бензин по километрам...
SpeedVehicle возвращает целое число, а ты записываешь его в переменную с тегом Float, в этом и проблема.
SpeedVehicle возвращает целое число, а ты записываешь его в переменную с тегом Float, в этом и проблема.
new sp = SpeedVehicle(playerid);
new l = (sp/2)/1000;
new veh = GetPlayerVehicleID(playerid);
Fuell[veh] -= l;
Сделал по другому, километры не идут...
Лог:
[00:32:24] 387 0 50 || LOG
[00:32:24] 50 || LOG
А если попробовать уменьшать количество топлива, оператором переопределения тегов?
new sp = SpeedVehicle(playerid);
new Float: l = (sp/2)/1000;
new veh = GetPlayerVehicleID(playerid);
Fuell[veh] -= _:l;
Или с помощью функции floatround
new sp = SpeedVehicle(playerid);
new Float: l = (sp/2)/1000;
new veh = GetPlayerVehicleID(playerid);
Fuell[veh] -= floatround(l);
А если попробовать уменьшать количество топлива, оператором переопределения тегов?
new sp = SpeedVehicle(playerid);
new Float: l = (sp/2)/1000;
new veh = GetPlayerVehicleID(playerid);
Fuell[veh] -= _:l;
Или с помощью функции floatround
new sp = SpeedVehicle(playerid);
new Float: l = (sp/2)/1000;
new veh = GetPlayerVehicleID(playerid);
Fuell[veh] -= floatround(l);
Второй вариант отнимает, но теперь прийдеться настраивать
new Float: l = (sp/2)/1000;
Но вот и следующий вопрос, если объявить
Fuell как Float
Тогда как мне быть с этим диалогом?
case 652:
{
if(response)
{
new veh = GetPlayerVehicleID(playerid);
new zaprakas = 0;
for(new i = 0; i < sizeof(SBI); i++)
{
if(sscanf(inputtext,"d",zaprakas))
{
new str[80];
format(str,70,"{00ffff}Заправочная станция - {21BD4B}%s",SBI[i][sbMessage]);
SPD(playerid, 652, DIALOG_STYLE_INPUT, str, "Вы хотите заправить автомобиль топливом\nдля этого вам нужно ввести количество топлива в данном окне.\nПомните: Вводите количество топлива которое вместится в ваш бак\n\nВвод количества топлива:\n", "Ввод", "Отмена");
return 1;
}
if(SBI[i][sbProducts] <=0 && SBI[i][sbOwned] == 1)
{
new str[80];
format(str,70,"{00ffff}Заправочная станция - {21BD4B}%s",SBI[i][sbMessage]);
SPD(playerid, 652, DIALOG_STYLE_INPUT, str, "Вы хотите заправить автомобиль топливом\nдля этого вам нужно ввести количество топлива в данном окне.\nПомните: Вводите количество топлива которое вместится в ваш бак\n\n{FF0000}На заправке отсутствует бензин.\n", "Ввод", "Отмена");
return 1;
}
if(zaprakas > GetCarBak(veh))
{
new str[80];
format(str,70,"{00ffff}Заправочная станция - {21BD4B}%s",SBI[i][sbMessage]);
SPD(playerid, 652, DIALOG_STYLE_INPUT, str, "Вы хотите заправить автомобиль топливом\nдля этого вам нужно ввести количество топлива в данном окне.\nПомните: Вводите количество топлива которое вместится в ваш бак\n\n{FF0000}Количество заливаемого бензина не вместится в бак автомобиля.\n", "Ввод", "Отмена");
return 1;
}
if(Fuell[veh] == GetCarBak(veh))
{
new str[80];
format(str,70,"{00ffff}Заправочная станция - {21BD4B}%s",SBI[i][sbMessage]);
SPD(playerid, 652, DIALOG_STYLE_INPUT, str, "Вы хотите заправить автомобиль топливом\nдля этого вам нужно ввести количество топлива в данном окне.\nПомните: Вводите количество топлива которое вместится в ваш бак\n\n{FF0000}Бак автомобиля заполнен.\n", "Ввод", "Отмена");
return 1;
}
if(Fuell[veh] + zaprakas > GetCarBak(veh))
{
new str[80];
format(str,70,"{00ffff}Заправочная станция - {21BD4B}%s",SBI[i][sbMessage]);
if(IsACarA(veh)) return SPD(playerid, 652, DIALOG_STYLE_INPUT, str, "Вы хотите заправить мотоцикл топливом\nдля этого вам нужно ввести количество топлива в данном окне.\nПомните: Вводите количество топлива которое вместится в ваш бак\n\n{FF0000}В бак мотоцикла нельзя заправить больше.\n", "Ввод", "Отмена");
if(IsACarB(veh)) return SPD(playerid, 652, DIALOG_STYLE_INPUT, str, "Вы хотите заправить автомобиль топливом\nдля этого вам нужно ввести количество топлива в данном окне.\nПомните: Вводите количество топлива которое вместится в ваш бак\n\n{FF0000}В бак автомобиля нельзя заправить больше.\n", "Ввод", "Отмена");
if(IsACarC(veh)) return SPD(playerid, 652, DIALOG_STYLE_INPUT, str, "Вы хотите заправить автомобиль топливом\nдля этого вам нужно ввести количество топлива в данном окне.\nПомните: Вводите количество топлива которое вместится в ваш бак\n\n{FF0000}В бак автомобиля нельзя заправить больше.\n", "Ввод", "Отмена");
return 1;
}
SetTimerEx("FillingCar", 2000, false, "iid",playerid,i,zaprakas);
GameTextForPlayer(playerid,"Please Wait",2000,3);
}
}else return 1;
}
Пример
GetCarBak
forward GetCarBak(vehicleid);
public GetCarBak(vehicleid)
{
new model = GetVehicleModel(vehicleid);
switch(model)
{
case 400:return 77;
default:return 50;
}
return 0;
}
case 400: ID автомобиля. return 77; - Кол-во бензина для транспорта.
Вместо целочисленного числа укажи вещественное число.
forward GetCarBak(vehicleid);
public GetCarBak(vehicleid)
{
switch(GetVehicleModel(vehicleid))
{
case 400: return 77.0;
default: return 50.0;
}
return 0;
}
Какая у тебя жесть с типами (тегами) творится, используй для бензина везде Float и не придумывай себе проблем.
Какая у тебя жесть с типами (тегами) творится, используй для бензина везде Float и не придумывай себе проблем.
А с диалогом моим как быть?
- - - Добавлено - - -
Вместо целочисленного числа укажи вещественное число.
forward GetCarBak(vehicleid);
public GetCarBak(vehicleid)
{
switch(GetVehicleModel(vehicleid))
{
case 400: return 77.0;
default: return 50.0;
}
return 0;
}
warning 213: несовпадение типов
forward GetCarBak(vehicleid);
public GetCarBak(vehicleid)
{
switch(GetVehicleModel(vehicleid))
{
case 400: return _:77.0;
default: return _:50.0;
}
return 0;
}
Честно говоря, это уже какой то вздор получается.
stock Float:GetCarBak(vehicleid)
{
switch (GetVehicleModel(vehicleid))
{
case 400: return 77.0;
default: return 50.0;
}
return 0.0;
}
Очень большое всем спасибо!
Сделал систему бензина на Float, и переделал заправки, переделана система отнимания бензина.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot