Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!: Округлить до тысячных - Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!

Перейти к содержимому

  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Pawn ]
Округлить до тысячных

#1
Пользователь офлайн   Sonic X 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
Округлить число в переменной до тысячных возможно только через формат %.4f или есть ещё способы?

Сообщение отредактировал Sonic X: 30 июня 2020 - 08:51

0

#2
Пользователь офлайн   Sonic X 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
У меня есть 8 переменных для координат (xyza) которые необходимо сравнить. Проблема в том, что они одинаковы только до тысячных, дальше уже идёт небольшое несовпадение (тут тоже вопрос, почему такое может быть, если координаты авто в принципе не меняются :wacko:). Поэтому использовать 8 раз функцию format, чтобы округлить значения... Ну такое, уже проще будет без этих сравнений.
0

#3
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию
Это особенность хранения чисел с плавающей точкой в компьютерах. Хотя она не должна влиять на сравнение значений в переменных, по идее.

Но вообще, в отрыве от координат - если нужна точность, то следует использовать целые числа. Округление до каких-то тысячных тут не поможет, ибо это "округление" будет существовать только пока ты хранишь число как строку. Только ты запишешь по новой число в переменную и вновь у чисел появится "окончание", ибо суть вещественных чисел в том и состоит, что они, по сути, имеют бесконечное количество знаков после запятой (это уже особенность математики).

Покажи конкретный пример, в котором у тебя есть проблемы с сравнением.

Сообщение отредактировал DeimoS: 30 июня 2020 - 09:53

0

#4
Пользователь офлайн   Sonic X 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDeimoS (30 июня 2020 - 09:52) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


forward SpawnVehicleOnServer(vehicleid);
public SpawnVehicleOnServer(vehicleid)//вызывается через таймер
{
    new Float:x, Float:y, Float:z, Float:a, world;

    GetVehiclePos(vehicleid, x, y, z);
    GetVehicleZAngle(vehicleid, a);
    world = GetVehicleVirtualWorld(vehicleid);

    printf("1: %f | %f | %f | %f", x, y, z, a);//нынешние координаты
    printf("2: %f | %f | %f | %f", vX[vehicleid], vY[vehicleid], vZ[vehicleid], vA[vehicleid]);//где было создано авто

    if(vInfo[vehicleid][vX] != x ||\
       vInfo[vehicleid][vY] != y ||\
       vInfo[vehicleid][vZ] != z ||\//по z оси разница в 1 целую, но тут наверное из-за того, что создаю через координаты игрока, а сравниваю уже с автомобильными
       vInfo[vehicleid][vA] != a ||\
       vInfo[vehicleid][vWorld] != world)
    {
        DestroyVehicle(vehicleid);
        CreateVehicleOnServer(vehicleid);//самописная функция, где при создании авто прикрепляется тюнинг, номера и т.д. (используется не только тут)
    }

    return 1;
}


Хотелось бы не грузить мод лишний раз созданием авто и кучей доп функциями, если авто в принципе не меняло своё положение.

Сообщение отредактировал Sonic X: 30 июня 2020 - 10:51

0

#5
Пользователь офлайн   Sonic X 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
Сейчас попробовал присваивать значения переменным после того, как авто было создано и повторно зареспавнено, и всё равно мелкие расхождения есть начиная с десятитысячных. При этом, когда создаю авто никаких расхождений нет.

CreateVehicle();
SetVehicleToRespawn();

printf("1: %f | %f | %f | %f", x, y, z, a);//координаты полученные от игрока

GetVehiclePos(vehicleid, x, y, z);
GetVehicleZAngle(vehicleid, a);

printf("2: %f | %f | %f | %f", x, y, z, a);//координаты авто, но разницы не будет, оно ещё не успело "приземлиться"

    vX[vehicleid] = x;
    vY[vehicleid] = y;
    vZ[vehicleid] = z;
    vA[vehicleid] = a;


Вот пример, когда вызывается SpawnVehicleOnServer():
1: 0.175863 | 3.357023 | 3.242271 | 356.291412//нынешние координаты авто
2: 0.175837 | 3.356328 | 3.117187 | 356.287261//где было создано


Таким методом фиксится координата Z, но всё же расхождения есть. Если округлять до целых, тоже может быть косяк с подобными цифрами .49

Сообщение отредактировал Sonic X: 30 июня 2020 - 11:13

0

#6
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию
Как вариант, отнимай от одной координаты другую и проверяй, больше ли оно 0.5. То бишь, сделай аналог IsPlayerInRangeOfPoint

А что ты вообще хочешь? Ты пишешь про приземления, но автомобили обновляют свою позицию исключительно если они есть в зоне стрима какого-либо из игроков.
1

#7
Пользователь офлайн   Sonic X 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDeimoS (30 июня 2020 - 11:30) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


Хотел сделать систему респавна авто таким образом, что если авто в стриме игрока - она не будет спавниться, если же никого нет, запускается таймер и уже через определённое время сверяются координаты. Если одни и те же, ничего с ней не делаем, иначе спавним там где была создана.

Сервер дм, поэтому респавн нужен, но не на глазах игрока. Может быть и откажусь в принципе от респавна
---
Попробую сделать с отниманием, так должно всё работать :wink:

Сообщение отредактировал Sonic X: 30 июня 2020 - 11:36

0

#8
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияSonic X (30 июня 2020 - 11:34) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]



Это попытка создать автореспавн брошенной машины, если она не в зоне стрима? Или что?
Просто не очень понятно зачем ты координаты сверяешь. Особенно для машин вне зоны стрима (причину в прошлом сообщении написал).
0

#9
Пользователь офлайн   Sonic X 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDeimoS (30 июня 2020 - 11:41) писал:

Это попытка создать автореспавн брошенной машины, если она не в зоне стрима? Или что?
Просто не очень понятно зачем ты координаты сверяешь. Особенно для машин вне зоны стрима (причину в прошлом сообщении написал).


Можно сказать и так
0

#10
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияSonic X (30 июня 2020 - 11:42) писал:

Можно сказать и так


При выходе игрока из авто проверяем, есть ли кто-то ещё в этом авто и если это последний игрок - запускаем таймер на то количество секунд, через которое транспорт должен заспавнится. Когда таймер срабатывает, проверяем, находится ли авто у кого-то в зоне стрима через IsVehicleStreamedIn. Если находится - перезапускаем таймер на ещё одну итерацию. Если не находится - убиваем таймер и респавним авто.
0

Поделиться темой:


  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика