| Бегущая строка | 
|  | 
| 
| tonline_kms65 | Дата: Воскресенье, 22.12.2019, 07:22:37 | Сообщение # 1 |  |   
|  |  | Сообщений: 215 Репутация: 3 [ +/- ]
 |  | Здравствуйте все.Появилась (она и не пропадала, просто сейчас загорелось) у меня идея создания такого кода "бегущая строка" как в 1,6.
 Работа с текстом это моё слабое место, многого не могу понять, отсюда невозможность создания кода.
 
 Хотелось бы услышать советы, как это можно реализовать.
 Я понимаю что нужно делать таймером, смещая текст по координате Х.
 Но это всё, в чем я уверен на 100%, остальное мне непонятно.
 Нужно узнать кол-во символов, ширину символа(на сколько смещать), да и вообще, может возникнуть масса неучтенных моментов.
 Мастера по работе с текстом - хочу услышать ваши советы.
 
 Совершенно не интересует целесообразность использования этого кода - интересен процесс.
 
 
 Сообщение отредактировал tonline_kms65 - Воскресенье, 22.12.2019, 07:25:30 |  |  |  |  | 
| 
| _wS_ | Дата: Воскресенье, 22.12.2019, 07:58:56 | Сообщение # 2 |  |   | Для примера думаю сойдет, но тут без учета русских символов.
 
 Код new Handle:g_hTimer = INVALID_HANDLE;new const String:g_Str[] = "My Text              ";
 new g_CurrentIndex, g_MaxIndex;
 
 public Action:b_cmd(client, args)
 {
 if (g_hTimer != INVALID_HANDLE)
 {
 KillTimer(g_hTimer);
 g_hTimer = INVALID_HANDLE;
 }
 else if ((g_MaxIndex = (strlen(g_Str) - 1)) > 0)
 {
 g_CurrentIndex = -1;
 msg(client);
 g_hTimer = CreateTimer(0.1, g_hTimer_CallBack, client, TIMER_REPEAT);
 }
 return Plugin_Handled;
 }
 
 public Action:g_hTimer_CallBack(Handle:timer, any:client)
 {
 if (IsClientInGame(client))
 {
 msg(client);
 return Plugin_Continue;
 }
 g_hTimer = INVALID_HANDLE;
 return Plugin_Stop;
 }
 
 msg(client)
 {
 static String:s[256];
 strcopy(s, sizeof(s), g_Str);
 
 if (++g_CurrentIndex < g_MaxIndex) {
 s[g_CurrentIndex + 1] = 0;
 }
 else {
 g_CurrentIndex = -1;
 }
 
 PrintCenterText(client, s);
 }
Функцию msg желательно улучшить, чтобы не было постоянного копирования всей строки в s, но это просто пример.
 |  |  |  |  | 
| 
| tonline_kms65 | Дата: Вторник, 24.12.2019, 14:33:50 | Сообщение # 3 |  |   
|  |  | Сообщений: 215 Репутация: 3 [ +/- ]
 |  | Цитата _wS_ (  )   Функцию msg желательно улучшить, чтобы не было постоянного копирования всей строки в s, но это просто пример.
 Спасибо за рабочий пример.
 Сейчас пытаюсь разобраться как это работает.
 Пока понял только одно, сроку(g_Str) копирую (в s), копию вставляю на смещенные координаты, и этот процесс длится до какого-то предела(предполагаю что это длина строки).
 
 Я не могу понять где начальные координаты задаются и где конечные. Вернее начальные понятно - центр экрана(-1), а вот с конечными, как и где они задаются? Неужели просто длина текста?
 
 Не хочу методом тыка изучать код, но и понять пока не могу.
 
 И кстати, а зачем msg улучшать, чем плохо копирование всей строки? Нет дополнительных ф-ий разбиения, поиска, и т.д.
 
 Сообщение отредактировал tonline_kms65 - Вторник, 24.12.2019, 14:44:47 |  |  |  |  | 
| 
| _wS_ | Дата: Вторник, 24.12.2019, 15:58:30 | Сообщение # 4 |  |   | По такому принципу работает:
 
 Код new String:s[] = "abcd";PrintToServer(s[0]); // "abcd"
 PrintToServer(s[1]); // "bcd"
 PrintToServer(s[2]); // "cd"
 PrintToServer(s[3]); // "d"
Но так работает только с ascii символами, если это другой (который занимает больше места), то выдаст вопросительные знаки (как-бы неизвестный символ).
 Ниже пример кода, который может определять эту "ширину" каждого символа, благодаря чему можем узнать верный индекс.
 
 
 Код public OnPluginStart(){
 new String:s[] = "✔Fб-♦`~▲#";
 new max = strlen(s);
 new i, bytes;
 while (i < max)
 {
 PrintToServer(s[i]);
 i += (bytes = IsCharMB(s[i])) > 0 ? bytes : 1;
 }
 }
Ну и для эффекта бегущей строки вправо добавляются пробелы.
 
 
 Цитата tonline_kms65 (  )  И кстати, а зачем msg улучшать, чем плохо копирование всей строки? Нет дополнительных ф-ий разбиения, поиска, и т.д.Ну это смотря как часто вызывается код, постоянное выделение памяти как-бы не очень хорошо.
 Например, можно сохранить строку и индекс в глоб вар и просто редактировать индекс и выводить ГлобСтрока[ГлобИндекс] ничего не копируя.
 Ну это уже тонкости оптимизации, кому как =)
 |  |  |  |  |