我正在努力创造一个有趣的游戏,基本上是进化的简单表示。
基本上,当我点击我的移动球时,它会改变颜色。目标是不断改变,直到它与背景颜色相匹配,这意味着球被成功隐藏。最终我会添加更多的球,但我试图弄清楚如何通过鼠标点击改变它的颜色。到目前为止,我已经创建了移动球动画。
点击球时如何更改球的颜色?
代码:
public class EvolutionColor
{
public static void main( String args[] )
{
JFrame frame = new JFrame( "Bouncing Ball" );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
BallPanel bp = new BallPanel();
frame.add( bp );
frame.setSize( 1800, 1100 ); // set frame size
frame.setVisible( true ); // display frame
bp.setBackground(Color.YELLOW);
} // end main
}
class BallPanel extends JPanel implements ActionListener
{
private int delay = 10;
protected Timer timer;
private int x = 0; // x position
private int y = 0; // y position
private int radius = 15; // ball radius
private int dx = 2; // increment amount (x coord)
private int dy = 2; // increment amount (y coord)
public BallPanel()
{
timer = new Timer(delay, this);
timer.start(); // start the timer
}
public void actionPerformed(ActionEvent e)
// will run when the timer fires
{
repaint();
}
public void mouseClicked(MouseEvent arg0)
{
System.out.println("here was a click ! ");
}
// draw rectangles and arcs
public void paintComponent( Graphics g )
{
super.paintComponent( g ); // call superclass's paintComponent
g.setColor(Color.red);
// check for boundaries
if (x < radius) dx = Math.abs(dx);
if (x > getWidth() - radius) dx = -Math.abs(dx);
if (y < radius) dy = Math.abs(dy);
if (y > getHeight() - radius) dy = -Math.abs(dy);
// adjust ball position
x += dx;
y += dy;
g.fillOval(x - radius, y - radius, radius*2, radius*2);
}
}
答案 0 :(得分:6)
看看How to Write a Mouse Listener。
不要在paintComponent
中做出有关视图状态的决定,可能会出于多种原因进行绘画,很多都是您无法控制的。相反,请在actionPerformed
Timer
方法中做出决定
您可能还想考虑稍微改变您的设计。而不是将球作为JPanel
,你创建一个球的虚拟概念,其中包含所需的所有属性和逻辑,并使用JPanel
来绘制它们。然后,您可以将它们存储在某种List
中,每次注册鼠标时,您都可以迭代List
并检查是否有任何球被点击
请查看Java Bouncing Ball示例
答案 1 :(得分:0)
为什么不创建属性,而不是对颜色进行硬编码(g.setColor(Color.red);
):
g.setColor(currentColor);
然后,当您点击圈子区域时,请更改currentColor
。