2019-11-19 00:55:13 +00:00
package break_out.model ;
import break_out.Constants ;
/ * *
* This class contains the information about the balls characteristics and behavior
2019-12-01 17:31:50 +00:00
*
2019-11-19 00:55:13 +00:00
* @author iSchumacher
2019-11-27 22:05:33 +00:00
* @author modified by Gruppe 175 : Moritz Henseleit , Ruben Meyer
2019-11-19 00:55:13 +00:00
* /
2019-12-01 17:31:50 +00:00
public class Ball implements IBall {
2019-11-19 00:55:13 +00:00
/ * *
* The balls position on the playground
* /
private Position position ;
2019-12-01 17:31:50 +00:00
2019-11-19 00:55:13 +00:00
/ * *
* The balls direction
* /
private Vector2D direction ;
2019-12-01 17:31:50 +00:00
2019-11-19 00:55:13 +00:00
/ * *
* The constructor of a ball
* The balls position and direction are initialized here .
* /
public Ball ( ) {
this . position = new Position ( 0 , 0 ) ;
2019-12-01 17:31:50 +00:00
this . direction = new Vector2D ( Constants . BALL_SPEED , Constants . BALL_SPEED ) ;
2019-11-19 13:11:56 +00:00
this . direction . rescale ( ) ;
2019-11-19 02:05:45 +00:00
// start at bottom-center
2019-12-01 17:31:50 +00:00
this . position . setX ( ( Constants . SCREEN_WIDTH - Constants . BALL_DIAMETER ) / 2 . 0 ) ;
this . position . setY ( Constants . SCREEN_HEIGHT - Constants . BALL_DIAMETER - Constants . PADDLE_HEIGHT ) ;
2019-11-19 00:55:13 +00:00
}
2019-12-01 17:31:50 +00:00
2019-11-19 00:55:13 +00:00
/ * *
* The getter for the balls position
2019-12-01 17:31:50 +00:00
*
2019-11-19 00:55:13 +00:00
* @return position The balls current position
* /
public Position getPosition ( ) {
return this . position ;
}
2019-12-01 17:31:50 +00:00
2019-11-19 00:55:13 +00:00
/ * *
* The getter for the balls direction
2019-12-01 17:31:50 +00:00
*
2019-11-19 00:55:13 +00:00
* @return direction The balls current direction
* /
public Vector2D getDirection ( ) {
return this . direction ;
}
2019-12-01 17:31:50 +00:00
2019-11-19 00:55:13 +00:00
/ * *
2019-11-19 14:06:25 +00:00
* updates ball position
2019-11-19 00:55:13 +00:00
* /
public void updatePosition ( ) {
2019-11-19 14:06:25 +00:00
// sets X position
2019-12-01 17:31:50 +00:00
this . position . setX ( this . position . getX ( ) + this . direction . getDx ( ) ) ;
2019-11-19 14:06:25 +00:00
2019-12-01 17:31:50 +00:00
// sets Y position
this . position . setY ( this . position . getY ( ) + this . direction . getDy ( ) ) ;
2019-11-19 00:55:13 +00:00
}
2019-12-01 17:31:50 +00:00
2019-11-19 00:55:13 +00:00
/ * *
2019-11-19 14:06:25 +00:00
* Ball reacts to contact with the borders
2019-11-19 00:55:13 +00:00
* /
public void reactOnBorder ( ) {
2019-12-01 17:31:50 +00:00
// reacts on left border
if ( this . position . getX ( ) < = 0 ) {
this . position . setX ( 0 ) ;
this . direction . setDx ( - ( this . direction . getDx ( ) ) ) ;
2019-11-26 22:45:59 +00:00
}
2019-11-19 02:05:45 +00:00
2019-12-01 17:31:50 +00:00
// reacts on right border (-Diameter because of hitbox)
if ( this . position . getX ( ) > = Constants . SCREEN_WIDTH - Constants . BALL_DIAMETER ) {
2019-11-26 22:45:59 +00:00
this . position . setX ( Constants . SCREEN_WIDTH - Constants . BALL_DIAMETER ) ;
this . direction . setDx ( - ( this . direction . getDx ( ) ) ) ;
}
2019-11-19 02:05:45 +00:00
2019-12-01 17:31:50 +00:00
// reacts on top border
if ( this . position . getY ( ) < = 0 ) {
this . position . setY ( 0 ) ;
this . direction . setDy ( - ( this . direction . getDy ( ) ) ) ;
2019-11-26 22:45:59 +00:00
}
2019-11-19 02:05:45 +00:00
2019-12-01 17:31:50 +00:00
// reacts on bottom border (+Diameter because of hitbox)
if ( this . position . getY ( ) > = Constants . SCREEN_HEIGHT - Constants . BALL_DIAMETER ) {
this . position . setY ( Constants . SCREEN_HEIGHT - Constants . BALL_DIAMETER ) ;
this . direction . setDy ( - ( this . direction . getDy ( ) ) ) ;
2019-11-26 22:45:59 +00:00
}
2019-11-19 00:55:13 +00:00
}
2019-12-01 17:31:50 +00:00
2019-12-02 21:51:46 +00:00
/ * *
2019-12-02 23:03:36 +00:00
* tests whether the ball touches the paddle ' s hit box .
2019-12-02 21:51:46 +00:00
* @param paddle paddle which will be tested
2019-12-02 23:03:36 +00:00
* @return true when ball hits the paddle
2019-12-02 21:51:46 +00:00
* /
public boolean hitsPaddle ( Paddle paddle ) {
2019-12-02 23:03:36 +00:00
// paddles position
Position posPaddle = paddle . getPosition ( ) ;
// balls position
Position posBall = this . getPosition ( ) ;
// test balls y position against paddles y values
2019-12-07 16:24:39 +00:00
// paddles y values can be interpreted as a closed interval therefore if balls y position is in the interval, its true
2019-12-02 23:03:36 +00:00
boolean testPaddleY = (
2019-12-07 16:24:39 +00:00
posPaddle . getY ( ) < = posBall . getY ( ) & & posBall . getY ( ) < = posPaddle . getY ( ) + paddle . getHeight ( ) | |
posPaddle . getY ( ) < = posBall . getY ( ) + Constants . BALL_DIAMETER & & posBall . getY ( ) + Constants . BALL_DIAMETER < = posPaddle . getY ( ) + paddle . getHeight ( )
2019-12-02 23:03:36 +00:00
) ;
// test balls x position against paddles x values
2019-12-07 16:24:39 +00:00
// paddles x values can be interpreted as a closed interval therefore if balls x position is in the interval, its true
2019-12-02 23:03:36 +00:00
boolean testPaddleX = (
2019-12-07 16:24:39 +00:00
posPaddle . getX ( ) < = posBall . getX ( ) & & posBall . getX ( ) < = posPaddle . getX ( ) + paddle . getWidth ( ) | |
posPaddle . getX ( ) < = posBall . getX ( ) + Constants . BALL_DIAMETER & & posBall . getX ( ) + Constants . BALL_DIAMETER < = posPaddle . getX ( ) + paddle . getWidth ( )
2019-12-02 23:03:36 +00:00
) ;
// if balls y position is in paddles y values, verify x position
if ( testPaddleY ) {
// DEBUG OUTPUT
//System.out.println("ball is in y area of paddle: "+String.format("x, y, w, h: %s, %s, %s, %s", posPaddle.getX(), posPaddle.getY(), paddle.getWidth(), paddle.getHeight()));
// if ball is in paddles hit box
if ( testPaddleX ) {
// DEBUG OUTPUT
//System.out.println("ball hits paddle: "+String.format("x, y, w, h: %s, %s, %s, %s", posPaddle.getX(), posPaddle.getY(), paddle.getWidth(), paddle.getHeight()));
return true ;
}
}
// default output, ball doesn't hit paddle
2019-12-02 21:51:46 +00:00
return false ;
}
/ * *
* Ball got hit by Paddle paddle
* @param paddle hitbox mechanism of paddle
2019-12-02 23:03:36 +00:00
* @todo implementation
2019-12-02 21:51:46 +00:00
* /
public void reflectOnPaddle ( Paddle paddle ) {
return ;
}
2019-11-19 00:55:13 +00:00
}