在基本Java动画中更改颜色
我正在用Java处理图形(特别是通过Swing和AWT libs),希望在屏幕上移动一个圆圈(生成线条),并在线条到达画布边界时将在基本Java动画中更改颜色,java,swing,loops,animation,awt,Java,Swing,Loops,Animation,Awt,我正在用Java处理图形(特别是通过Swing和AWT libs),希望在屏幕上移动一个圆圈(生成线条),并在线条到达画布边界时将x或y坐标设置回0。我对这部分代码没有问题 但是,现在我尝试在坐标都为0时清除屏幕(使用super.paint(Graphics))并更改颜色。屏幕清理工作正常,但我不能改变颜色。看起来,当坐标都为0时,在(0,0)位置所做的条纹下会出现指定颜色的椭圆形。一、 但是,希望条纹的颜色更改颜色,直到坐标重置为(0,0) 这是我的密码: @SuppressWarnings(
x
或y
坐标设置回0。我对这部分代码没有问题
但是,现在我尝试在坐标都为0时清除屏幕(使用super.paint(Graphics)
)并更改颜色。屏幕清理工作正常,但我不能改变颜色。看起来,当坐标都为0时,在(0,0)位置所做的条纹下会出现指定颜色的椭圆形。一、 但是,希望条纹的颜色更改颜色,直到坐标重置为(0,0)
这是我的密码:
@SuppressWarnings(“串行”)
公共类游戏扩展JPanel
{
静态最终整数屏幕_X=300;
静态最终整数屏幕_Y=400;
int x=0;
int y=0;
私有void moveBall()
{
x+=1;
y+=1;
如果(x>=屏幕x)x=0;
如果(y>=屏幕y)y=0;
}
@凌驾
公共空间涂料(图g)
{
Graphics2D g2d=(Graphics2D)g;
g2d.setRenderingHint(renderingHits.KEY\u抗锯齿,renderingHits.VALUE\u抗锯齿\u开启);
如果(x==0&&y==0)
{
超级油漆(g);
//在[0,5]中生成随机值
int rand_val=(new Random()).nextInt(5);
//Init随机颜色变量
颜色rand_Color=Color.black;
//随意挑选一种颜色
开关(随机值)
{
案例0:
兰德颜色=颜色。黑色;
打破
案例1:
rand_color=color.red;
打破
案例2:
rand_color=color.green;
打破
案例3:
蓝颜色=color.blue;
打破
案例4:
rand_color=color.gray;
打破
}
//我想我还需要做点什么?
//这可能是我的错误所在。。。
g2d.setColor(rand_color);
}
g2d.椭圆形(x,y,30,30);
}
公共静态void main(字符串[]args)引发InterruptedException
{
JFrame=新JFrame(“迷你网球”);
游戏=新游戏();
frame.add(游戏);
帧设置大小(屏幕X、屏幕Y);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
while(true)
{
游戏。移动球();
游戏。重绘();
睡眠(10);
}
}
}
用于此油漆的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);
}
上面的例子是关于动画的(1)&自定义绘制错误。我建议在关注任何其他内容之前,将其修改为经过尝试和测试的方法。1)动画应该从Swing
计时器调用,这样EDT不会被阻止。2)在所有使用自定义绘制的情况下,一个常量应该是调用super
方法。如果,则不调用>这段代码来自一个游戏教程,所以它不是特定于动画的。它正在开始设置一个游戏。我只是在继续下一步之前玩它。“这段代码来自一个游戏教程…”“GI/GO”我只是在继续下一步之前玩它。”您的下一步应该是扔掉这些渣滓,然后使用从Java教程中获得的代码重新开始。绘制方法不应该更改组件的状态。它应该只绘制组件的当前状态。有关使用摆动计时器为多个“球”对象设置动画的工作示例,请参阅。
@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);
}