PDA

Просмотр полной версии : [Вопрос] Вопрос на счет цветов RGB



Salik_Davince
14.04.2019, 18:10
Здравствуйте, имеется такой вопрос на счет fade-color-ов которые использует реализация ProxDetector (от Ziggi) -



stock ProxDetector(playerid, Float:max_range, color, string[], Float:max_ratio = 1.6)//thx to ziggy (chutka podredaktirovan)
{

if(Iter_Count(streamed_players[playerid]) == 0) return true;

new
Float:pos_x,
Float:pos_y,
Float:pos_z,
Float:range,
Float:range_ratio,
Float:range_with_ratio,
clr_r, clr_g, clr_b,
Float:color_r, Float:color_g, Float:color_b;

if (!GetPlayerPos(playerid, pos_x, pos_y, pos_z)) {
return 0;
}

SendClientMessage(playerid, color, string);

color_r = float(color >> 24 & 0xFF);
color_g = float(color >> 16 & 0xFF);
color_b = float(color >> 8 & 0xFF);
range_with_ratio = max_range * max_ratio;

foreach(new i : streamed_players[playerid]) {



range = GetPlayerDistanceFromPoint(i, pos_x, pos_y, pos_z);
if (range > max_range) {
continue;
}

range_ratio = (range_with_ratio - range) / range_with_ratio;
clr_r = floatround(range_ratio * color_r);
clr_g = floatround(range_ratio * color_g);
clr_b = floatround(range_ratio * color_b);

SendClientMessage(i, (color & 0xFF) | (clr_b << 8) | (clr_g << 16) | (clr_r << 24), string);
}
return 1;
}


В данной реализации берется color и в зависимости от расстояния идет fade, но в примере если я сделаю такой формат -


format(t_string, sizeof(t_string), "%s {ffffff}say: %s", Player[playerid][name], text);
ProxDetector(playerid, 25.0, GetPlayerColor(playerid), t_string);


То будется фейдиться только первый колор (указываемый в параметре color) но не RGB в скобках.
Возник вопрос, как же сделать реализацию и проверки на RGBA не стандартный (который указывается в параметре) а поиска RGB в скобках и их фейда (можно сделать другой параметр), либо фейда полностью и колора RGB в скобках, сам бы сделал, но в голову идут только НЕдо реализации и то могут работать не корректно...

Проверку на if - else на дистанцию и фейд тоже не вариант.

Daniel_Cortez
14.04.2019, 18:49
С учётом того, что ProxDetector затемняет цвет индивидуально для каждого игрока в зависимости от расстояния, логичнее всего сделать затемнение цветов в тексте внутри той функции, т.е.:
Добавить в функцию буфер для копии текста.
new buffer[144 + 1];
В этот буфер копировать указанный текст.
Отыскивать в тексте (в копии) цветовые последовательности, начинающиеся на "{", считывать их в переменную, затемнять по тому же алгоритму, который уже есть в ProxDetector, и записывать обратно в копию текста (собственно, для того и нужна копия, чтобы не изменять цвета в оригинале текста).

Другой вопрос, стоит ли того потраченное на реализацию время и увеличившаяся нагрузка от функции. Я бы на вашем месте отказался либо от цветовых последовательностей в тексте, либо от ProxDetector (для данного случая, не в общем смысле).