PDA

Просмотр полной версии : [Вопрос] Макросы цветов.



Alexey_Nikiforov
18.02.2016, 21:39
Всем доброго вечера суток.
Назрел вопрос.
Как создать универсальные макросы для цветов.
Что бы их можно было использовать везде.
Пример обычного красного цвета.

#define COLOR_RED 0xFF0000AA
Где 0x указывает систему исчисления.
FF0000 - это у нас цвет в HEX
AA - прозрачность цвета от 00 до FF

Это макрос отлично подойдет для отправки цветного текста в чат:

SendClientMessage(playerid, COLOR_RED, "Красный текст");

Хорошо но как быть если нам надо сделать его разноцветным:

SendClientMessage(playerid, COLOR_RED, "Welcome to {00FF00}M{FFFFFF}a{FF0000}r{FFFFFF}c{00FF00}o{FFFFFF}'{FF0000}s {FFFFFF}B{00FF00}i{FFFFFF}s{FF0000}t{FFFFFF}r{00FF00}o{FFFFFF}!");

Это жутко не удобно.
Сделаем макрос:

#define COLOR_RED {FF0000}

Теперь наши макросы будут конфликтовать.
Как же так сделать что бы нам было удобно работать и сообщениях и при создании текст дравов.

TextDrawColor(Textdraw0, COLOR_WHITE); тут еще более менее удобно использовать макросы.

TextDrawBackgroundColor(Textdraw0, COLOR_SILVER); а вот тут где требуется настройка прозрачности уже сложнее.

Желательно бы сделать что бы прибавлять нужную прозрачность в ручную. к примеру.

#define COLOR_RED 0xFF0000
TextDrawBackgroundColor(Textdraw0, COLOR_SILVER+35);

Как так сделать кто подскажет?

ziggi
18.02.2016, 21:48
TextDrawBackgroundColor(Textdraw0, COLOR_SILVER << 0xFF + 35);

Alexey_Nikiforov
18.02.2016, 21:53
А если надо:


TextDrawBackgroundColor(Textdraw0, COLOR_SILVER+AA);

p.s. Проверил не работает:

TextDrawBackgroundColor(Textdraw0, COLOR_SILVER << 0xFF + 35);

ziggi
18.02.2016, 22:41
Ой, то есть так:


TextDrawBackgroundColor(Textdraw0, COLOR_SILVER << 2 + 0xAA);

Alexey_Nikiforov
18.02.2016, 23:37
Ой, то есть так:


TextDrawBackgroundColor(Textdraw0, COLOR_SILVER << 2 + 0xAA);

Как это работает хоть бы объяснил бы.

ziggi
19.02.2016, 00:34
Как это работает хоть бы объяснил бы.

<< - побитовый оператор, ищи уроки по ним.

Alexey_Nikiforov
19.02.2016, 07:58
<< - побитовый оператор, ищи уроки по ним.
Вот что их искать когда можешь сказать они у меня есть в блоге, не какой саморекламы. :smile:
http://ziggi.org/pawn-pobitovye-operatory/

И еще вопрос в примерах не нашел.
Уместно применять сложение при таком действие:

TextDrawBackgroundColor(Textdraw0, COLOR_SILVER << 2 + 0xAA);

Или лучше просто назначить нужное значение:

TextDrawBackgroundColor(Textdraw0, COLOR_SILVER << 2 =0xAA);

В уроке просто не чего не сказано про: умножение, деление, сложение, вычитание битов.
По этому и спрашиваю.

p.s. Это не работает записал вот так:

TextDrawBackgroundColor(Textdraw0, 0x00000035);
TextDrawBackgroundColor(Textdraw1, 0x00000000 << 2 + 0x35);
Тут (0x00000035 != 0x00000000 << 2 + 0x35)
Так что что то ты не правильно опять написал.

BadPawn
19.02.2016, 08:16
<< - побитовый оператор, ищи уроки по ним.

Скинь ссылку на свой блог, не стесняйся. Там помнится мне имеется такое :)))))

Alexey_Nikiforov
19.02.2016, 10:29
Вот что их искать когда можешь сказать они у меня есть в блоге, не какой саморекламы. :smile:
http://ziggi.org/pawn-pobitovye-operatory/


Я давал ссылку постом выше.

ziggi
19.02.2016, 11:12
Что-то я совсем поплыл...


COLOR_RED << 8 | 0xAA

или так:


(COLOR_RED << 8) + 0xAA

MacMailler
19.02.2016, 12:59
#define COLOR_RED 0xFF0000AA
Где 0x указывает систему исчисления.
FF0000 - это у нас цвет в HEX
AA - прозрачность цвета от 00 до FF

Это макрос отлично подойдет для отправки цветного текста в чат:

SendClientMessage(playerid, COLOR_RED, "Красный текст");

Хорошо но как быть если нам надо сделать его разноцветным:

SendClientMessage(playerid, COLOR_RED, "Welcome to {00FF00}M{FFFFFF}a{FF0000}r{FFFFFF}c{00FF00}o{FFFFFF}'{FF0000}s {FFFFFF}B{00FF00}i{FFFFFF}s{FF0000}t{FFFFFF}r{00FF00}o{FFFFFF}!");


