Войти
ПрограммированиеФорумГрафика

Плавное изменение цвета(рендомное)(РЕШЕНО)

Страницы: 1 2 Следующая »
#0
(Правка: 19:18) 19:06, 29 авг. 2021

Все здравствуйте.
Хотелось бы узнать, есть код на плавное изменение цветов, причем что бы изменение происходило хаотично. Я написал код, но этот код у меня получается какой-то громоздкий, мне не очень он нравится.
Может быть есть какой нибудь универсальный алгоритм? Цвета в RGBA, хотя это не существенно.

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры


#1
23:41, 29 авг. 2021

Эм, линейно интерполировать между предыдущим цветом и новым, рандомным?

#2
(Правка: 5:23) 5:22, 30 авг. 2021

nes
> Эм, линейно интерполировать между предыдущим цветом и новым, рандомным?

Да.
Например - рендомно выпали красный и синий цвета, значит плавный переход между ними, например в 255 шагов(в RGB), ну и так далее. В моём коде такое конечно можно задать, но код громоздкий получается.
Возможно есть и другие методы таких переливов цветов, не обязательно от заданных.

#3
(Правка: 6:05) 6:04, 30 авг. 2021

любой анимированный шейдер предполагает передачу времени т через буфер. а как превратить эту т в компоненту цвета уже дело фантазии. и по обычаю синус для колебания 0 -1

#4
10:47, 30 авг. 2021

tonline_kms65
делай в HSV и гоняй по кругу

#5
11:55, 30 авг. 2021

ИПавлов
> и по обычаю синус для колебания 0 -1

Поподробнее бы, если можно. Что-то  интересное.

#6
12:02, 30 авг. 2021

Misanthrope
> делай в HSV и гоняй по кругу

Тоже подробнее бы, а то вообще не пойму о чем.

#7
12:10, 30 авг. 2021

>Я написал код, но этот код у меня получается какой-то громоздкий, мне не очень он нравится.

Если код не тормозной и не глючный, то спрячь его в функцию и не парься. Не думай, что красивая короткая формула после компиляции будет гарантированно легче для железа.

#8
(Правка: 12:22) 12:13, 30 авг. 2021

Skvoznjak
> Не думай, что красивая короткая формула после компиляции будет гарантированно
> легче для железа.

Это и так отдельная фу-ия, я её вызываю по необходимости(когда бомба валяется на земле)
Главное что-бы мне было понятно, а то когда много "букАвак" все начинает сливаться в голове.
А если к этому коду вернуться, например через месяц, то вообще ничего не поймешь.

#9
12:39, 30 авг. 2021

tonline_kms65
> Главное что-бы мне было понятно, а то когда много "букАвак" все начинает
> сливаться в голове.
> А если к этому коду вернуться, например через месяц, то вообще ничего не
> поймешь.
Так нужно писать, чтобы сразу было понятно.
Вот я на бейсике по быстрому написал:

Private Type RGB
  R As Integer
  G As Integer
  B As Integer
End Type

Dim C1 As RGB, C2 As RGB

Private Sub Timer1_Timer()
  If (C1.R = C2.R) And (C1.G = C2.G) And (C1.B = C2.B) Then
    C2.R = Rnd * 255
    C2.G = Rnd * 255
    C2.B = Rnd * 255
  Else
    C1.R = C1.R + Sgn(C2.R - C1.R)
    C1.G = C1.G + Sgn(C2.G - C1.G)
    C1.B = C1.B + Sgn(C2.B - C1.B)
    BackColor = RGB(C1.R, C1.G, C1.B)
  End If
End Sub
Если что, Sgn() - это функция, возвращающая -1 для отрицательных, 1 для положительных и 0 для нуля.
Вот результат: RandColor
#10
13:37, 30 авг. 2021

на шейдертое пустой код нового шейдера делает то, что тебе нужно https://www.shadertoy.com/new

#11
14:01, 30 авг. 2021

Mikle
> Sgn()

Это внутренняя (бейсиковская) функция? Или твоя?
Чем её заменить можно, это что-то типа массива по суммированию отрицательных, положительных и нулей?
Хоть снова на бейсик переходи.


А ведь начинал с бейсика еще в 1998 году, базы данных, складские программы для барыг, уже ничего и не помню, обалдеть.

#12
14:11, 30 авг. 2021

А всё! Понял!
Это функция, которая выдаёт результат в виде 1,  -1 или 0, независимо от количества цифЕрок в задании, например:
если -100 +2 = -98 значит вернет -1
если 100 + 2 = 102            вернёт 1
если -100 + 100 = 0          вернёт 0
Думаю я понял правильно?
Она ничего не суммирует, вернее производит действия но результат только в виде значения(отрицательное, положительное или просто ноль).

#13
14:29, 30 авг. 2021

tonline_kms65
Верно, это встроенная в VB6 функция. На Си это будет как-то так:

int Sgn(int v)
  {
    if (v>0)
      return 1;
    else if (v<0)
      return -1;
    else
      return 0;
  }
#14
(Правка: 18:12) 18:07, 30 авг. 2021

Не могу понять работу твоего кода, где у меня косяк, в чём?

(таймер работает пока ent жива.)

public Action OverflowLife(Handle:timer, any:ent) {
  if(!IsValidEntity(ent) || !IsValidEdict(ent)) return Plugin_Stop;

    static int Color1[3]=0; 
    int Color2[3];
      
    if((Color1[0] = Color2[0]) && (Color1[1] = Color2[1]) && (Color1[2] = Color2[2])) {
    Color2[0] = GetRandomInt(0, 255);
    Color2[1] = GetRandomInt(0, 255);
    Color2[2] = GetRandomInt(0, 255);
        PrintToConsoleAll("2 ->%i %i %i", Color2[0], Color2[1], Color2[2]); //блок не работает вообще
  } else {
    Color1[0] += Sgn(Color2[0] - Color1[0]);
    Color1[1] += Sgn(Color2[1] - Color1[1]);
    Color1[2] += Sgn(Color2[2] - Color1[2]);
        PrintToConsoleAll("1 ->%i %i %i", Color1[0], Color1[1], Color1[2]);//блок выдаёт нули
  }
  return Plugin_Continue;
}

Неправильно переменные объявляю что-ли, не соображу.

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика