Как сделать систему обгона? -
jakebat - 12.06.2017
Я думаю каждый играл в GTA San Andreas.
И не мало кто видел, как проводятся гонки.
Так вот, как же мне сделать такую систему обгона, как в сингле?
Меняется мгновенно, если же к примеру играет 2 игрока и я на миллиметр обгоняю первого, я сразу же становлюсь первым а он вторым.
Не понимаю как сделать. Через консинус? Синус? Тангенс? Высчитывать расстояние машины? Позиции игроков? Разность позиций? Что именно? Может кто поможет?
Re: Как сделать систему обгона? -
eakwarp - 12.06.2017
Считать расстояние до ближайшего чекпоинта, кто к нему ближе, того и тапки.
Re: Как сделать систему обгона? -
jakebat - 12.06.2017
Гениально. Сейчас попробую.
Re: Как сделать систему обгона? -
jakebat - 12.06.2017
Сделал для двух. Все прекрасно работает. Для 3 и выше сделать не могу
. Сложновато. Тема актуальна))
Re: Как сделать систему обгона? -
White_116 - 12.06.2017
Что там сложного то? Просчитать общую длину и вычитать пройденое?
Re: Как сделать систему обгона? -
jakebat - 12.06.2017
Представим, что игроков 10.
10 - гонщики.
Чекпоинтов до финиша 30.
Если представить,что 4 игрока на 10-м чекпоинте, 1 игрок на 9 чекпоинте, и 5 на 8 чекпоинте.
далее нужно просчитать у кого больше всего чекпоинтов, распределить их по местам и рассчитать расстояние к ближайшему чекпоинту каждого игрока и при том прив сем еще и место ему выдать.
"Что там сложного то? Просчитать общую длину и вычитать пройденое?"
Не не, а если 5 кругов к примеру?
Хочу копию ГТА Са, гонок, пока не выходит больше чем для двух.
Re: Как сделать систему обгона? -
stabker - 12.06.2017
Думаю принцип будет примерно таков:
PHP код:
new cps_done[10];
for(new i; i < current_race_members; i++)
{
for(new s = i; s < current_race_members; s++)
{
if(cps_done[s] > cps_done[i] || cps_done[s] == cps_done[i] && GetPlayerDistanceFromPoint(..., cppos[cps_done[s] % RACE_CPS_AMOUNT], ...) < GetPlayerDistanceFromPoint(..., cppos[cps_done[i] % RACE_CPS_AMOUNT], ...))
{
//swap
}
}
}
Re: Как сделать систему обгона? -
jakebat - 12.06.2017
Протестирую данный способ)) Секундочку)
Re: Как сделать систему обгона? -
jakebat - 12.06.2017
..., cppos[cps_done[s] % RACE_CPS_AMOUNT], ...
Что это?
Re: Как сделать систему обгона? -
stabker - 12.06.2017
cppos - координаты чекпоинтов
cps_done - количество достигнутых чекпоинтов
RACE_CPS_AMOUNT - сколько всего чекпоинтов (или sizeof cppos)
cps_done[s] % RACE_CPS_AMOUNT - для того, чтобы можно было сделать несколько кругов
Re: Как сделать систему обгона? -
jakebat - 12.06.2017
Блиииин((
А как взаимодействовать с игроками? Тут же игрокам нужно присваивать значения переменных.
Является ли игрок участником гонок , проверять((
Разве что сделать опять же цикл с условием гонок для игрока.
Re: Как сделать систему обгона? -
jakebat - 12.06.2017
Хелп хелп, победа близко))
Re: Как сделать систему обгона? -
stabker - 12.06.2017
Quote:
Originally Posted by jakebat
Блиииин((
А как взаимодействовать с игроками? Тут же игрокам нужно присваивать значения переменных.
Является ли игрок участником гонок , проверять((
Разве что сделать опять же цикл с условием гонок для игрока.
|
Я исходил из того, что у тебя под инфу о гонщиках заведен отдельный массив. Я обычно создаю отдельный массив под мини-игры, а в стате игрока храню только ячейку от этого массива. Или это принципиально чтобы такого не было?
Re: Как сделать систему обгона? -
jakebat - 12.06.2017
Создаешь массив и хранишь ячейку в статистике игрока?
Ячейка отображает ид его? Или как?
То есть если у меня 43 ид и я первый игрок в гонке и у меня 3 чекпоинта то
raceinfo[43][0] = 3?
Или я что-то не понимаю?
Не не, мне именно чтобы показывало место нынешнее игрока. 1 2 3 и так далее. В зависимости вышеупомянутых условий.
Re: Как сделать систему обгона? -
stabker - 12.06.2017
Как-то так
PHP Code:
enum playerinfo_enum
{
pi_RaceMember
}
new PlayerInfo[MAX_PLAYERS][playerinfo_enum];
enum racememberinfo_enum
{
rmi_Score,
rmi_PlayerID
}
new RaceMemberInfo[MAX_RACE_MEMBERS][racememberinfo_enum];
/*
Если игрок участвует в гонке, то PlayerInfo[playerid][pi_RaceMember] != -1 и при этом является индексом для RaceMemberInfo (там хранятся его достижения в гонке).
*/
Quote:
Originally Posted by jakebat
Не не, мне именно чтобы показывало место нынешнее игрока. 1 2 3 и так далее. В зависимости вышеупомянутых условий.
|
Если совместить все сказанное мной, то PlayerInfo[playerid][pi_RaceMember] будет указывать на место игрока, потому что инфа в массиве RaceMemberInfo будет сортироваться по достижениям.
---
Если общий список отображаться не будет и интересует только место конкретного игрока, то можно и по-другому сделать. При условии, что все достижения хранятся в массиве с общей статистикой игрока, будет примерно так:
PHP Code:
new number; //мое место
foreach(new i : Player)
{
if(PlayerInfo[i][pi_RaceMember] && i != playerid) //этот чел участвует в гонке?
{
if(PlayerInfo[i][pi_RaceCPsDone] > PlayerInfo[playerid][pi_RaceCPsDone] || PlayerInfo[i][pi_RaceCPsDone] == PlayerInfo[playerid][pi_RaceCPsDone] && мое_расстояние_до_ближайшего_чекпоинта > его_расстояние_до_ближайшего_чекпоинта) //он ближе меня к финишу?
{
number ++; //значит мое место еще дальше в списке
}
}
}
printf("Мое место: %d", number + 1);
Re: Как сделать систему обгона? -
jakebat - 12.06.2017
Спасибо)) Лучший)) Что-то голова вообще не сварила это(( Так просто все, ужс. Еще раз спасибо, ты гений)