Юзай format.


new temp[24];
format(temp, sizeof(temp), "{%06x}COLOR!", COLOR_RED >>> 8);
SendClientMessage(playerid, 0xFF, temp);

Alexey_Nikiforov
19.02.2016, 13:41
Юзай format.


new temp[24];
format(temp, sizeof(temp), "{%06x}COLOR!", COLOR_RED >>> 8);
SendClientMessage(playerid, 0xFF, temp);

Выглядет так как надеть штаны через голову.

- - - Добавлено - - -


Что-то я совсем поплыл...


COLOR_RED << 8 | 0xAA

или так:


(COLOR_RED << 8) + 0xAA


Не работают эти способы.
Прокрути еще раз задачу в голове.
Надо что бы:

0x000000FF
Превратилось в:

0x00000035

Включай магическую фантазию.:rofl:
з.ы. во на писал.

MacMailler
19.02.2016, 13:54
Выглядет так как надеть штаны через голову.
Тогда делай два варианта макроса.



Надо что бы:

0x000000FF
Превратилось в:

0x00000035

(color & 0xFFFFFF00) | 0x35

Alexey_Nikiforov
19.02.2016, 15:26
Тогда делай два варианта макроса.

(color & 0xFFFFFF00) | 0x35
Еще веселее.
Вы в курсе что такое шестнадцатеричная система.
Если делать столько макросов это выйдет примерно на 40к кода.:lol:

MacMailler
19.02.2016, 15:51
Еще веселее.
Вы в курсе что такое шестнадцатеричная система.
Если делать столько макросов это выйдет примерно на 40к кода.:lol:

Лол, это просто пример. Вот универсальный вариант.


#define setAlpha(%0,%1) ((%0 & 0xFFFFFF00) | %1)


Использование


TextDrawColor(Textdraw0, setAlpha(COLOR_WHITE, 0x35));

Alexey_Nikiforov
19.02.2016, 16:04
Если в базе иметь 150 цветов.
+ создание доп макросов сколько их должно выйти.
Мне надо для всех цветов.
А не для каждого создавать макрос.

Или я что то не могу догнать...

MacMailler
19.02.2016, 19:55
Если в базе иметь 150 цветов.
+ создание доп макросов сколько их должно выйти.
Мне надо для всех цветов.
А не для каждого создавать макрос.

Или я что то не могу догнать...

Создаешь всего одину макрос-функцию и юзаешь там где надо. Макросов цветов может быть сколько угодно.

Alexey_Nikiforov
19.02.2016, 20:05
Огромное спасибо.
А может есть идеи как сделать что бы юзать в тексте?
{EE5555}

MacMailler
19.02.2016, 22:54
Придумал другой вариант.

Определяем цвета таким образом


#define COLOR_RED<%0> %0FF0000
#define COLOR_GREEN<%0> %000FF00
#define COLOR_BLUE<%0> %00000FF
#define COLOR_WHITE<%0> %0FFFFFF


Если нужен цвет с альфа-каналом


// AA - нужный альфа-канал, от 00 до FF
TextDrawColor(TdRed, COLOR_RED<0x>AA);
TextDrawColor(TdGreen, COLOR_GREEN<0x>AA);
TextDrawColor(TdBlue, COLOR_BLUE<0x>AA);


Красим слова в разные цвета


SendClientMessage(playerid, COLOR_WHITE<0x>, "{"#COLOR_RED<>"}RED{"#COLOR_GREEN<>"}GREEN{"#COLOR_BLUE<>"}BLUE");

Alexey_Nikiforov
20.02.2016, 11:06
Придумал другой вариант.

Определяем цвета таким образом


#define COLOR_RED<%0> %0FF0000
#define COLOR_GREEN<%0> %000FF00
#define COLOR_BLUE<%0> %00000FF
#define COLOR_WHITE<%0> %0FFFFFF


Если нужен цвет с альфа-каналом


// AA - нужный альфа-канал, от 00 до FF
TextDrawColor(TdRed, COLOR_RED<0x>AA);
TextDrawColor(TdGreen, COLOR_GREEN<0x>AA);
TextDrawColor(TdBlue, COLOR_BLUE<0x>AA);


Красим слова в разные цвета


SendClientMessage(playerid, COLOR_WHITE<0x>, "{"#COLOR_RED<>"}RED{"#COLOR_GREEN<>"}GREEN{"#COLOR_BLUE<>"}BLUE");

Все круто но все равно сложновато выходит когда цветной текст:

{"#COLOR_RED<>"}

И тут бы от префикса "<0x>" отказаться:

COLOR_WHITE<0x>
Вообще бы цены не было.

MacMailler
20.02.2016, 16:43
Все круто но все равно сложновато выходит когда цветной текст:

{"#COLOR_RED<>"}

И тут бы от префикса "<0x>" отказаться:

COLOR_WHITE<0x>
Вообще бы цены не было.

Проще уже некуда.

Alexey_Nikiforov
28.02.2016, 02:36
Проще уже некуда.
Проверил не работает второй способ.