在基本 Java 动画中更改颜色
Changing the color in basic Java animation
我正在处理 Java 中的图形(特别是通过 Swing 和 AWT 库),想在屏幕上移动一个圆圈(画线)并设置 x
或y
当直线到达 canvas 的边界时,坐标回到 0。我对这部分代码没有问题。
但是,现在我正在尝试在坐标均为 0(使用 super.paint(Graphics)
)时清除屏幕并更改颜色。屏幕清除工作正常,但我无法更改颜色。看起来,当坐标均为 0 时,指定颜色的椭圆出现 在 在 (0, 0) 位置形成的条纹下方。但是,我希望条纹的颜色在坐标重置为 (0, 0) 之前改变颜色。
这是我的代码:
@SuppressWarnings("serial")
public class Game extends JPanel
{
static final int SCREEN_X = 300;
static final int SCREEN_Y = 400;
int x = 0;
int y = 0;
private void moveBall()
{
x += 1;
y += 1;
if (x >= SCREEN_X) x = 0;
if (y >= SCREEN_Y) y = 0;
}
@Override
public void paint(Graphics g)
{
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
if (x == 0 && y == 0)
{
super.paint(g);
// Generate random value in [0, 5)
int rand_val = (new Random()).nextInt(5);
// Init random color variable
Color rand_color = Color.black;
// Pick a random color
switch (rand_val)
{
case 0:
rand_color = Color.black;
break;
case 1:
rand_color = Color.red;
break;
case 2:
rand_color = Color.green;
break;
case 3:
rand_color = Color.blue;
break;
case 4:
rand_color = Color.gray;
break;
}
// I'm assuming I need to do something more here?
// This is likely where my mistake is...
g2d.setColor(rand_color);
}
g2d.fillOval(x, y, 30, 30);
}
public static void main(String[] args) throws InterruptedException
{
JFrame frame = new JFrame("Mini Tennis");
Game game = new Game();
frame.add(game);
frame.setSize(SCREEN_X, SCREEN_Y);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
while (true)
{
game.moveBall();
game.repaint();
Thread.sleep(10);
}
}
}
// I'm assuming I need to do something more here?
// This is likely where my mistake is...
g2d.setColor(rand_color);
用于此绘画的 Graphics2D
实例即将被处置。现在改变颜色不好。
改为更改组件 (JPanel
) 本身的 BG 或 FG 颜色,然后在每次绘制之前设置图形对象的颜色。
注意更改和评论:
public class Game extends JPanel
{
static final int SCREEN_X = 300;
static final int SCREEN_Y = 400;
int x = 0;
int y = 0;
private void moveBall()
{
x += 1;
y += 1;
if (x >= SCREEN_X) {
x = 0;
}
if (y >= SCREEN_Y) {
y = 0;
}
}
@Override
public void paintComponent(Graphics g) { //for custom painting override paint componenet
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
if (x == 0 && y == 0)
{
// Generate random value in [0, 5)
int rand_val = new Random().nextInt(5);
// Init random color variable
Color rand_color = Color.black;
// Pick a random color
switch (rand_val)
{
case 0:
rand_color = Color.black;
break;
case 1:
rand_color = Color.red;
break;
case 2:
rand_color = Color.green;
break;
case 3:
rand_color = Color.blue;
break;
case 4:
rand_color = Color.gray;
break;
}
g2d.setColor(rand_color);
g2d.fillRect(0, 0, getWidth(), getHeight()); //clear screen
}
g2d.fillOval(x, y, 30, 30);
}
旁注:您可以定义颜色数组:
private final Color[] colors = {Color.black, Color.red, Color.green, Color.blue, Color.gray};
为了让代码更简洁:
@Override
public void paintComponent(Graphics g) { //for custom painting override paint componenet
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
if (x == 0 && y == 0)
{
int rand_val = new Random().nextInt(colors.length);
Color rand_color = colors[rand_val];
g2d.setColor(rand_color);
g2d.fillRect(0, 0, getWidth(), getHeight()); //clear screen
}
g2d.fillOval(x, y, 30, 30);
}
我正在处理 Java 中的图形(特别是通过 Swing 和 AWT 库),想在屏幕上移动一个圆圈(画线)并设置 x
或y
当直线到达 canvas 的边界时,坐标回到 0。我对这部分代码没有问题。
但是,现在我正在尝试在坐标均为 0(使用 super.paint(Graphics)
)时清除屏幕并更改颜色。屏幕清除工作正常,但我无法更改颜色。看起来,当坐标均为 0 时,指定颜色的椭圆出现 在 在 (0, 0) 位置形成的条纹下方。但是,我希望条纹的颜色在坐标重置为 (0, 0) 之前改变颜色。
这是我的代码:
@SuppressWarnings("serial")
public class Game extends JPanel
{
static final int SCREEN_X = 300;
static final int SCREEN_Y = 400;
int x = 0;
int y = 0;
private void moveBall()
{
x += 1;
y += 1;
if (x >= SCREEN_X) x = 0;
if (y >= SCREEN_Y) y = 0;
}
@Override
public void paint(Graphics g)
{
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
if (x == 0 && y == 0)
{
super.paint(g);
// Generate random value in [0, 5)
int rand_val = (new Random()).nextInt(5);
// Init random color variable
Color rand_color = Color.black;
// Pick a random color
switch (rand_val)
{
case 0:
rand_color = Color.black;
break;
case 1:
rand_color = Color.red;
break;
case 2:
rand_color = Color.green;
break;
case 3:
rand_color = Color.blue;
break;
case 4:
rand_color = Color.gray;
break;
}
// I'm assuming I need to do something more here?
// This is likely where my mistake is...
g2d.setColor(rand_color);
}
g2d.fillOval(x, y, 30, 30);
}
public static void main(String[] args) throws InterruptedException
{
JFrame frame = new JFrame("Mini Tennis");
Game game = new Game();
frame.add(game);
frame.setSize(SCREEN_X, SCREEN_Y);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
while (true)
{
game.moveBall();
game.repaint();
Thread.sleep(10);
}
}
}
// I'm assuming I need to do something more here?
// This is likely where my mistake is...
g2d.setColor(rand_color);
用于此绘画的 Graphics2D
实例即将被处置。现在改变颜色不好。
改为更改组件 (JPanel
) 本身的 BG 或 FG 颜色,然后在每次绘制之前设置图形对象的颜色。
注意更改和评论:
public class Game extends JPanel
{
static final int SCREEN_X = 300;
static final int SCREEN_Y = 400;
int x = 0;
int y = 0;
private void moveBall()
{
x += 1;
y += 1;
if (x >= SCREEN_X) {
x = 0;
}
if (y >= SCREEN_Y) {
y = 0;
}
}
@Override
public void paintComponent(Graphics g) { //for custom painting override paint componenet
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
if (x == 0 && y == 0)
{
// Generate random value in [0, 5)
int rand_val = new Random().nextInt(5);
// Init random color variable
Color rand_color = Color.black;
// Pick a random color
switch (rand_val)
{
case 0:
rand_color = Color.black;
break;
case 1:
rand_color = Color.red;
break;
case 2:
rand_color = Color.green;
break;
case 3:
rand_color = Color.blue;
break;
case 4:
rand_color = Color.gray;
break;
}
g2d.setColor(rand_color);
g2d.fillRect(0, 0, getWidth(), getHeight()); //clear screen
}
g2d.fillOval(x, y, 30, 30);
}
旁注:您可以定义颜色数组:
private final Color[] colors = {Color.black, Color.red, Color.green, Color.blue, Color.gray};
为了让代码更简洁:
@Override
public void paintComponent(Graphics g) { //for custom painting override paint componenet
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
if (x == 0 && y == 0)
{
int rand_val = new Random().nextInt(colors.length);
Color rand_color = colors[rand_val];
g2d.setColor(rand_color);
g2d.fillRect(0, 0, getWidth(), getHeight()); //clear screen
}
g2d.fillOval(x, y, 30, 30);
}