Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 7 1 2 3 ... ПоследняяПоследняя
Показано с 1 по 10 из 68
  1. #1
    Аватар для ^_^
    Übermensch

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    157
    Репутация:
    245 ±

    Pawn - Интересные факты/советы

    Доброго времени суток, уважаемые форумчане. Решил поделится с вами вопросами, которые в своё время задавал сам, и, собственно, ответами на них, а также некоторыми полезными советами.
    Итак, приступим...




    1) Самая простая функция которая возвращает случайное натуральное число от Min до Max-1.
    PHP код:
    stock minrandom(minmax) return random(max-min)+min
    Пример использования:
    PHP код:
    if(minrandom(111) == 10SendClientMessage(playerid, -1"Да ты везунчик просто!"); 



    2) Если вы хотите создать таймер с повтором, лучше всего сделать этот самый повтор вручную, не через SetTimer/SetTimerEx.
    Объясняю: создаётся таймер, и параметр repeating равен false, а в конце таймерной функции делается очередной запуск (перезапуск) таймера (repeating остаётся равным false).
    Почему именно так, спросите вы? Ответ очень прост. Представьте, что у вас стоит таймер на 300 миллисекунд, а в самой функции куча операторов и функций, которые не успевают выполнится за это время. Тогда уж сервер зависнет и перестанет вызвать таймеры. Вот почему стоит делать повторяющиеся таймеры вручную, ибо это даёт 100% гарантии, что такое никогда не случится.
    Пример использования (односекундный таймер):
    PHP код:
    //Перед этим SetTimer("SecondTimer", 1000, true); заменяется на SetTimer("SecondTimer", 1000, false);
    public SecondTimer()
    {
    //тут куча кода
        
    SetTimer("SecondTimer"1000false);




    3) Как пропустить необязательный параметр?
    В Pawn есть возможность создания функций с необязательными параметрами, у которых уже есть значения, задаваемые по умолчанию.
    Подробнее про такие функции: http://forum.sa-mp.com/showthread.php?t=321465
    Итак, существуют 2 способа пропустить такие параметры:
    • Если параметр(ы) последний(ие) то просто не будем их указывать. Это самый простой способ пропуска.
      Например, нам нужно узнать только час когда мы запустили мод. Для этого мы будем использовать функцию gettime.
      Параметры функции:

      В большинство чудо модах обычно вот так:
      PHP код:
      new hoursminutesseconds;
      gettime(hoursminutesseconds);
      SetWorldTime(hours); 
      А остальные 2 переменные создаются просто так, дабы "удовлетворить" функцию.
      Вместо этого можно просто создать одну переменную вместо трёх, и не утруждать память.
      PHP код:
      new hours;
      gettime(hours);
      SetWorldTime(hours); 
    • А что если нам нужно узнать только секунды, или минуты? Первые параметры так просто не пропустишь...
      Тогда вместо параметра, который нужно пропустить, просто указываем символ подчёркивания _.
      Пример:
      PHP код:
      new minutes;
      gettime(_minutes); //или же gettime(_, minutes, _);
      printf("Мод запущен на %i минуте."minutes); 




    4) Как можно поделить значения одной переменной целочисленного типа на несколько ровных частей без всяких проверок?
    Для этого используется простая функция деления. Допустим нам нужно разделить время нахождения игрока на сервере на 3 части... Конечно, звучит легко и просто:
    PHP код:
    //До этого создаётся массив TimePart[MAX_PLAYERS];
    //В функции успешного логина
    new minute;
    gettime(_minute_);
    switch(
    minute){
         case 
    .. 20TimePart[playerid] = 1;
         case 
    21 .. 40TimePart[playerid] = 2;
         case 
    41 .. 60TimePart[playerid] = 3;

    А что, если нам нужно не 3 части, а целых 10?
    Решение:
    PHP код:
    new minute;
    gettime(_minute_);
    TimePart[playerid] = minute/20 1//Мы можем легко изменить 20 на 10, при этом мы увеличим части с 3 до 6... и так далее 
    Простая математика и меньше головной боли.
    Если перевести код выше на естественный язык языке то получим что-то вроде: Берём целую часть значения и делим на (кол-во частей плюс 1).




    5) Для форматирования строк (и других строковых операций) лучше использовать локальные массивы, чем глобальные.
    При небрежном использовании одного и того же массива можно просто всё спутать, к тому же локальные переменные очищаются из памяти после окончаний функций в которой они используются.




    6) Эффективный перебор игроков.
    Хоть плагин vectoralpawn в некоторых случаях и быстрее стандартного перебора игроков с IsPlayerConnected, он всё же уступает по эффективности другим методам, таким как foreach.inc от Y_Less'а и перебор игроков методом Tracker1, поэтому его использование в цикле перебора игроков является неоптимальным выбором.
    Если же выбрать между методом Tracker1 и foreach.inc, foreach может быть быстрее быстрее, но при использовании плагина JIT (подробнее: КЛАЦ) метод Tracker1 вырывается вперёд. Выбор за вами.
    Подробнее про переборы игроков:
    foreach (Y_Less): http://forum.sa-mp.com/showthread.php?t=92679
    Перебор игроков Tracker1: http://pro-pawn.ru/showthread.php?5747
     Тесты скорости (без JIT)

     Тесты скорости (с использованием JIT)





    7) Форматируя сроку, можно указывать не только ширину поля, которое будет дополняться пробелами*, но и нулями, добавляя между % и число указывающее размер поля - 0.
    PHP код:
    printf("Value: %02d"9); //Выводит на экран "Value: 09" 
    Часто встречаемый пример:
    PHP код:
    // Говнокод для вывода минут в двухсимвольном виде - ищите в любом RLS.
    gettime(hoursminuitesseconds);
    if (
    minuite 10)
        
    format(stringsizeof(string), "~y~%d %s~n~~g~|~w~%d:0%d~g~|"daymtexthoursminuites);
    else
        
    format(stringsizeof(string), "~y~%d %s~n~~g~|~w~%d:%d~g~|"daymtexthoursminuites); 
    Вместо этого можно сделать так:
    PHP код:
    gettime(hoursminuitessecond);
    // Между "%" и "d" мы добавили "02", чтобы минуты отображались в
    // двухсимвольном формате с пустыми ячейками поля, заменяющимися на нули.
    format(stringsizeof(string), "~y~%d %s~n~~g~|~w~%d:%02d~g~|"daymtexthoursminuites); 
    *При форматировании строк можно указывать максимальную длину поля между символом % и символом спецификатора. Подробнее: КЛАЦ



    8) Функции, названия которых начинаются с символа "@", автоматически получают атрибут public.
    Такие функции можно использовать в таймерах, CallLocalFunction и т.п.
    *Символ "@" обязательно должен быть первым, а какие символы будут дальше - разницы нет.
    Пример:
    PHP код:
    @TimerFunc();
    @
    TimerFunc()
    {
        print(
    "Прошла 1 секунда с момента запуска мода");
    }

    public 
    OnGameModeInit()
    {
        
    SetTimer("@TimerFunc"1000false);



    9) Оформление кода никак не влияет на скомпилированный код (.amx).
    Чего не скажешь про его читабельность и восприятие автором или другими программистами.
    Отличные рекомендации по написанию кода можете найти здесь: http://pro-pawn.ru/showthread.php?8347



    10) "Переключаемые" многострочные комментарии.
    Думаю, все знакомы с многострочными комментариями в Pawn:
    Код:
    /*
    SendClientMessage(playerid, -1, "Some text");
    */
    Но что, если вам вдруг нужно раскомментировать этот участок кода?
    Правильно, кроме стирания первых "/*" придётся выискивать и завершающие комментарий символы "*/".
    Это может оказаться проблемой, если приходится часто комментировать/раскомментировать длинный участок кода (например, при тестировании).
    На этот случай можно сделать комментарий "переключаемым":
    Код:
    /*
    SendClientMessage(playerid, -1, "Some text");
    // */
    Теперь добавим перед "/*" один слэш ("/"):
    Код:
    //*
    SendClientMessage(playerid, -1, "Some text");
    // */
    В итоге мы "нейтрализовали" многострочный комментарий.
    Чтобы включить его обратно, достаточно лишь убрать первый слэш.
    Обратите внимание: между последними двумя слэшами и закрытием многострочного комментария ("//" и "*/") стоит пробел.
    Они разделены пробелом, чтобы компилятор обрабатывал их именно как "//" и "*/", а не "/", "/*" и "/" - в этом случае компилятор подумает, что это вложенный комментарий, и выдаст варнинг.



    11) Пропуск инициализации ячеек массива нулями.
    При объявлении локальных массивов внутри функций компилятор не только резервирует место в стеке под массив, но и инициализирует все его ячейки нулями, чтобы в них не было мусорных значений.
    Сделано это из-за быдлокодеров, которые, пользуются переменными, забывая их инициализировать.
    Тем не менее, инициализация занимает некоторое время, да и польза от этого сомнительная, если вы способны отдавать отчёт своим действиям.
    К счастью, есть способ избежать потерь во времени, пропустив инициализацию:
    PHP код:
    SomeFunction()
    {
        
    // перед объявлением массива перейдём на метку skip_array_init
        
    goto skip_array_init;
        
    // объявляем массив
        
    new arr[256];
    skip_array_init:
        
    // в этом месте массив arr будет существовать, но он не будет инициализирован:
        // код инициализации существует, но он находится _до_ метки skip_array_init,
        // т.е. мы обошли этот код

        // дальше - код с использованием массива

    Почему пропуск инициализации повышает производительность кода?
      Открыть/закрыть

    Скомпилируем код, а затем дизассемблируем его.
    Получим следующую последовательность инструкций:
    Код HTML:
    	; Начало функции SomeFunction.
    	proc
    	; И сразу же - переход на метку l.0 (см. далее).
    	jump		0
    	; Выделение места в стеке под массив из 16 ячеек (ffffffc0 означает "-16")
    	; (этот код никогда не сработает, переход на l.0 был безусловным).
    	stack		ffffffc0
    	; Заполнение массива нулями происходит побайтово,
    	; 16 ячеек - 64 байта (40 в шестнадцатеричной системе счисления).
    	zero.pri
    	addr.alt	ffffffc0
    	fill		40
    ; Метка, с помощью которой пропускается инициализация массива.
    l.0
    	; Установка вершины стека в то положение, когда выделено 16 ячеек под массив,
    	; Обратите внимание: в отличие от обычного создания массива,
    	; здесь массив не заполняется никакими значениями,
    	; происходит только резервирование пространства,
    	lctrl		5
    	add.c		ffffffc0
    	sctrl		4
    	; Код с использованием массива.
    	; ...
    	; Высвобождение пространства в стеке и возврат из функции.
    	stack		40
    	zero.pri
    	retn
    Если кому интересно, вот тест скорости:
      Открыть/закрыть
    PHP код:
    #include <a_samp>

    const PROFILE_ITERATIONS_MAJOR 1000;
    const 
    PROFILE_ITERATIONS_MINOR 1000;

    const 
    STRING_SIZE 512;


    const 
    SZ STRING_SIZE;

    #define _m1();\
        
    {new a[SZ];}
    #define method1();\
        
    _m1();_m1();_m1();_m1();_m1();_m1();_m1();_m1();_m1();_m1();

    #define _m2();\
        
    {goto skip_init;new a[SZ];skip_init:}
    #define method2();\
        
    _m2();_m2();_m2();_m2();_m2();_m2();_m2();_m2();_m2();_m2();


    bool:IsJITEnabled()
    {
        
    #emit    lctrl    7
        #emit    retn
        
    return true;
    }

    main()
    {
        
    printf(
            
    "Testing array initialization..." "\n"\
            
    "(%dx%d iterations, array size: %d, JIT status: %sabled)",
            
    PROFILE_ITERATIONS_MAJORPROFILE_ITERATIONS_MINOR,
            
    STRING_SIZEIsJITEnabled() ? ("en") : ("dis")
        );
        new 
    t1t2tij;
        
    t1 0t2 0;
        for(
    0PROFILE_ITERATIONS_MAJOR; ++i)
        {
            
    GetTickCount();
            for(
    0PROFILE_ITERATIONS_MINOR; ++j)
            {
                
    method1();
                
    method1();
                
    method1();
                
    method1();
                
    method1();
                
    method1();
                
    method1();
                
    method1();
                
    method1();
                
    method1();
            }
            
    t1 += GetTickCount()-t;
            
    GetTickCount();
            for(
    0PROFILE_ITERATIONS_MINOR; ++j)
            {
                
    method2();
                
    method2();
                
    method2();
                
    method2();
                
    method2();
                
    method2();
                
    method2();
                
    method2();
                
    method2();
                
    method2();
            }
            
    t2 += GetTickCount()-t;
        }
        
    printf(
            
    "method 1: %d" "\n"\
            
    "method 2: %d",
            
    t1t2
        
    );


    Макросы method1 и method2 сделаны, чтобы повторить в них создание локальных массивов по 10 раз.
    Кроме того сами макросы используются в функции main по 10 раз (итого получается 10x10 = 100 повторов).
    Это не что иное, как развёртывание циклов, сделанное чтобы уменьшить погрешность от циклов и вызовов GetTickCount, таким образом, увеличив точность измерений.
    Также в процессе компиляции выдаётся куча варнингов, но они, опять же, из-за макросов, не обращайте на них внимания.
    Тестирование проведено на массивах из 32, 256 и 512 ячеек, с включенным и выключенным JIT.
    Результаты следующие:
      Открыть/закрыть

    Код:
    Testing array initialization...
    (1000x1000 iterations, array size: 32, JIT status: disabled)
    method 1: 5581
    method 2: 47
    
    Testing array initialization...
    (1000x1000 iterations, array size: 32, JIT status: enabled)
    method 1: 2640
    method 2: 4
    Код:
    Testing array initialization...
    (1000x1000 iterations, array size: 256, JIT status: disabled)
    method 1: 31324
    method 2: 42
    
    Testing array initialization...
    (1000x1000 iterations, array size: 256, JIT status: enabled)
    method 1: 15106
    method 2: 3
    Код:
    Testing array initialization...
    (1000x1000 iterations, array size: 512, JIT status: disabled)
    method 1: 63840
    method 2: 40
    
    Testing array initialization...
    (1000x1000 iterations, array size: 512, JIT status: enabled)
    method 1: 29161
    method 2: 4

    Из измерений можно сделать вывод, что размер массива никак не влияет на результаты метода с пропуском инициализации массива.
    Но всё же от трюка не сильно много пользы. Да, цифры в тесте, казалось бы, большие, но не стоит забывать, что они получены с помощью 100 миллионов итераций.
    В нормальных же условиях время инициализации массива в 512 ячеек составит всего ~0.0006384 мс или ~0.0000006 секунды.

    Также для удобства можно использовать следующий макрос:
    PHP код:
    #define noinit:%0[%1]; goto _noinit_%0;new %0[%1];_noinit_%0: 
    Пример использования:
    PHP код:
    public OnGameModeInit()
    {
        
    // Объявляем массив test и пропускаем обычную инициализацию его ячеек.
        
    noinit:test[120];
        
    // Инициализируем ячейки массива вручную случайными числами.
        
    for (new 0sizeof(test); i++)
            
    test[i] = random(sizeof(test));
        
    // ...



    12) strcat или format?
    Какая из этих функций наиболее эффективна для соединения строк?
    Согласно тесту скорости (по алгоритму профилирования Daniel_Cortez), strcat выполняется намного быстрее чем format при конкатенации 2 строк.
    Но если нужно соединить 3 или более строк, рано или поздно format вырвется вперёд, т.к. львиная доля времени уходит на вызов нативных функций. Чем больше строк нужно соединить, тем больше раз нужно вызвать функцию strcat. В то же время, функция format может одним вызовом соединить практически неограниченное количество строк - отсюда и выгода.

    Опытным путём удалось выяснить, что strcat выгодно использовать при соединении от 2 до 7 строк.
      Открыть/закрыть

    Проверим скорость конкатенации 7 строк.
    Вот код настроек профайлера:
    PHP код:
    const PROFILE_ITERATIONS_MAJOR 3_000;
    const 
    PROFILE_ITERATIONS_MINOR 1_000;

    new const 
    code_snippets_names[2][] =
    {
        {
    "format"},
        {
    "strcat(x7)"}
    };

    #define Prerequisites();\
        
    static\
            
    str1[] = "1234567890123456789012345678901234567890",\
            
    str2[] = "1234567890123456789012345678901234567890",\
            
    str3[] = "1234567890123456789012345678901234567890",\
            
    str4[] = "1234567890123456789012345678901234567890",\
            
    str5[] = "1234567890123456789012345678901234567890",\
            
    str6[] = "1234567890123456789012345678901234567890",\
            
    str7[] = "1234567890123456789012345678901234567890";\
        new 
    buffer[512];

    #define CodeSnippet1();\
        
    format(buffersizeof(buffer), "%s%s%s%s%s%s%s"str1str2str3str4str5str6str7);

    #define CodeSnippet2();\
        
    buffer str1strcat(bufferstr2), strcat(bufferstr3), strcat(bufferstr4);\
        
    strcat(bufferstr5), strcat(bufferstr6), strcat(bufferstr7); 
    Результаты теста в интерпретируемом режиме:
    Код:
    Тестирование: <format> vs <strcat(x7)>
    Режим: интерпретируемый, 3000x1000 итераций.
    format: 5514
    strcat(x7): 5209
    Результаты с использованием JIT:
    Код:
    Тестирование: <format> vs <strcat(x7)>
    Режим: с JIT-компиляцией, 3000x1000 итераций.
    format: 5263
    strcat(x7): 4990
    Как видно, strcat всё ещё немного обгоняет format при соединении 7 строк. При этом, JIT не играет большой роли в результатах: почти всё время уходит на выполнение функций strcat и format.

    Теперь добавим ещё одну строку. Итого у нас будет 8 строк:
    PHP код:
    const PROFILE_ITERATIONS_MAJOR 3_000;
    const 
    PROFILE_ITERATIONS_MINOR 1_000;

    new const 
    code_snippets_names[2][] =
    {
        {
    "format"},
        {
    "strcat(x8)"}
    };

    #define Prerequisites();\
        
    static\
            
    str1[] = "1234567890123456789012345678901234567890",\
            
    str2[] = "1234567890123456789012345678901234567890",\
            
    str3[] = "1234567890123456789012345678901234567890",\
            
    str4[] = "1234567890123456789012345678901234567890",\
            
    str5[] = "1234567890123456789012345678901234567890",\
            
    str6[] = "1234567890123456789012345678901234567890",\
            
    str7[] = "1234567890123456789012345678901234567890",\
            
    str8[] = "1234567890123456789012345678901234567890";\
        new 
    buffer[512];

    #define CodeSnippet1();\
        
    format(buffersizeof(buffer), "%s%s%s%s%s%s%s%s"str1str2str3str4str5str6str7str8);

    #define CodeSnippet2();\
        
    buffer str1strcat(bufferstr2), strcat(bufferstr3), strcat(bufferstr4);\
        
    strcat(bufferstr5), strcat(bufferstr6), strcat(bufferstr7), strcat(bufferstr8); 
    Результаты (режим интерпретации):
    Код:
    Тестирование: <format> vs <strcat(x8)>
    Режим: интерпретируемый, 3000x1000 итераций.
    format: 6084
    strcat(x8): 6260
    Результаты с использованием JIT:
    Код:
    Тестирование: <format> vs <strcat(x8)>
    Режим: с JIT-компиляцией, 3000x1000 итераций.
    format: 5850
    strcat(x8): 6057

    При соединении 8 строк format уже начинает обгонять strcat. Как и предполагалось, при достаточном количестве строк выгода strcat сошла на нет.

    Также strcat автоматически распаковывает строку, если попытаться прицепить упакованную строку к неупакованной, и наоборот, упаковывает, если первая строка тоже была упакована.
    Так или иначе, в отличие от format, при помощи функции strcat нельзя одним вызовом объединить две строки, записав результат в отдельный массив, или одновременно объединить больше чем две строки - нужно сначала отдельным действием записать в массив для хранения результата одну строку, а потом с помощью strcat добавить другую.



    Автор темы: ^_^.
    Авторы ответов: 1, 2, 3, 5, 6 - Tracker1; 4, 6, 8, 9, 10, 11 - Daniel_Cortez; 8 - DeimoS; 3,4 - ^_^
    Если у вас появился интересный ответ или хороший совет, строго касающегося языка pawn или частных проблем sa-mp, прошу оставить его в комментариях (он будет добавлен в саму тему). Заранее спасибо.
    Тема будет дополняться.
    Последний раз редактировалось ^_^; 12.08.2015 в 19:10.

  2. 30 пользователя(ей) сказали cпасибо:
    #ball (31.07.2014) #Vito (30.08.2014) *Dance* (01.12.2013) .Kos (31.03.2014) Alexok (07.03.2016) Aurelius (18.01.2021) Avertus (12.01.2014) Blood (30.08.2016) bredvix (11.01.2014) Daniel_Cortez (01.12.2013) DeimoS (15.02.2014) Desulaid (24.03.2015) dimozz (27.08.2014) Edwin (13.04.2014) Elaid (18.09.2014) Glant (31.07.2016) Hidden (23.08.2014) Just_Fenix (06.05.2014) kushichka (25.06.2016) L0ndl3m (29.11.2013) Mr_David (01.12.2013) Nash_Brigers (24.04.2016) NewGreen (06.07.2015) Osetin (29.11.2013) Prolific (16.03.2016) Salvacore (11.01.2014) Sp1ke (03.12.2015) Unreal (27.09.2015) [ForD] (20.03.2015) Тузик (26.11.2016)
  3. #2
    Аватар для ^_^
    Übermensch

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    157
    Репутация:
    245 ±
    (пост зарезервирован)

  4. Пользователь сказал cпасибо:
    Osetin (29.11.2013)
  5. #3
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Not bad. Признаюсь честно, не знал, что параметры функций можно пропускать с помощью знака _
    Обычно я пропускал их по-другому:
    PHP код:
    new min;
    gettime(.minute=min); 

    Насчёт пункта (4):
    PHP код:
    GamePart[playerid] = floatround(PlayerEnteredMinute/20floatround_tozero) + 1
    Получается, что ты сначала вычисляешь целочисленный результат (PlayerEnteredMinute/20), затем конвертируешь его в вещ. число (после компиляции "PlayerEnteredMinute/20" преобразуется в "float(PlayerEnteredMinute/20)") и затем округляешь обратно до целого.
    Зачем тогда вообще использовать floatround?
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  6. #4
    Аватар для *Dance*
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.10.2013
    Сообщений
    339
    Репутация:
    106 ±
    Очень полезная темка, молодец что здесь ее выложил:)

  7. Пользователь сказал cпасибо:
    ^_^ (01.12.2013)
  8. #5
    Аватар для ^_^
    Übermensch

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    157
    Репутация:
    245 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Not bad. Признаюсь честно, не знал, что параметры функций можно пропускать с помощью знака _
    Обычно я пропускал их по-другому:
    PHP код:
    new min;
    gettime(.minute=min); 

    Насчёт пункта (4):
    PHP код:
    GamePart[playerid] = floatround(PlayerEnteredMinute/20floatround_tozero) + 1
    Получается, что ты сначала вычисляешь целочисленный результат (PlayerEnteredMinute/20), затем конвертируешь его в вещ. число (после компиляции "PlayerEnteredMinute/20" преобразуется в "float(PlayerEnteredMinute/20)") и затем округляешь обратно до целого.
    Зачем тогда вообще использовать floatround?
    Логично, вероятнее всего я не учёл тот факт что в переменной будет записан именно целочисленный результат, вот и усложнил всё. Тема обновлена.

  9. #6
    Аватар для Osetin
    •Администратор•

    Статус
    Оффлайн
    Регистрация
    26.03.2013
    Адрес
    ♔Osetia, Vladikavkaz♔
    Сообщений
    3,432
    Репутация:
    1093 ±
    Установил статус "Важная"

  10. #7
    Аватар для ^_^
    Übermensch

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    157
    Репутация:
    245 ±
    Тема обновлена, добавлен пункт 6.

  11. 2 пользователя(ей) сказали cпасибо:
    *Dance* (11.01.2014) Daniel_Cortez (10.01.2014)
  12. #8
    Аватар для ^_^
    Übermensch

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    157
    Репутация:
    245 ±
    Тема обновлена, добавлен пункт 7.

  13. Пользователь сказал cпасибо:
    Osetin (15.02.2014)
  14. #9
    Аватар для ^_^
    Übermensch

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    157
    Репутация:
    245 ±
    Тема обновлена, добавлены пункты 8 и 9.

  15. 2 пользователя(ей) сказали cпасибо:
    Daniel_Cortez (21.04.2014) DeimoS (21.04.2014)
  16. #10
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Дополнение к пункту 8. Символ "@" обязательно должен стоять вначале, а вот какие символы будут дальше - разницы нет (естественно, в пределах возможностей Pawn). То бишь, подобные функции можно отделять, например, так:
    PHP код:
    @__FuncName();
    @
    __FuncName() print("Прошла 1 секунда с момента запуска мода");
    public 
    OnGameModeInit()
    {
       
    SetTimer("@__FuncName"1000false);

    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

 

 
Страница 1 из 7 1 2 3 ... ПоследняяПоследняя

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

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

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

Ваши права

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