Java 嗨,如何在每次球从墙上反弹时更改球的颜色?

Java 嗨,如何在每次球从墙上反弹时更改球的颜色?,java,colors,Java,Colors,我的球码在这里: 我不知道当他撞到墙上时如何使球变色。如果我们想在球每次从墙上反弹时随机更改球的颜色,该怎么办 //Ball.java import java.awt.Color; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.Color; import java.awt.Graphics; public class Ball { private static final

我的球码在这里: 我不知道当他撞到墙上时如何使球变色。如果我们想在球每次从墙上反弹时随机更改球的颜色,该怎么办

//Ball.java
import java.awt.Color;             
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Color;
import java.awt.Graphics;


public class Ball {
private static final int DIAMETER = 30; //diametrul mingii
private static final int RECTANGLE = 30;
private static final int WIDTH = 50;    //Pallet width
private static final int HEIGHT = 50;   //Pallet height 

int x = 0;      //The initial position of the ball, up
int y = 0;      //The initial position of the ball, left
int xa = 1; 
int ya = 1; 

private Game game;
private int score=0;
public Ball(Game game) {
    this.game= game;
}

void move() {
    //Each if limits a border of the window
    if (x + xa < 0)
        xa = 1;     //The ball moves to the right with one pixel each round

    if (x + xa > game.getWidth() - DIAMETER)    //When the ball exceeds the edge, we change direction

        xa = -1;

    if (y + ya < 0)
        ya = 1;     
    if (y + ya > game.getHeight() - DIAMETER)   // When the ball exceeds the bottom edge of the window,

    if (collision()){       //mingea se deplaseaza in sus, daca se intersecteaza cu jucatorul
        ya = -1;                                
        y = game.player.getTopY() - DIAMETER;   //plasam mingea deasupra jucatorului, 
                //For the rectangles they are in, do not intersect

    }
    x = x + xa;     //Make the trips above
    y = y + ya;     
}
private boolean collision() {
    return game.player.getBounds().intersects(getBounds()); //returneaza true daca dreptunghiul  

}

public void paint(Graphics2D g) {
    g.fillOval(x, y, DIAMETER, DIAMETER);
}
public void paintComponent(Graphics g) {   
    g.fillRect(x, y, RECTANGLE, RECTANGLE );
}

    public Rectangle getBounds() {
    return new Rectangle(x, y, DIAMETER, DIAMETER);


    }

  }
//Ball.java
导入java.awt.Color;
导入java.awt.Graphics2D;
导入java.awt.Rectangle;
导入java.awt.Color;
导入java.awt.Graphics;
公共班级舞会{
私有静态最终内部直径=30;//直径mingii
私有静态最终整数矩形=30;
专用静态最终整型宽度=50;//托盘宽度
专用静态最终整型高度=50;//托盘高度
int x=0;//球的初始位置,向上
int y=0;//球的初始位置,左侧
int-xa=1;
int-ya=1;
私人游戏;
私人智力得分=0;
公众舞会(游戏){
这个。游戏=游戏;
}
无效移动(){
//每个if限制窗口的边框
if(x+xa<0)
xa=1;//球向右移动,每轮移动一个像素
如果(x+xa>game.getWidth()-DIAMETER)//当球超过边缘时,我们改变方向
xa=-1;
如果(y+ya<0)
ya=1;
如果(y+ya>game.getHeight()-DIAMETER)//当球超过窗口的底边时,
如果(collision()){//mingea se deplaseaza in sus,daca se intersecteaza cu jucatorul
ya=-1;
y=game.player.getTopY()-DIAMETER;//plasam mingea deapra jucatorului,
//对于它们所在的矩形,不要相交
}
x=x+xa;//进行上述行程
y=y+ya;
}
私有布尔冲突(){
return game.player.getBounds().intersects(getBounds());//returneaza true daca dreptunghiul
}
公共空隙涂料(图2D g){
g、 圆角(x,y,直径,直径);
}
公共组件(图形g){
g、 fillRect(x,y,矩形,矩形);
}
公共矩形getBounds(){
返回新矩形(x,y,直径,直径);
}
}

