我用了数组来画炮弹,炮弹发射的角度是任意的,但运行了好几次却发现炮弹就成一条直线了,是哪里出了问题呢

Shell.java
package zzu.baizhan.Feb.Day20th;
import java.awt.*;
import java.util.Random;
public class Shell extends GameObject {
double degree;
public Shell() {
x = 200;
y = 200;
width = 10;
height = 10;
speed = 3;
degree = Math.random()*Math.PI*2;
}
public void draw(Graphics g) {
Color c = g.getColor();
g.setColor(Color.YELLOW);
g.fillOval((int) x, (int) y, width, height);
//炮弹沿着任意角度去飞
x += speed * Math.cos(degree);
y += speed * Math.sin(degree);
if (x < 0 || x > Constant.GAME_WIDTH - width) {
degree = Math.PI - degree;
}
if (y < 30 || y < Constant.GAME_HEIGHT - height) {
degree = -degree;
}
g.setColor(c);
}
}
package zzu.baizhan.Feb.Day20th;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Feb20thPlane extends JFrame {
Image ball = Feb20thGameUtil.getImage("Images/ball.png");
Image bg = Feb20thGameUtil.getImage("Images/bg.jpg");
Image plane = Feb20thGameUtil.getImage("Images/plane.png");
Plane p=new Plane(plane,250,250);
Shell []shells=new Shell[50];
int planeX=250;
int planeY=250;
@Override
public void paint(Graphics g) { //自动被调用,相当于画笔
g.drawImage(bg, 0, 0, null);
g.drawImage(plane, planeX, planeY, null);
p.drawSelf(g);
for (int i = 0; i < shells.length; i++) {
shells[i].draw(g);
}
// Color c=g.getColor();
//
// Font f=g.getFont();
// g.setColor(Color.BLUE);
//
// g.drawLine(100,100,300,300);
// g.drawRect(100,100,300,300);
// g.drawOval(100,100,300,300);
//// g.drawArc(100,100,200,200,300,300);
// g.fillRect(100,100,100,100);
// g.setColor(Color.RED);
// g.setFont(new Font("宋体",Font.BOLD,50));
// g.drawString("我是谁?",200,200);
//
// g.drawImage(ball,250,250,null);
//
// g.setColor(c);
// g.setFont(f);
}
class keyMonitor extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
p.addDirection(e);
}
@Override
public void keyReleased(KeyEvent e) {
p.minusDirection(e);
}
}
public void launchFrame() {
this.setTitle("Feb20th");
this.setSize(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);
this.setLocation(100, 100);
setVisible(true);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
new PaintThread().start();//启动重画窗口的线程
addKeyListener(new keyMonitor());//给窗口增加键盘的监听
//初始化50个炮弹
for (int i = 0; i < shells.length; i++) {
shells[i] = new Shell();
}
}
public static void main(String[] args) {
Feb20thPlane f = new Feb20thPlane();
f.launchFrame();
}
class PaintThread extends Thread {
@Override
public void run() {
while (true) {
repaint();
try {
Thread.sleep(40); //1s=1000ms
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}