Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Бегущая строка
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
 
  • Страница 1 из 1
  • 1
Поиск: