PDA

Просмотр полной версии : [Вопрос] Отсчет времени



James
01.08.2014, 00:37
Как сделать отсчет времени в стиле GameTextForPlayer
как в костях на Samp rp

seriu
01.08.2014, 00:48
enum stol
{
vrema
}
new SI[MAX_STOL][stol];

SI[i][vrema] --;
new str[15];
format(str,15,"~b~%s",TimeConverter(SI[i][vrema]));
GameTextForPlayer(playerid, str, 5000, 1);

stock TimeConverter(seconds)//Конвертер секунды в минуты и секунды
{
new str[6];//объявляем символьную переменную
new minutes = floatround(seconds/60);//кол. целых минут
seconds -= minutes*60; //остаток
format(str, sizeof(str), "%02d:%02d", minutes, seconds);//преобразовываем
return str;//возвращаем строку символов
}
как то так, довольно просто

Пельмень
01.08.2014, 00:51
enum stol
{
vrema
}
new SI[MAX_STOL][stol];

SI[i][vrema] --;
new str[15];
format(str,15,"~b~%s",TimeConverter(SI[i][vrema]));
GameTextForPlayer(playerid, str, 5000, 1);

stock TimeConverter(seconds)//Конвертер секунды в минуты и секунды
{
new str[6];//объявляем символьную переменную
new minutes = floatround(seconds/60);//кол. целых минут
seconds -= minutes*60; //остаток
format(str, sizeof(str), "%02d:%02d", minutes, seconds);//преобразовываем
return str;//возвращаем строку символов
}
как то так, довольно просто

А ничего, что он попросил немного иной пример? Ему наверняка не нужны вырезки кода из каких-то модов, можно обойтись одной переменной! К тому-же, нужно обновлять GameText каждую секунду, и GameTextForPlayer создавать не на 5 секунд, а на 1. Наверное стоит объяснить подробнее, а не выдавать не рабочие, или плохие примеры?

seriu
01.08.2014, 00:53
А ничего, что он попросил немного иной пример? Ему наверняка не нужны вырезки кода из каких-то модов, можно обойтись одной переменной! К тому-же, нужно обновлять GameText каждую секунду, и GameTextForPlayer создавать не на 5 секунд, а на 1. Наверное стоит объяснить подробнее, а не выдавать не рабочие, или плохие примеры?

Вырезки? я только что сделал это в notepad

Пельмень
01.08.2014, 00:56
Вырезки? я только что сделал это в notepad

Очень плохо сделал!

seriu
01.08.2014, 00:57
Очень плохо сделал!

Приведи ка свой пример, раз я плохо сделал

Пельмень
01.08.2014, 01:01
new ret_time = 0;
new timer_ex = 0;

stock Start (playerid, num) {
ret_time = num;
timer_ex = SetTimerEx ("LessTime", 1000, true, "i", playerid);
return 1;
}

forward LessTime (playerid);
public LessTime (playerid) {
if (ret_time-- < 1) {
KillTimer (timer_ex);
return 1;
}
new time [5];
format (time, sizeof (time), "%d", ret_time);
GameTextForPlayer (playerid, time, 1000, 1);
return 1;
}

seriu
01.08.2014, 01:10
new ret_time = 0;
new timer_ex = 0;

stock Start (playerid, num) {
ret_time = num;
timer_ex = SetTimerEx ("LessTime", 1000, true, "i", playerid);
return 1;
}

forward LessTime (playerid);
public LessTime (playerid) {
if (ret_time-- < 1) {
KillTimer (timer_ex);
return 1;
}
new time [5];
format (time, sizeof (time), "%d", ret_time);
GameTextForPlayer (playerid, time, 1000, 1);
return 1;
}

ну ладно, тут я тупанул по поводу левого времени. Но твой пример не лучше ибо у тебя используется таймер для игрока, но при окончании времени убирается 1 таймер. А если разные игроки использовали этот таймер в разные секунды?


enum stol
{
Svrema,
Stimer
}
new SI[MAX_STOL][stol];

SI[i][vrema] = 30;
SI[i][Stimer] = SetTimerEx ("UpdateStol", 1000, true, "i", i);

forward UpdateStol(i);
public UpdateStol(i)
{
if(SI[i][vrema]> 0) SI[i][vrema] --;
new str[7];
format(str,7,"~b~%d",SI[i][vrema]);
GameTextForPlayer(playerid, str, 1000, 1);
if(SI[i][vrema] == 0) KillTimer(SI[i][Stimer]);
return 1;
}

Пельмень
01.08.2014, 01:16
ну ладно, тут я тупанул по поводу левого времени. Но твой пример не лучше ибо у тебя используется таймер для игрока, но при окончании времени убирается 1 таймер. А если разные игроки использовали этот таймер в разные секунды?


enum stol
{
Svrema,
Stimer
}
new SI[MAX_STOL][stol];

SI[i][vrema] = 30;
SI[i][Stimer] = SetTimerEx ("UpdateStol", 1000, true, "i", playerid);

