Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 7 из 7 ПерваяПервая ... 5 6 7
Показано с 61 по 68 из 68
  1. #61
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Кому то просто нужно ближе подобраться к понятию инициализация
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

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

    Статус
    Оффлайн
    Регистрация
    02.04.2017
    Адрес
    Краснодар
    Сообщений
    83
    Репутация:
    20 ±
    Цитата Сообщение от Alpano Посмотреть сообщение
    так я и хочу понять, разобраться.
    я в принципе пока писал комментарий сам понял почему так, но всё-же решил опубликовать)
    Данный приём стоит использовать только тогда, когда массив имеет большое кол-во ячеек.
    Ибо инициализация таких объемных наборов данных занимает достаточно продолжительное время, особенно в тех массивах, кои занимают по 1500-2000 байт и выше.

    Применять оператор goto, или отправлять инструкцию jump, в местах, например, где необходимо проинициализировать массив, заточенный под форматирование - бессмысленно.

  3. #63
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от SooBad Посмотреть сообщение
    Данный приём стоит использовать только тогда, когда массив имеет большое кол-во ячеек.
    Ибо инициализация таких объемных наборов данных занимает достаточно продолжительное время, особенно в тех массивах, кои занимают по 1500-2000 байт и выше.
    Глупо использовать локальные массивы размером 1500-2000 байт. Для таких массивов существует статическая память.

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

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

    Очень часто в чужих скриптах вижу, как один и тот же диалог повторяется в нескольких местах. Это мало того, что потребляет лишнюю память, так ещё и доставляет трудности в случае, если вдруг захочется изменить текст этого диалога (да, можно пользоваться автозаменой, но я хочу предложить альтернативу, которая и уменьшит потребление памяти, и не заставит мучиться с автозаменой).
    А если это целая система, построенная на диалогах - всё становится ещё страшнее, ибо переплетение в виде кучи вызовов разных диалогов напрочь убивает читаемость.

    В общем-то, думаю, ни для кого не секрет, что повторяющийся код лучше убирать в отдельную функцию и вызывать уже функцию, а не каждый раз прописывать код. И как раз именно это я предлагаю использовать. Только если в случае с одним конкретным диалогом всё, вроде как, понятно, то когда у вас целая система, построенная на диалогах, создавать для каждого диалога свою функцию тоже не очень удобно, ибо придётся помнить кучу ненужных названий. Собственно, я хочу предложить решение (точнее, просто натолкнуть на эту идею тех, кто сам до неё не дошёл) для подобных ситуаций. Заключается оно в том, что для одной конкретной системы будет использоваться одна функция, через которую уже будут показываться все диалоги этой системы. В общем-то реализация проста:

    PHP код:
    stock ShowRegistrationDialog(playeriddialogid)
    {
        switch(
    dialogid)
        {
            case 
    id_диалога_1:
            {
                
    ShowPlayerDialog(playeriddialogidпрочая_информация);
            }
            case 
    id_диалога_2:
            {
                
    //Тут любой код, что требуется выполнять при каждом показе диалога
                
    ShowPlayerDialog(playeriddialogidпрочая_информация);
            }
            case 
    id_диалога_3:
            {
                
    ShowPlayerDialog(playerid/*тут можно именно dialogid и указывать, ибо там в любом случае будет хранится нужный ID диалога, если условие в switch сработает*/прочая_информация);
            }
        }
        return 
    1;

    И уже просто в том месте, где нужно (повторно) показать диалог, прописываем:
    PHP код:
    ShowRegistrationDialog(playeridid_диалога_1); 
    Всё это и код в более опрятный вид приводит, ибо нет строк, что за границы экрана уходят, и позволяют без проблем вызывать диалоги там, где это требуется, без каких-либо копирований целого диалога.

    Только стоит обязательно учитывать, что не стоит в одну такую функцию пихать кучу диалогов, ибо это будет, опять же, неудобно. Лучше, как я писал выше, для каждой системы выделять одну функцию.

    И если использовать перечисление для хранения ID диалогов, то код становится ещё опрятнее:
    PHP код:
    enum
    {
        
    dRegisterMain,
        
    dRegisterInputName,
        
    dRegisterInputPass
    }


    stock ShowRegistrationDialog(playeriddialogid)
    {
        switch(
    dialogid)
        {
            case 
    dRegisterMain:
            {
                
    ShowPlayerDialog(playeriddialogidпрочая_информация);
            }
            case 
    dRegisterInputName:
            {
                
    //Тут любой код, что требуется выполнять при каждом показе диалога
                
    ShowPlayerDialog(playeriddialogidпрочая_информация);
            }
            case 
    dRegisterInputPass:
            {
                
    ShowPlayerDialog(playerid/*тут можно именно dialogid и указывать, ибо там в любом случае будет хранится нужный ID диалога, если условие в switch сработает*/прочая_информация);
            }
        }
        return 
    1;
    }

    public 
    OnDialogResponse(playeriddialogidresponselistiteminputtext[])
    {
        switch(
    dialogid)
        {
            case 
    dRegisterMain:
            {
                if(!
    response)
                    return 
    1;
                else
                    return 
    ShowRegistrationDialog(playeriddRegisterInputName);

            }
            case 
    dRegisterInputName:
            {
                if(!
    response)
                    return 
    ShowRegistrationDialog(playeriddRegisterMain);
                else
                    return 
    ShowRegistrationDialog(playeriddRegisterInputPass);
            }
            case 
    dRegisterInputName:
            {
                if(!
    response)
                    return 
    ShowRegistrationDialog(playeriddRegisterInputName);
                else
                    return 
    SpawnPlayer(playerid);
            }
        }

    Собственно, всё. Вроде, вполне логичное оформление кода, но, судя по коду в паблике, практически никто не доходит до использования подобного.
    Последний раз редактировалось DeimoS; 16.09.2017 в 14:31.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  5. 3 пользователя(ей) сказали cпасибо:
    Nexius_Tailer (16.09.2017) SooBad (16.09.2017) VVWVV (16.09.2017)
  6. #65
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Для подобных случаев есть: TDW Dialog Library
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Так и не решился создавать отдельную тему, так что отпишу сюда.

    Очень часто в чужих скриптах вижу, как один и тот же диалог повторяется в нескольких местах. Это мало того, что потребляет лишнюю память, так ещё и доставляет трудности в случае, если вдруг захочется изменить текст этого диалога (да, можно пользоваться автозаменой, но я хочу предложить альтернативу, которая и уменьшит потребление памяти, и не заставит мучиться с автозаменой).
    А если это целая система, построенная на диалогах - всё становится ещё страшнее, ибо переплетение в виде кучи вызовов разных диалогов напрочь убивает читаемость.

    В общем-то, думаю, ни для кого не секрет, что повторяющийся код лучше убирать в отдельную функцию и вызывать уже функцию, а не каждый раз прописывать код. И как раз именно это я предлагаю использовать. Только если в случае с одним конкретным диалогом всё, вроде как, понятно, то когда у вас целая система, построенная на диалогах, создавать для каждого диалога свою функцию тоже не очень удобно, ибо придётся помнить кучу ненужных названий. Собственно, я хочу предложить решение (точнее, просто натолкнуть на эту идею тех, кто сам до неё не дошёл) для подобных ситуаций. Заключается оно в том, что для одной конкретной системы будет использоваться одна функция, через которую уже будут показываться все диалоги этой системы. В общем-то реализация проста:

    PHP код:
    stock ShowRegistrationDialog(playeriddialogid)
    {
        switch(
    dialogid)
        {
            case 
    id_диалога_1:
            {
                
    ShowPlayerDialog(playeriddialogidпрочая_информация);
            }
            case 
    id_диалога_2:
            {
                
    //Тут любой код, что требуется выполнять при каждом показе диалога
                
    ShowPlayerDialog(playeriddialogidпрочая_информация);
            }
            case 
    id_диалога_3:
            {
                
    ShowPlayerDialog(playerid/*тут можно именно dialogid и указывать, ибо там в любом случае будет хранится нужный ID диалога, если условие в switch сработает*/прочая_информация);
            }
        }
        return 
    1;

    И уже просто в том месте, где нужно (повторно) показать диалог, прописываем:
    PHP код:
    ShowRegistrationDialog(playeridid_диалога_1); 
    Всё это и код в более опрятный вид приводит, ибо нет строк, что за границы экрана уходят, и позволяют без проблем вызывать диалоги там, где это требуется, без каких-либо копирований целого диалога.

    Только стоит обязательно учитывать, что не стоит в одну такую функцию пихать кучу диалогов, ибо это будет, опять же, неудобно. Лучше, как я писал выше, для каждой системы выделять одну функцию.

    И если использовать перечисление для хранения ID диалогов, то код становится ещё опрятнее:
    PHP код:
    enum
    {
        
    dRegisterMain,
        
    dRegisterInputName,
        
    dRegisterInputPass
    }


    stock ShowRegistrationDialog(playeriddialogid)
    {
        switch(
    dialogid)
        {
            case 
    dRegisterMain:
            {
                
    ShowPlayerDialog(playeriddialogidпрочая_информация);
            }
            case 
    dRegisterInputName:
            {
                
    //Тут любой код, что требуется выполнять при каждом показе диалога
                
    ShowPlayerDialog(playeriddialogidпрочая_информация);
            }
            case 
    dRegisterInputPass:
            {
                
    ShowPlayerDialog(playerid/*тут можно именно dialogid и указывать, ибо там в любом случае будет хранится нужный ID диалога, если условие в switch сработает*/прочая_информация);
            }
        }
        return 
    1;
    }

    public 
    OnDialogResponse(playeriddialogidresponselistiteminputtext[])
    {
        switch(
    dialogid)
        {
            case 
    dRegisterMain:
            {
                if(!
    response)
                    return 
    1;
                else
                    return 
    ShowRegistrationDialog(playeriddRegisterInputName);

            }
            case 
    dRegisterInputName:
            {
                if(!
    response)
                    return 
    ShowRegistrationDialog(playeriddRegisterMain);
                else
                    return 
    ShowRegistrationDialog(playeriddRegisterInputPass);
            }
            case 
    dRegisterInputName:
            {
                if(!
    response)
                    return 
    ShowRegistrationDialog(playeriddRegisterInputName);
                else
                    return 
    SpawnPlayer(playerid);
            }
        }

    Собственно, всё. Вроде, вполне логичное оформление кода, но, судя по коду в паблике, практически никто не доходит до использования подобного.
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    Для подобных случаев есть: TDW Dialog Library
    Ну, во-первых, знания о том, как такое можно реализовать, лишними не будут никогда. Слепое пользование чужим инструментом часто приводит к тому, что пользователь не может решить, казалось бы, простые проблемы, связанные с этим инструментом.
    Во-вторых, изучать синтаксис целой библиотеки (который, к слову, далеко не самый удачный, как по мне) ради подобного - не самое лучшее распределение собственного времени =)
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  8. #67
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Пишу мод разбитый на модули, данную библиотеку взял для данных целей. Работает все прекрасно (и синтаксис довольно таки удачный)
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Ну, во-первых, знания о том, как такое можно реализовать, лишними не будут никогда. Слепое пользование чужим инструментом часто приводит к тому, что пользователь не может решить, казалось бы, простые проблемы, связанные с этим инструментом.
    Во-вторых, изучать синтаксис целой библиотеки (который, к слову, далеко не самый удачный, как по мне) ради подобного - не самое лучшее распределение собственного времени =)
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

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

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

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

    Steve Pavlina

 

 
Страница 7 из 7 ПерваяПервая ... 5 6 7

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

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

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

Ваши права

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