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

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±

    Совет по таймеру и циклу

    Как оцените такое решение? В LudoInfo[i][gPlayersID] записываются иды игроков с одной игры.
    Массив LudoInfo:
    PHP код:
    enum
        ludo_game_info
        
    {
            
    gAccessToRoom,
            
    gGameStart,
            
    gPlayersID[MAX_LUDO_PLAYERS],
            
    gNumPlayers,
            
    gTimeStart,
            
    gTimeGame
        

    PHP код:
    LudoInfo[MAX_LUDO_GAMES][ludo_game_info] = {{00, {-1, -1, -1, -1}, 000}, ...}; 
    PHP код:
    forward LudoTimer();
    public 
    LudoTimer()
    {
        static
            
    string[6];
            
        for(new 
    0MAX_LUDO_CREATE_GAMESi++)
        {
            if (
    LudoInfo[i][gGameStart] == 1)
            {
                
    LudoInfo[i][gTimeGame]--;

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

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

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

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

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

        return 
    1;

    Последний раз редактировалось m1n1vv; 15.05.2019 в 11:18.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    А вариант с индивидуальными таймерами под каждую запущенную игру не рассматривал? Как по мне, такой вариант и код упростит, и серверу лишних действий будет меньше выполнять.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  3. #3
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    А вариант с индивидуальными таймерами под каждую запущенную игру не рассматривал? Как по мне, такой вариант и код упростит, и серверу лишних действий будет меньше выполнять.
    ?

    PHP код:
    forward LudoTimer(roomid);
    public 
    LudoTimer(roomid)
    {
        static
            
    string[6];
            
        if (
    LudoInfo[roomid][gGameStart] == 1)
        {
            
    LudoInfo[roomid][gTimeGame]--;

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

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

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

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

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

        return 
    1;

    Или еще сделать параметр playerid? Но это сразу -4 сек.
    Последний раз редактировалось m1n1vv; 15.05.2019 в 12:28.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Не, без playerid.
    Просто чтоб у тебя таймер стартовал во время запуска игры в какой-либо из комнат и останавливался во время окончания этой игры. Избавляемся от цикла и, при этом, не теряем гибкость кода.


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


    Ещё, если ты gTimeGame используешь только внутри таймеров, можно избавиться от переменной и перенести таймер в качестве параметра LudoTimer. То бишь
    PHP код:
    forward LudoTimer(roomidtimegame);
    public 
    LudoTimer(roomidtimegame)
    {
        
    //...
        
    SetTimerEx("LudoTimer"1000false"ii"roomidtimegame);

    Но это, опять же, уже чисто визуальные изменения, по сути.
    Последний раз редактировалось DeimoS; 15.05.2019 в 12:55.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  5. #5
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±
    Про 2 таймера тоже были мысли. И наверно так и сделаю. Первый таймер делает отсчет старта, потом комната определяет кто каким ходит и запускается таймер с общим временем игры.
    От gTimeGame не смогу отказаться. В диалоге будет выводиться время игры.

 

 

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

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

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

Ваши права

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