非常感谢您的帮助。

简单解决方案:添加一个新的布尔值以了解是否发生了冲突,例如
boolean coll=false
。在
if(collision())
语句中,添加
coll=true
。然后更改此选项:

public void paint(Graphics2D g) {
    g.fillOval(x, y, DIAMETER, DIAMETER);
}
为此:

public void paint(Graphics2D g) {
    if (coll){
        Random r = new Random();
        g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256));
        coll = false;
    }
    g.fillOval(x, y, DIAMETER, DIAMETER);
}

这可能需要您导入随机软件包,可能有问题,我不记得了,现在无法测试,抱歉,但一般来说,这就是问题所在。

简单解决方案:添加一个新的布尔值,以了解是否发生了冲突,例如
boolean coll=false
。在
if(collision())
语句中,添加
coll=true
。然后更改此选项:

public void paint(Graphics2D g) {
    g.fillOval(x, y, DIAMETER, DIAMETER);
}
为此:

public void paint(Graphics2D g) {
    if (coll){
        Random r = new Random();
        g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256));
        coll = false;
    }
    g.fillOval(x, y, DIAMETER, DIAMETER);
}

这可能需要您导入随机软件包,可能有问题,我不记得了,现在无法测试它,抱歉,但一般来说,这就是想法。

当球碰到墙时,您需要它来更改图形的颜色,根据您的评论,与墙的碰撞发生在这里:

if (x + xa > game.getWidth() - DIAMETER)    //When the ball exceeds the edge, we change direction
    xa = -1;
因此,您需要执行一项额外的操作,即:

if (x + xa > game.getWidth() - DIAMETER) {   //When the ball exceeds the edge, we change direction
    xa = -1;
    g.setColor(Color.red); //or any other color
}

请注意,您需要将
g
元素传递到
move
函数中,以便像在
paint
函数中一样对其进行操作。还有一件事,您需要将颜色变化线添加到任何碰撞中,无论是墙、地板还是天花板。至于使颜色随机,你应该能够自己通过一点努力来实现它

当球碰到墙时,你需要改变图形的颜色,根据你的评论,与墙的碰撞发生在这里:

if (x + xa > game.getWidth() - DIAMETER)    //When the ball exceeds the edge, we change direction
    xa = -1;
因此,您需要执行一项额外的操作,即:

if (x + xa > game.getWidth() - DIAMETER) {   //When the ball exceeds the edge, we change direction
    xa = -1;
    g.setColor(Color.red); //or any other color
}

请注意,您需要将
g
元素传递到
move
函数中,以便像在
paint
函数中一样对其进行操作。还有一件事,您需要将颜色变化线添加到任何碰撞中,无论是墙、地板还是天花板。至于将颜色设置为随机颜色,你应该能够通过自己的一点努力来实现这一点

如果你的评论是英文的,那将是一个很大的帮助。这看起来像是家庭作业。。。不管怎样,请查看碰撞功能。您可以使用
g.setColor
更改颜色。@talex您能更具体一点吗?我是这方面的初学者。如果你的评论是用英语的,那将是一个很大的帮助。。。不管怎样,请查看碰撞功能。您可以使用
g.setColor
更改颜色。@talex您能更具体一点吗?我是这方面的初学者,它很管用,但现在我在课堂上遇到了问题。“类型球已经定义”在main中也是如此“类型球的方法绘制(Graphics2D)未定义”类型球已经定义意味着定义同一事物两次。换句话说,在同一个文件或包中必须有另一个Ball类。我在project中有太多不同类名的东西,但有点相同,这就是问题所在。谢谢你的帮助,我在这方面是个初学者。没关系,成为一个初学者是第一步。这很有效,但现在我在课堂上遇到了问题。“类型球已经定义”在main中也是如此“类型球的方法绘制(Graphics2D)未定义”类型球已经定义意味着定义同一事物两次。换句话说,在同一个文件或包中必须有另一个Ball类。我在project中有太多不同类名的东西,但有点相同,这就是问题所在。谢谢你的帮助,我是个初学者没关系,成为一个初学者是第一步。