public void actionPerformed(ActionEvent event) { if(ballX+BALL_RADIUS>APPLICATION_WIDTH||ballX<0)vx=-vx; if(ballY+BALL_RADIUS>APPLICATION_HEIGHT||ballY<0)vy=-vy; ballX+=vx; ballY+=vy; currentE.setFrame(ballX,ballY,BALL_RADIUS,BALL_RADIUS); repaint(); }(请假设程序剩下部分都是完整的,这是一个完成小球在窗口内运动的程序)vx、vy是已经是知道的值,每次调用actionperformed时,得到小球坐标值会被更新,setframede得到参数每次应该不一样,为什么程序小球还是显示静态?请问我这样理解哪里有问题?
时间: 2024-03-10 22:48:21 浏览: 49
根据你提供的代码,我猜测你是在使用Java Swing或Java AWT创建一个窗口,并在窗口上显示一个小球,使其在窗口内运动。在你提供的代码中,使用了一个名为"currentE"的Ellipse2D对象,它用于保存小球的位置和大小信息。每次调用actionPerformed方法时,根据vx和vy的值来更新小球的位置,然后使用setFrame方法更新currentE对象的位置和大小信息,最后调用repaint方法来重绘窗口来显示更新后的小球位置。
从你的描述中看来,你说小球是静态的,可能有以下几个原因:
1. 小球的初始位置和更新后的位置重合了,导致看上去小球没有移动。你可以在初始化小球位置的时候,给它一个随机位置,比如:
```
ballX = (int)(Math.random() * (APPLICATION_WIDTH - BALL_RADIUS * 2));
ballY = (int)(Math.random() * (APPLICATION_HEIGHT - BALL_RADIUS * 2));
```
这样小球就有了一个随机的初始位置,每次调用actionPerformed方法时,它就会根据vx和vy的值来更新位置。
2. 你的窗口没有被正确显示。如果你的窗口没有被正确显示,那么你就看不到小球在窗口内的运动了。你可以检查一下你的窗口是否被正确创建和显示了。
3. 你没有给小球填充颜色或者边框颜色和背景颜色相同,导致看上去小球没有移动。你可以给小球设置边框或填充颜色,这样就可以看到小球在窗口内的运动了。
希望我的回答能够帮助到你。
相关问题
import java.awt.*; import java.awt.event.*; import java.util.Timer; import javax.swing.*; public class gameone { Frame frame = new Frame(); //桌面宽高 private final int table_width = 300; private final int table_hight = 400; //球拍宽高 private final int racket_width = 300; private final int racket_hight = 400; //小球大小 private final int ball_size = 16; //小球位置 private int ballX = 120; private int ballY = 20; //小球速度 private int speedX = 10; private int speedY = 5; //球拍位置 private int racketX = 120; private final int racketY = 340; private boolean isOver = false; private Timer timer; private class MyCanvas extends Canvas{ @Override public void paint(Graphics g) { if(isOver){ g.setColor(Color.BLUE); g.setFont(new Font("Times",Font.BOLD,30)); g.drawString("Game Over!",50,200); } else{ g.setColor(Color.RED); g.fillOval(ballX,ballY,ball_size,ball_size); g.setColor(Color.PINK); g.fillRect(racketX,racketY,racket_width,racket_hight); } } } MyCanvas drawArea = new MyCanvas(); public void init(){ KeyListener listener = new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); if(keyCode == KeyEvent.VK_LEFT){ if(racketX > 0){ racketX -= 10; } } if(keyCode == KeyEvent.VK_RIGHT){ if(racketX < (table_width - racket_width)) racketX += 10; } } }; frame.addKeyListener(listener); drawArea.addKeyListener(listener); ActionListener task = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(ballX <= 0 || ballX >= (table_width - ball_size)) speedX = -speedX; if(ballY <= 0 || ballY >= racketY - ball_size && ballX > racketX && ballX <racketX +racket_width){ speedY = -speedY; } if(ballY > racketY - ball_size && (ballX < racketX || ballX > racketX + racket_width)) { timer.stop(); isOver = true; drawArea.repaint(); } ballX += speedX; ballY += speedY; drawArea.repaint(); } }; timer = new Timer(100,task); timer.start(); drawArea.setPreferredSize(new Dimension(table_width,table_hight)); frame.add(drawArea); frame.pack(); frame.setVisible(true); } public static void main(String[] args){ new gameone().init(); } }哪里错了
我明白您在问一个Java代码段。这是一个简单的Java游戏,包括一个球和一个球拍。在这个游戏中,你可以使用键盘控制球拍的位置和移动方向。这个游戏有一个定时器,它定期移动球的位置。当球松开时,球会反弹回来。当球撞击球拍时,球会反弹回去,如果球没有被击中,则游戏结束。看起来这是一个不完整的代码段,还有部分代码被截去了。我希望我的解释可以帮助你更好地理解这个Java代码段。
我写了一个类用来监测小球是否碰撞到球拍和砖块public class Collider extends GraphicsProgram{};里面有方法private void CheckCollider(GRect collider);然后我想在下面这个类调用Collider我应该怎么做public BreakoutPanel1(){ Random rgen=new Random(); vx=rgen.nextDouble()*2+1; if(new Random().nextBoolean())vx=-vx; ballX = (int)(Math.random() * (APPLICATION_WIDTH - BALL_RADIUS * 2)); ballY = (int)(Math.random() * (APPLICATION_HEIGHT - BALL_RADIUS * 2)); ActionListener listener=new TimePainter(); ballMoveTimer = new Timer(DELAY,listener); ballMoveTimer.start(); paddleX = (APPLICATION_WIDTH-PADDLE_WIDTH)/2; paddleY = APPLICATION_HEIGHT-PADDLE_Y_OFFSET-PADDLE_HEIGHT; setPreferredSize(new Dimension(APPLICATION_WIDTH, APPLICATION_HEIGHT));//定义窗口组件大小 setBackground(Color.white); addMouseMotionListener(new MouseCoordinate()); }
你需要在 BreakoutPanel1 类中创建一个 Collider 对象,并调用它的 CheckCollider 方法来监测小球是否碰撞到球拍和砖块。具体实现方法如下:
1. 在 BreakoutPanel1 类中创建一个 Collider 对象:
```java
Collider collider = new Collider();
```
2. 在 TimePainter 类的 actionPerformed 方法中调用 Collider 对象的 CheckCollider 方法:
```java
private class TimePainter implements ActionListener {
public void actionPerformed(ActionEvent e) {
// 小球移动的代码...
GRect ball = new GRect(ballX, ballY, BALL_RADIUS * 2, BALL_RADIUS * 2);
collider.CheckCollider(ball);
// 球拍移动的代码...
}
}
```
这样,在每次小球移动时,都会调用 CheckCollider 方法来监测小球是否碰撞到球拍和砖块。
阅读全文