PDA

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



m1n1vv
15.05.2019, 09:15
Как оцените такое решение? В LudoInfo[i][gPlayersID] записываются иды игроков с одной игры.
Массив LudoInfo:

enum
ludo_game_info
{
gAccessToRoom,
gGameStart,
gPlayersID[MAX_LUDO_PLAYERS],
gNumPlayers,
gTimeStart,
gTimeGame
}

LudoInfo[MAX_LUDO_GAMES][ludo_game_info] = {{0, 0, {-1, -1, -1, -1}, 0, 0, 0}, ...};


forward LudoTimer();
public LudoTimer()
{
static
string[6];

for(new i = 0; i < MAX_LUDO_CREATE_GAMES; i++)
{
if (LudoInfo[i][gGameStart] == 1)
{
LudoInfo[i][gTimeGame]--;

format(string, sizeof string, "%02i:%02i", LudoInfo[i][gTimeGame]/60, LudoInfo[i][gTimeGame]%60);

for (new j = 0; j < MAX_LUDO_PLAYERS; j++)
{
SendClientMessage(LudoInfo[i][gPlayersID][j], -1, string);
}

if (LudoInfo[i][gTimeGame] == 0)
{
LudoInfo[i][gGameStart] = -1;
//LudoWinner();
}
}
else if (LudoInfo[i][gGameStart] == 0 && LudoInfo[i][gNumPlayers] == MAX_LUDO_PLAYERS)
{
if (--LudoInfo[i][gTimeStart] != 0)
{
format(string, sizeof string, "%i", LudoInfo[i][gTimeStart]);

for (new j = 0; j < MAX_LUDO_PLAYERS; j++)
{
SendClientMessage(LudoInfo[i][gPlayersID][j], -1, string);
}
}
else
{
for (new j = 0; j < MAX_LUDO_PLAYERS; j++)
{
SendClientMessage(LudoInfo[i][gPlayersID][j], -1, !"START");
//LudoStartGame();
}

LudoInfo[i][gGameStart] = 1;
LudoInfo[i][gTimeGame] = 1200;
}
}
}

return 1;
}

DeimoS
15.05.2019, 11:54
А вариант с индивидуальными таймерами под каждую запущенную игру не рассматривал? Как по мне, такой вариант и код упростит, и серверу лишних действий будет меньше выполнять.

m1n1vv
15.05.2019, 12:15
А вариант с индивидуальными таймерами под каждую запущенную игру не рассматривал? Как по мне, такой вариант и код упростит, и серверу лишних действий будет меньше выполнять.

?


forward LudoTimer(roomid);
public LudoTimer(roomid)
{
static
string[6];

if (LudoInfo[roomid][gGameStart] == 1)
{
LudoInfo[roomid][gTimeGame]--;

format(string, sizeof string, "%02i:%02i", LudoInfo[roomid][gTimeGame]/60, LudoInfo[roomid][gTimeGame]%60);

for (new i = 0; i < MAX_LUDO_PLAYERS; i++)
{
SendClientMessage(LudoInfo[roomid][gPlayersID][i], -1, string);
}

if (LudoInfo[roomid][gTimeGame] == 0)
{
LudoInfo[roomid][gGameStart] = -1;
//LudoWinner();
}
}
else if (LudoInfo[roomid][gGameStart] == 0 && LudoInfo[roomid][gNumPlayers] == MAX_LUDO_PLAYERS)
{
if (--LudoInfo[roomid][gTimeStart] != 0)
{
format(string, sizeof string, "%i", LudoInfo[roomid][gTimeStart]);

for (new i = 0; i < MAX_LUDO_PLAYERS; i++)
{
SendClientMessage(LudoInfo[roomid][gPlayersID][i], -1, string);
}
}
else
{
for (new i = 0; i < MAX_LUDO_PLAYERS; i++)
{
SendClientMessage(LudoInfo[roomid][gPlayersID][i], -1, !"START");
//LudoStartGame(i, roomid);
}

LudoInfo[roomid][gGameStart] = 1;
LudoInfo[roomid][gTimeGame] = 1200;
}
}

return 1;
}

Или еще сделать параметр playerid? Но это сразу -4 сек.

DeimoS
15.05.2019, 12:52
Не, без playerid.
Просто чтоб у тебя таймер стартовал во время запуска игры в какой-либо из комнат и останавливался во время окончания этой игры. Избавляемся от цикла и, при этом, не теряем гибкость кода.


Можно ещё код из условий на 2 таймера поделить и уже сами таймеры запускать по условию. Но это уже больше из перфекционистских побуждений, а реального профита от этого будет мало :)


Ещё, если ты gTimeGame используешь только внутри таймеров, можно избавиться от переменной и перенести таймер в качестве параметра LudoTimer. То бишь

forward LudoTimer(roomid, timegame);
public LudoTimer(roomid, timegame)
{
//...
SetTimerEx("LudoTimer", 1000, false, "ii", roomid, timegame);
}
Но это, опять же, уже чисто визуальные изменения, по сути.

m1n1vv
15.05.2019, 12:58
Про 2 таймера тоже были мысли. И наверно так и сделаю. Первый таймер делает отсчет старта, потом комната определяет кто каким ходит и запускается таймер с общим временем игры.
От gTimeGame не смогу отказаться. В диалоге будет выводиться время игры.