Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 6 из 6
  1. #1
    Аватар для pustomerzha
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.11.2016
    Сообщений
    24
    Репутация:
    0 ±

    Обратный отсчет

    Как при помощи таймера сделать обратный отсчет времени? Прошу желательно ответить кодом

  2. #2
    Аватар для qwezert
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.06.2016
    Адрес
    Одесса, Украина
    Сообщений
    281
    Репутация:
    51 ±
    Цитата Сообщение от pustomerzha Посмотреть сообщение
    Как при помощи таймера сделать обратный отсчет времени? Прошу желательно ответить кодом
    PHP код:
    new final_count_timer;
    new 
    final_count 10// Задаем число отсчета
    //Можно создать для каждого игрока добавив [MAX_PLAYERS] и в дальнейшем используя [playerid]
    // new final_count_timer[MAX_PLAYERS];
    // final_count_timer[playerid] = SetTimer("Revers", 1000, false);

    public OnGameModeInit()
    {
        print(
    "Запуск таймера...");
        
    final_count_timer SetTimer("Revers"1000false); // Устанавливает таймер на 1000 миллисекунд (1 секунда)
    }

    public 
    Revers()//Сам каллбек таймера
    {
        if(
    final_count 0//Условие проверки переменной, что бы у нас счет не уходил в минус.
        
    {
            
    final_count--; //Отнимаем -1;
            
    printf("Осталось %i секунд",final_count);
        }
        else
        { 
            
    final_count 10;
            
    KillTimer(final_count_timer); //Убиваем таймер.
        
    }

    Это простенький пример. Думаю дальше ты сам сможешь понять что куда. Удачи)
    Последний раз редактировалось qwezert; 26.12.2016 в 13:05.

  3. Пользователь сказал cпасибо:
    pustomerzha (26.12.2016)
  4. #3
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от qwezert Посмотреть сообщение
    ...
    Если ты хотел делать таймер с повторением, то забыл в SetTimer указать "true" =)

    Можно так же обойтись и средствами одного таймера, передавая все нужные данные в качестве параметров (но я крайне сомневаюсь, что это вариант лучше того, что дал ты. Просто как пример использования SetTimerEx).

    PHP код:
    public OnGameModeInit() 

        print(
    "Запуск таймера..."); 
        
    SetTimerEx("Revers"1000false"d"10); 
        
    /* 
            Устанавливает таймер на 1000 миллисекунд (1 секунда) 
            И указываем на то, сколько повторений совершит таймер
            (в "10" включается и последнее повторение, которое приведёт к вызову "print("Условие выполнено\n\n");"
              То есть, в консоли отсчёт начнётся с 9 и окончится на 1, а после произойдёт вызов кода, что я дал выше).
        */


    forward Revers(final_count);
    public 
    Revers(final_count)
    {
        if(--
    final_count 0)
        { 
            
    printf("Осталось %i секунд"final_count); 
            
    SetTimerEx("Revers"1000false"d"final_count);
        } 
        else
        {
            print(
    "Условие выполнено\n\n"); 
        }
        return 
    1;

     То же самое, только для конкретного игрока
    PHP код:
    public OnPlayerConnect(playerid)
    {
        print(
    "Запуск таймера..."); 
        
    SetTimerEx("Revers"1000false"dd"10playerid); 
        
    /* 
            Устанавливает таймер на 1000 миллисекунд (1 секунда) 
            Указываем то, сколько повторений совершит таймер и передаём ID для дальнейшей работы с игроком 
        */
        
    return 1;
    }

    forward Revers(final_countplayerid);
    public 
    Revers(final_countplayerid)
    {
        if(!
    IsPlayerConnected(playerid))// Предотвратим вызов таймера в случае, если игрок отключился
            
    return 1;

        if(--
    final_count 0)
        { 
            
    printf("[ID: %d] Осталось %i секунд"playeridfinal_count); 
            
    SetTimerEx("Revers"1000false"dd"final_countplayerid);
        } 
        else
        {
            
    printf("[ID: %d] Условие выполнено\n\n"playerid); 
        }
        return 
    1;



    Соответственно, так можно передавать не только ID, но и любую другую нужную информацию, а новый таймер будет априори "индивидуальным" (запустите 2 таймера и они оба будут работать со своими значениями).
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  5. 2 пользователя(ей) сказали cпасибо:
    pustomerzha (26.12.2016) qwezert (26.12.2016)
  6. #4
    Аватар для qwezert
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.06.2016
    Адрес
    Одесса, Украина
    Сообщений
    281
    Репутация:
    51 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    ....
    Да с false чет я лажанул :) Наши варианты впринципе одинаковые, тут уже кому как нравится, единственное что в моем варианте отсчет начнется с 10 а в твоем с 9.
    Мне вот даже интересно стало, если таймер нужно запустить для определенного кол-ва игроков, то получается в сам каллбек нужно будет передать массив нужных игроков и через for прогонять и для каждого игрока отнимать 1?
    Или можно как то проще сделать?

  7. #5
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от qwezert Посмотреть сообщение
    в моем варианте отсчет начнется с 10 а в твоем с 9.
    10 поменяй на 11 и отсчёт начнётся с 10 :)


    Цитата Сообщение от qwezert Посмотреть сообщение
    Мне вот даже интересно стало, если таймер нужно запустить для определенного кол-ва игроков, то получается в сам каллбек нужно будет передать массив нужных игроков и через for прогонять и для каждого игрока отнимать 1?
    Или можно как то проще сделать?
    Если для нескольких игроков один таймер, то используешь первый вариант и в нём цикл, в котором уже нужным игрокам и отображаешь информацию.
    Если же для 10 игроков свой таймер (например, антифлуд), то второй вариант (каждому игроку свой таймер)
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  8. Пользователь сказал cпасибо:
    qwezert (26.12.2016)
  9. #6
    Аватар для qwezert
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.06.2016
    Адрес
    Одесса, Украина
    Сообщений
    281
    Репутация:
    51 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Если для нескольких игроков один таймер, то используешь первый вариант и в нём цикл, в котором уже нужным игрокам и отображаешь информацию.
    Если же для 10 игроков свой таймер (например, антифлуд), то второй вариант (каждому игроку свой таймер)
    Ну я так и написал, думал можно как то по другому сделать)

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •