Бегущая строка
| |
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 улучшать, чем плохо копирование всей строки? Нет дополнительных ф-ий разбиения, поиска, и т.д. Ну это смотря как часто вызывается код, постоянное выделение памяти как-бы не очень хорошо. Например, можно сохранить строку и индекс в глоб вар и просто редактировать индекс и выводить ГлобСтрока[ГлобИндекс] ничего не копируя. Ну это уже тонкости оптимизации, кому как =)
|
|
| |
tonline_kms65
|
Дата: Вторник, 24.12.2019, 18:23:09 | Сообщение # 5 |
|
Сообщений: 215
Репутация: 3 [ +/- ]
|
|
Ок. Я думал ты просто сдвигаешь всю строку, полностью, т.е. нарисовал, стер, на измененные координаты снова нарисовал строку и т.д. Из этого соображения я и подходил. Оказывается у тебя другой принцип. Интересно. g_CurrentIndex это получается, как-бы, порядковый номер цифры в строке. Я то думал это координата положения всей строки.
Нужно мысли тогда в своей башке перестроить. Вообще все неправильно думал.Добавлено (31.12.2019, 04:29:59) --------------------------------------------- Сколько пересмотрел кодов бегущей строки(в основном js), везде сдвигают строкой, а твой вариант очень интересен, но я до сих пор не могу сообразить как он работает.
Сам принцип я понял, а вот код не могу понять. Сегодня время будет, посижу, по соображаю.
Сообщение отредактировал tonline_kms65 - Вторник, 24.12.2019, 18:33:26 |
|
| |
|