Как отскочить мяч от движущейся ракетки

Итак, у меня возникли трудности с игрой, которую я пытался запрограммировать на BlueJ. На данный момент у меня есть мяч, который прыгает, и ракетка, которую я могу перемещать с помощью мыши. Я пытаюсь заставить мяч отскакивать от ракетки практически везде, где бы я его ни двигал.

У меня три класса, я знаю, что это долго, но мне действительно нужна помощь.

public class MAIN {

    public void begin(){
        Paddle = new Paddle(140,400,100,canvas);
        ball = new Ball (180,50,canvas, Paddle)//ball can recognize paddle
    }

    public void onMousemove (Location p){
        Paddle.move(p);
    }
}

public class Paddle {

    public Paddle (int x, int y, int s, DrawingCanvas c){
        ((JDrawingCanvas)c).setBackground(Color.green);
        paddle = new FilledRect(x,y,s,10,c);
    }
    public void move (Location p){
        paddle.moveTo(p.getX(),p.getY());
    } //paddle, and to move paddle
}

public class Ball {

    Drawing Canvas myCanvas;
    FilledRect paddle;
    FilledOval ball;
    int dx = 3, dy = 5;

    public Ball (int x, int y, int s, DrawingCanvas c, Paddle paddle){
        myCanvas = c
        ((JDrawingCanvas)c).setBackground(Color.green);
        ball = new FilledOval (x,y,s,s,c);
        pad = paddle;

        start();
    }

    public void run () //bounces the ball around
    {
        while(true){
            if(ball.getX() <0 ||ball.getX() > myCanvas.getWidth()){
            dx = dx;
        }
        if(ball.getY() <0 ||ball.getY() > myCanvas.getWidth()){
            dy = dy;
        }
        move5();
        pause(20); 
    }

    public Rectangle getRectangle(){
        return new Rectangle ((int)paddle.getX(), paddle.getY(), 
        paddle.getWidth(), paddle.getHeight();
    }

    public boolean collision (Ball p){
        return getRectangle().intersects(p.getRectangle());
    }

    public void move5(){
        ball.move(dx,dy)
    }

    public void collide(){
        dx= -dx
        dy=-dy
    }
}

person tclap27    schedule 13.06.2017    source источник
comment
Вы должны иметь возможность использовать то же обнаружение столкновений, которое используется для сторон экрана, чтобы определить, касается ли мяч ракетки.   -  person J. Knight    schedule 13.06.2017


Ответы (1)


Не используйте хитбокс для вашего мяча, проверяйте в каждом кадре, не пересекается ли он с верхней или нижней границей вашей ракетки. если да, инвертируйте y скорость мяча. То же самое для оси x.

Мяч сталкивается с линией, если координата мяча (скажем, по оси y) минус его радиус меньше, чем координата y линии, а координата y мяча плюс его радиус больше, чем координата y линии и x мяча. координата +- ее радиус меньше/больше, чем координаты x конечной точки линии. так что в основном вы проверяете, находится ли мяч между концами линии и не дальше от линии, чем его собственный радиус. если это так, мяч столкнулся с границей вашей ракетки.

person PLEXATIC    schedule 13.06.2017