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

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();
                }
            }
        }
    }
}