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

    Статус
    Оффлайн
    Регистрация
    01.06.2014
    Адрес
    Москва
    Сообщений
    92
    Репутация:
    16 ±

    Упрощаем работу с длинным текстом.

    Здравствуйте!

    Не редко я был свидетелем вот таких кодов:

    PHP код:
    static const _n[][] =
    {
    "1\n",//0
    "2\n",//1
    "3\n",//2
    "4\n",//3
    "5"//4
    }
    format(stringsizeof(string),"%s%s%s%s%s%s"_n[0],_n[1],_n[2],_n[3],_n[5]);
    ShowPlayerDialog(playerid1DIALOG_STYLE_LIST"Текст"string"Закрыть"""); 
    Данный код является не читабельным (по крайне мере, для меня.)
    Приходится постоянно считать количество "%s".
    Обращаться с данным кодом тяжело, когда большое количество строк.

    Как это исправить?

    1) Данный метод подходит, когда есть некоторые переменные, которые нужно внедрить в текст.

    PHP код:
    new string[62];
    format(stringsizeof(string), "1. %d",kills);
    format(stringsizeof(string), "%s\n2. %d",string,kills);
    format(stringsizeof(string), "%s\n3. %d",string,kills);
    format(stringsizeof(string), "%s\n4. %d",string,kills);
    format(stringsizeof(string), "%s\n5. %d",string,kills);
    ShowPlayerDialog(playerid1DIALOG_STYLE_LIST"Текст"string"Закрыть"""); 
    2) Можно воспользоваться циклом.

    Данный метод подходит для вывода большого текста, где нету переменных, которые нужно вставлять в текст. (Пример: Привила сервера.)

    PHP код:
    static const _n[5][] =
    {
    "1",//0
    "2",//1
    "3",//2
    "4",//3
    "5"//4
    }
    new 
    string[5];
    for(new 
    j5j++) format(stringsizeof(string),"%s%s\n"stringn[j]);
    ShowPlayerDialog(playerid1DIALOG_STYLE_LIST"Текст"string"Закрыть"""); 
    3) В этом методе при выводе диалога игроку будет показано содержимое всех строк. В секции данных эти строки располагаются непосредственно друг за другом и можно "сцепить" их, заменив символ конца строки в long_string на любой другой символ (в даном случае - перенос строки).
    При этом не нужно будет перед каждым использованием выделять место в стеке и соединять их - всё уже сделано.
    Пример:

    Ко всем new добавляем:
    PHP код:
    new
        
    long_string[] =
            
    "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n"\
            
    "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
        
    long_string_1[] =
            
    "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n"\
            
    "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
    В OnGameModeInit добавляем:

    PHP код:
    long_string[sizeof(long_string)-1] = '\n';
    long_string_1[sizeof(long_string_1)-1] = '\0'
    В место, куда нужно:
    PHP код:
    ShowPlayerDialog(playerid0DIALOG_TYPE_MSGBOX"Текст"long_string"Закрыть"""); 
    Тем самым мы сделали код более понятным. С ним проще обращаться.

    Помощь: Tracker1, Daniel_Cortez

    Копирование данной статьи без разрешения автора запрещено!
    Последний раз редактировалось Flime; 31.08.2014 в 22:03.

  2. 5 пользователя(ей) сказали cпасибо:
    #Gabriel (11.12.2014) BadPawn (05.02.2016) Danny_Marcelo (19.05.2016) seriu (22.01.2016) Web (23.08.2018)
  3. #2
    Аватар для DeimoS
    Модератор?

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

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

    Steve Pavlina

  4. #3
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    А теперь позвольте показать вам небольшой фокус:
    PHP код:
    new
        
    long_string[] =
            
    "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n"\
            
    "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
        
    long_string_1[] =
            
    "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n"\
            
    "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";


    public 
    OnGameModeInit()
    {
        
    long_string[sizeof(long_string)-1] = '\n';
        
    long_string_1[sizeof(long_string_1)-1] = '\0';
    }


    CMD:loremipsum(playeridparams[])
        return 
    ShowPlayerDialog(playerid0DIALOG_TYPE_MSGBOX"??"long_string"Close"""); 
    При вводе команды игроку будет показано содержимое обеих строк. В секции данных эти строки располагаются непосредственно друг за другом и можно "сцепить" их, заменив символ конца строки в long_string на любой другой символ (в даном случае - перенос строки).
    При этом не нужно будет перед каждым использованием выделять место в стеке и соединять их - всё уже сделано.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  5. 5 пользователя(ей) сказали cпасибо:
    #Gabriel (11.12.2014) $continue$ (24.12.2015) kushichka (02.07.2016) Prolific (25.04.2016) Unreal (14.10.2015)
  6. #4
    Аватар для Avertus
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.12.2013
    Сообщений
    86
    Репутация:
    17 ±
    Ну и в продолжение темы приведу вполне работоспособный и красивый вариант:

    PHP код:
     #define s1 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
     #define s2 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n"
     #define s3 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n"
     #define s4 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\n"
     #define s5 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n"
     #define s6 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\n"
     #define s7 "GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG\n"
     #define s9 "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH\n"
     #define s8 "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\n"
     #define s0 "JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ\n"
    // #define ss (s1 s2 s3 s4 s5 s6 s7 s8 s9 s0 s0 s0 s0 s0 s0 s0 s0 s0 s0)  если используется в одном метсе

     
    new const ss[] = s1 s2 s3 s4 s5 s6 s7 s8 s9 s0 s0 s0 s0 s0 s0 s0 s0 s0 s0
    Если текст используется более чем в одном месте, то его стоит сохранить в массив, дабы не «раздувать» amx файл.

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

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

    PHP код:
     #define s1 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
     #define s2 "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n"
     #define s3 "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n"
     #define s4 "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\n"
     #define s5 "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n"
     #define s6 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\n"
     #define s7 "GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG\n"
     #define s9 "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH\n"
     #define s8 "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\n"
     #define s0 "JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ\n"
    // #define ss (s1 s2 s3 s4 s5 s6 s7 s8 s9 s0 s0 s0 s0 s0 s0 s0 s0 s0 s0)  если используется в одном метсе

     
    new const ss[] = s1 s2 s3 s4 s5 s6 s7 s8 s9 s0 s0 s0 s0 s0 s0 s0 s0 s0 s0
    Если текст используется более чем в одном месте, то его стоит сохранить в массив, дабы не «раздувать» amx файл.
    И компилятор, в лучшем случае, просто зависнет...
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  8. #6
    Аватар для Avertus
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.12.2013
    Сообщений
    86
    Репутация:
    17 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    И компилятор, в лучшем случае, просто зависнет...
    Вовсе нет. Я то протестировал вначале прежде чем писать. Правда только на русифицированном компиляторе. Сейчас попробую на стандартном.

  9. #7
    Аватар для L0ndl3m
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    Цитата Сообщение от Avertus Посмотреть сообщение
    Вовсе нет. Я то протестировал вначале прежде чем писать. Правда только на русифицированном компиляторе. Сейчас попробую на стандартном.
    Вот именно, в стандартном компиляторе максимальная длина строки 511 символов. Если будут задекларированы большие строки в макросах, то будут проблемы. Как по мне, данный вариант некое "извращение", если его можно так назвать. Если создавать для каждых строк макросы, не думаю, что это будет удобно самому разработчику ( не всегда ). Если нужно будет изменить текст быстрым способом, так клавиши CTRL + F никто не отменял.

  10. Пользователь сказал cпасибо:
    Unreal (14.10.2015)
  11. #8
    Аватар для Avertus
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.12.2013
    Сообщений
    86
    Репутация:
    17 ±
    Цитата Сообщение от Londlem Посмотреть сообщение
    Вот именно, в стандартном компиляторе максимальная длина строки 511 символов..
    Ну да, попробовал стандартным, повесился. А жаль. =(

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

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

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

    Steve Pavlina

  13. #10
    Аватар для codeo
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.04.2014
    Сообщений
    108
    Репутация:
    9 ±
    Подскажите, почему не открывается диалог с текстом?

    PHP код:
    new _n[11][520]=
    {
        
    "{FF6600}1. {0099FF}текст",
        
    "{FF6600}1. {0099FF}текст",
        
    "{FF6600}1. {0099FF}текст",
        
    "{FF6600}1. {0099FF}текст",
        
    "{FF6600}1. {0099FF}текст",
        
    "{FF6600}1. {0099FF}текст",
        
    "{FF6600}1. {0099FF}текст",
        
    "{FF6600}1. {0099FF}текст",
        
    "{FF6600}1. {0099FF}текст",
        
    "{FF6600}1. {0099FF}текст",
        
    "{FF6600}1. {0099FF}текст"
    }; 


    PHP код:
    CMD:pravplayeridparams[ ] )
    {
        new 
    string[520];
        for(new 
    j11;j++ ) format(stringsizeof(string),"%s%s\n"string_n[j]);
        
    ShowPlayerDialog(playerid564564DIALOG_STYLE_MSGBOX"{008080}Правила"string"Выбрать""Отмена");
        return 
    1;


 

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

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

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

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

Ваши права

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