2016-10-16 3 views
0

Я хочу, чтобы фон в Java-приложении цикла через все цвета спектра плавно. Я решил использовать целые числа, чтобы определить цвета, чтобы я мог добавить 1 к нему каждый раз, когда он красит цвет. Проблема каждый раз, когда я добавляю 1, она проходит только через синие оттенки. Любая помощь?Java int - цвет только синий?

package Snake; 

import javax.swing.*; 
import java.awt.*; 

/** 
* Created by Alex **** on 02/10/2016. 
*/ 
public class RenderPanel extends JPanel{ 
    public int curColor = 0; 
// @Override 
    protected void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.setColor(new Color(curColor)); 
     g.fillRect(0, 0, 800, 700); 
     curColor++; 
    } 
} 
+0

Вы не получите спектр путем добавления 1 к цвету повторно. Вы должны перебирать значения Hue в пространстве HSL и преобразовывать их в RGB. –

ответ

2

Ваш занавес цвет должен двигаться от черного до синего, а затем от черного с невидимым немного зеленого до синего с невидимым немного зеленого.

После 255 прогулок от первого черного до синего цвета он будет зеленым до голубого.

Красный делает один шаг вверх каждый 65536 синих шагов. В общей сложности потребуется около 16,7 миллионов синих шагов, то есть более 65000 зеленых шагов, чтобы перейти от черного к белому :)

Это не синий цвет. Это просто медленно :)

+0

Спасибо за этот ответ, но есть ли у вас какие-либо идеи о том, как я могу это исправить? – AlexZeCoder

+0

Изменение шага приращения. Вы можете добиться почти того же результата, добавив '10' вместо' 1'. –

+0

Я рекомендую размер шага, потому что 17 * 15 - 255, поэтому вы попадаете в ровно синий, затем голубой, затем в конечном итоге белый :) – yeoman

2

RGB-INT Цвет строится так из битов (последние три байта):

RRRRRRRR GGGGGGGG BBBBBBBB

Как вы можете видеть:

синий байт при размещении 0 - 7 бит целого числа.

зеленый байт находится в положении 8 - 15 бит целого числа.

красный байт находится в положении 16-23 бита целого числа.

если вы добавляете 1, то в основном только добавить 1 к синему, добавить 1 к зеленому вам нужно добавить 256 и добавить 1 к красному вам нужно добавить 65536.

Это просто как бинарная works - номер int один, но используется как три байта, каждый байт для каждой части цвета RGB.

Ваш код в конечном итоге пройдет сквозь все оттенки всех цветов, но я думаю, что вы хотите иметь эффект от мигающих цветов. В этом случае используйте пространство HSB .

Таким образом, вам не нужны все оттенки всех цветов, но только некоторые типичные цвета для определенного уровня яркости и насыщенности. В этом случае создайте свой цвет, используя приведенный ниже метод, входы находятся в диапазоне от 0.0 до 1.0 float, часть, отвечающая за цвет, - это параметр hue (h).

Color.getHSBColor(h, s, b) 

Так это может быть:

package Snake; 

import javax.swing.*; 
import java.awt.*; 

/** 
* Created by Alex **** on 02/10/2016. 
*/ 
public class RenderPanel extends JPanel{ 
    public int curColor = 0; 
// @Override 
    protected void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.setColor(Color.getHSBColor((curColor%256)/256f, 0.5f, 0.5f)); 
     g.fillRect(0, 0, 800, 700); 
     curColor++; 
    } 
} 
+0

Ты король! – AlexZeCoder

+0

Добро пожаловать. Помните, чтобы принять/отложить ответ, если это вам помогло. –

Смежные вопросы