forward UpdateStol(i);
public UpdateStol(i)
{
if(SI[i][vrema]> 0) SI[i][vrema] --;
new str[7];
format(str,7,"~b~%d",SI[i][vrema]);
GameTextForPlayer(playerid, str, 1000, 1);
if(SI[i][vrema] == 0) KillTimer(SI[i][Stimer]);
return 1;
}

С чего-это мой пример не лучше? Во-первых, для чего вообще использовать enum. Во-вторых, мой пример очень просто переделать для каждого игрока!


new ret_time [MAX_PLAYERS] = {0, ...};
new timer_ex [MAX_PLAYERS] = {0, ...};

stock Start (playerid, num) {
ret_time [playerid] = num;
timer_ex [playerid] = SetTimerEx ("LessTime", 1000, true, "i", playerid);
return 1;
}

forward LessTime (playerid);
public LessTime (playerid) {
if (ret_time [playerid]-- < 1) {
KillTimer (timer_ex [playerid]);
return 1;
}
new time [5];
format (time, sizeof (time), "%d", ret_time [playerid]);
GameTextForPlayer (playerid, time, 1000, 1);
return 1;
}

Salvacore
01.08.2014, 01:20
new ret_time[MAX_PLAYERS] = {0, ...};
new timer_ex[MAX_PLAYERS] = {0, ...};

stock Start(playerid, num){
ret_time[playerid] = num;
timer_ex[playerid] = SetTimerEx ("LessTime", 1000, true, "i", playerid);
return 1;
}

forward LessTime(playerid);
public LessTime(playerid){
if(ret_time[playerid]-- < 1)
return KillTimer(timer_ex [playerid]);
new time[5];
format(time, sizeof(time), "%d", ret_time[playerid]);
GameTextForPlayer(playerid, time, 1000, 1);
return 1;
}
Ну хз, вдруг лучше:D

Пельмень
01.08.2014, 01:23
new ret_time[MAX_PLAYERS] = {0, ...};
new timer_ex[MAX_PLAYERS] = {0, ...};

stock Start(playerid, num){
ret_time[playerid] = num;
timer_ex[playerid] = SetTimerEx ("LessTime", 1000, true, "i", playerid);
return 1;
}

forward LessTime(playerid);
public LessTime(playerid){
if(ret_time[playerid]-- < 1)
return KillTimer(timer_ex [playerid]);
new time[5];
format(time, sizeof(time), "%d", ret_time[playerid]);
GameTextForPlayer(playerid, time, 1000, 1);
return 1;
}
Ну хз, вдруг лучше:D

Изменилось лишь то, что если ret_time [playerid] < 1, то функция вернёт 0, вместо 1, т.к KillTimer возвращает 0.

Salvacore
01.08.2014, 01:27
Изменилось лишь то, что если ret_time [playerid] < 1, то функция вернёт 0, вместо 1, т.к KillTimer возвращает 0.
Будьте осторожны, я немного сбыдлил.

Пельмень
01.08.2014, 01:37
Будьте осторожны, я немного сбыдлил.

От этого, по факту, ничего не изменится, ведь узнавать. какое значение вернула эта функция не нужно, это будут просто напросто глупости, конечно, если не использовать отладку, да и к тому-же отладка тут наверняка не нужна ;)

James
01.08.2014, 01:47
new ret_time[MAX_PLAYERS] = {0, ...};
new timer_ex[MAX_PLAYERS] = {0, ...};

stock Start(playerid, num){
ret_time[playerid] = num;
timer_ex[playerid] = SetTimerEx ("LessTime", 1000, true, "i", playerid);
return 1;
}

forward LessTime(playerid);
public LessTime(playerid){
if(ret_time[playerid]-- < 1)
return KillTimer(timer_ex [playerid]);
new time[5];
format(time, sizeof(time), "%d", ret_time[playerid]);
GameTextForPlayer(playerid, time, 1000, 1);
return 1;
}
Ну хз, вдруг лучше:D

NUM- число с которого начинается отсчет?

seriu
01.08.2014, 02:44
С чего-это мой пример не лучше? Во-первых, для чего вообще использовать enum. Во-вторых, мой пример очень просто переделать для каждого игрока!


new ret_time [MAX_PLAYERS] = {0, ...};
new timer_ex [MAX_PLAYERS] = {0, ...};

stock Start (playerid, num) {
ret_time [playerid] = num;
timer_ex [playerid] = SetTimerEx ("LessTime", 1000, true, "i", playerid);
return 1;
}

forward LessTime (playerid);
public LessTime (playerid) {
if (ret_time [playerid]-- < 1) {
KillTimer (timer_ex [playerid]);
return 1;
}
new time [5];
format (time, sizeof (time), "%d", ret_time [playerid]);
GameTextForPlayer (playerid, time, 1000, 1);
return 1;
}
ну он сказал как пример с костей samp-rp, я так и сделал :D ведь там таймер устанавливается на стол, а не на игрока.


NUM- число с которого начинается отсчет?

Yes

underwoker
01.08.2014, 04:50
ну он сказал как пример с костей samp-rp, я так и сделал :D ведь там таймер устанавливается на стол, а не на игрока.



Yes
Что? Как таймер может установиться на стол? Таймер либо глобальный, либо индивидуальный. Нет понятия "на стол"