Создание бликов и теней в ActionScript 3

Кто-нибудь знает, как создать два новых цвета (свет и тень) на основе одного цвета в ActionScript 3? Итак, если у меня есть красный (0xFF0000), я также получу светло-красный и темно-красный?

Понятия не имею. Спасибо!

Короче говоря, вам нужно преобразовать цвет в HSL, изменить яркость/насыщенность, а затем преобразовать обратно в RGB. Все рецепты доступны через поиск.

Vesper 17.03.2022 12:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы получить Выделять (легкость), вы увеличиваете каждый R, G и B одинаково на одинаковую величину (с максимумом на 255 или 0xFF). В вашем случае красный уже находится на максимуме, поэтому увеличьте и зеленый, и синий на одинаковую величину (например сделайте += 128 на каждом из этих каналов).

Чтобы получить Тень (темнота), вы уменьшаете каждый R, G и B одинаково на одинаковую величину (с минимумом в 0 или 0x00). В вашем случае и зеленый, и синий уже находятся на минимуме, поэтому просто уменьшите только красный на величину Икс (например сделайте -= 128 на красном канале).

Короче:
Введите = 0xFF0000 ... затем Подсветка = 0xFF8080 и Тень = 0x800000.

Обновлять:
В комментариях было сделано хорошее замечание о случаях выделения/тени других цветов (или оттенков). Если мы согласимся с тем, что «светлее» означает добавление большего количества белого, а «темнее» означает добавление большего количества черного, то, возможно, вам может помочь линейная интерполяция (в основном сделайте градиент входного цвета, затухающий к черному или к белому, и выберите предпочитаемый более темный/светлый цвет вдоль эти пути от А до Б...

PS: с помощью интерполяции у вас будет возможность смешивать различные оттенки и оттенки светлоты/темноты. Можете смешать от ярко-красного к более темному красновато-фиолетовому (вместо черного) для получения более «сладких» оттенков, а у зелени могут быть желтые блики (вместо белого). Синий зависит от вас.

пример использования:

var newColour :uint = 0;
newColour = blendRGB_AS3 (0xFF0000, 0xFFFFFF, 0.5) //# get 50% white added
newColour = blendRGB_AS3 (0xFF0000, 0x000000, 0.5) //# get 50% black added

Пример функции:
(примечание: (temp_int >> 0) используется здесь как быстрый Math.Floor для любых дробных результатов)

//# function inputs: src_C, dest_C, stopPoint ... where:
//# src_C = source / start colour A (as 0xRGB)
//# dest_C = destination / end colour B (as 0xRGB)
//# stopPoint = A-to-B stopping point (as ranging from 0.0 to 1.0)

function blendRGB_AS3 (src_C, dest_C, stopPoint ) :uint
{
    //# using Unsigned INTegers since no need of the minus ( - ) sign.
    var temp_int :uint = 0; var res_C :uint = 0;
    
    var src_R :uint = (src_C >> 16 & 0xFF);
    var src_G :uint = (src_C >> 8 & 0xFF);
    var src_B :uint = (src_C >> 0 & 0xFF);
    
    var dst_R :uint = (dest_C >> 16 & 0xFF);
    var dst_G :uint = (dest_C >> 8 & 0xFF);
    var dst_B :uint = (dest_C >> 0 & 0xFF);
    
    //# Now for each R, G, B Channel... 
    //# calculate the mid-point value then merge that into output of "res_C"
    
    //# for Red
    temp_int = src_R + stopPoint * (dst_R - src_R);
    res_C = ( (temp_int >> 0) << 16);
    
    //# for Green
    temp_int = src_G + stopPoint * (dst_G - src_G);
    res_C |= ( (temp_int >> 0)  << 8);
    
    //# for Blue
    temp_int = src_B + stopPoint * (dst_B - src_B);
    res_C |= ( (temp_int >> 0)  << 0);
    
    return res_C; //# gives: example 0xFF0000 if red
    
}

Это хорошо работает с чистым RGB, но не со смесью. Допустим, введено значение 0xFF8000, освещение даст FFFF80 (светло-желтый), а тень даст 0x800000 (темно-красный).

Vesper 24.03.2022 08:10

Другие вопросы по теме