Как сделать систему обгона?
#1

Я думаю каждый играл в GTA San Andreas.
И не мало кто видел, как проводятся гонки.
Так вот, как же мне сделать такую систему обгона, как в сингле?
Меняется мгновенно, если же к примеру играет 2 игрока и я на миллиметр обгоняю первого, я сразу же становлюсь первым а он вторым.
Не понимаю как сделать. Через консинус? Синус? Тангенс? Высчитывать расстояние машины? Позиции игроков? Разность позиций? Что именно? Может кто поможет?
Reply
#2

Считать расстояние до ближайшего чекпоинта, кто к нему ближе, того и тапки.
Reply
#3

Гениально. Сейчас попробую.
Reply
#4

Сделал для двух. Все прекрасно работает. Для 3 и выше сделать не могу . Сложновато. Тема актуальна))
Reply
#5

Что там сложного то? Просчитать общую длину и вычитать пройденое?
Reply
#6

Представим, что игроков 10.
10 - гонщики.
Чекпоинтов до финиша 30.
Если представить,что 4 игрока на 10-м чекпоинте, 1 игрок на 9 чекпоинте, и 5 на 8 чекпоинте.
далее нужно просчитать у кого больше всего чекпоинтов, распределить их по местам и рассчитать расстояние к ближайшему чекпоинту каждого игрока и при том прив сем еще и место ему выдать.



"Что там сложного то? Просчитать общую длину и вычитать пройденое?"

Не не, а если 5 кругов к примеру?

Хочу копию ГТА Са, гонок, пока не выходит больше чем для двух.
Reply
#7

Думаю принцип будет примерно таков:

PHP код:
new cps_done[10];
    
    for(new 
icurrent_race_membersi++)
    {
        for(new 
icurrent_race_memberss++)
        {
            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
            
}
        }
    } 
Reply
#8

Протестирую данный способ)) Секундочку)
Reply
#9

..., cppos[cps_done[s] % RACE_CPS_AMOUNT], ...

Что это?
Reply
#10

cppos - координаты чекпоинтов
cps_done - количество достигнутых чекпоинтов
RACE_CPS_AMOUNT - сколько всего чекпоинтов (или sizeof cppos)
cps_done[s] % RACE_CPS_AMOUNT - для того, чтобы можно было сделать несколько кругов
Reply
#11

Блиииин((
А как взаимодействовать с игроками? Тут же игрокам нужно присваивать значения переменных.
Является ли игрок участником гонок , проверять((
Разве что сделать опять же цикл с условием гонок для игрока.
Reply
#12

Хелп хелп, победа близко))
Reply
#13

Quote:
Originally Posted by jakebat
View Post
Блиииин((
А как взаимодействовать с игроками? Тут же игрокам нужно присваивать значения переменных.
Является ли игрок участником гонок , проверять((
Разве что сделать опять же цикл с условием гонок для игрока.
Я исходил из того, что у тебя под инфу о гонщиках заведен отдельный массив. Я обычно создаю отдельный массив под мини-игры, а в стате игрока храню только ячейку от этого массива. Или это принципиально чтобы такого не было?
Reply
#14

Создаешь массив и хранишь ячейку в статистике игрока?
Ячейка отображает ид его? Или как?
То есть если у меня 43 ид и я первый игрок в гонке и у меня 3 чекпоинта то
raceinfo[43][0] = 3?
Или я что-то не понимаю?
Не не, мне именно чтобы показывало место нынешнее игрока. 1 2 3 и так далее. В зависимости вышеупомянутых условий.
Reply
#15

Как-то так

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
View Post
Не не, мне именно чтобы показывало место нынешнее игрока. 1 2 3 и так далее. В зависимости вышеупомянутых условий.
Если совместить все сказанное мной, то PlayerInfo[playerid][pi_RaceMember] будет указывать на место игрока, потому что инфа в массиве RaceMemberInfo будет сортироваться по достижениям.

---

Если общий список отображаться не будет и интересует только место конкретного игрока, то можно и по-другому сделать. При условии, что все достижения хранятся в массиве с общей статистикой игрока, будет примерно так:
PHP Code:
new number//мое место
foreach(new Player)
{
    if(
PlayerInfo[i][pi_RaceMember] && != playerid//этот чел участвует в гонке?
    
{
        if(
PlayerInfo[i][pi_RaceCPsDone] > PlayerInfo[playerid][pi_RaceCPsDone] || PlayerInfo[i][pi_RaceCPsDone] == PlayerInfo[playerid][pi_RaceCPsDone] && мое_расстояние_до_ближайшего_чекпоинта его_расстояние_до_ближайшего_чекпоинта//он ближе меня к финишу?
        
{
            
number ++; //значит мое место еще дальше в списке
        
}
    }
}
printf("Мое место: %d"number 1); 
Reply
#16

Спасибо)) Лучший)) Что-то голова вообще не сварила это(( Так просто все, ужс. Еще раз спасибо, ты гений)
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)