2022-05-30 19:46:53 +01:00
|
|
|
/* PlayerBall class defines behaviours for the player-controlled ball
|
|
|
|
|
|
|
|
child of Rectangle because that makes it easy to draw and check for collision
|
|
|
|
|
|
|
|
In 2D GUI, basically everything is a rectangle even if it doesn't look like it!
|
|
|
|
*/
|
|
|
|
import java.awt.*;
|
|
|
|
import java.awt.event.*;
|
2022-06-08 19:32:31 +01:00
|
|
|
import java.io.IOException;
|
2022-05-30 19:46:53 +01:00
|
|
|
|
2022-05-31 18:19:23 +01:00
|
|
|
public class GenericSprite extends Rectangle{
|
2022-05-30 19:46:53 +01:00
|
|
|
|
2022-05-31 18:19:41 +01:00
|
|
|
public double yVelocity;
|
|
|
|
public double xVelocity;
|
|
|
|
public final double SPEED = 20; //movement speed of ball
|
2022-06-07 19:46:45 +01:00
|
|
|
public final double speedCapx = 50;
|
|
|
|
|
|
|
|
public final double speedCapy = 20;
|
2022-06-03 22:33:21 +01:00
|
|
|
public int WIDTH; //size of ball
|
|
|
|
public int HEIGHT; //size of ball
|
2022-05-31 18:19:41 +01:00
|
|
|
public boolean rightPressed = false;
|
|
|
|
public boolean leftPressed = false;
|
|
|
|
public boolean upPressed= false;
|
|
|
|
public boolean downPressed = false;
|
|
|
|
public boolean isGrounded = false;
|
2022-06-08 19:32:31 +01:00
|
|
|
|
|
|
|
public boolean isPlayer = false;
|
2022-05-30 19:46:53 +01:00
|
|
|
//constructor creates ball at given location with given dimensions
|
2022-06-03 22:33:21 +01:00
|
|
|
// TODO: reverse order of height and width
|
2022-05-31 18:19:23 +01:00
|
|
|
public GenericSprite(int x, int y, int height, int width){
|
2022-06-03 22:33:21 +01:00
|
|
|
super(x, y, width, height);
|
|
|
|
WIDTH = width;
|
|
|
|
HEIGHT = height;
|
2022-05-30 19:46:53 +01:00
|
|
|
}
|
|
|
|
|
2022-06-07 18:12:48 +01:00
|
|
|
|
2022-05-30 19:46:53 +01:00
|
|
|
//called from GamePanel when any keyboard input is detected
|
|
|
|
//updates the direction of the ball based on user input
|
|
|
|
//if the keyboard input isn't any of the options (d, a, w, s), then nothing happens
|
|
|
|
public void keyPressed(KeyEvent e){
|
2022-06-02 17:22:53 +01:00
|
|
|
|
2022-05-30 19:46:53 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
//called from GamePanel when any key is released (no longer being pressed down)
|
|
|
|
//Makes the ball stop moving in that direction
|
|
|
|
public void keyReleased(KeyEvent e){
|
2022-06-02 18:21:29 +01:00
|
|
|
|
2022-05-30 19:46:53 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
//called from GamePanel whenever a mouse click is detected
|
|
|
|
//changes the current location of the ball to be wherever the mouse is located on the screen
|
|
|
|
public void mousePressed(MouseEvent e){
|
2022-06-03 22:33:21 +01:00
|
|
|
|
2022-05-30 19:46:53 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2022-06-08 19:32:31 +01:00
|
|
|
public void move() throws IOException {
|
2022-06-03 22:33:21 +01:00
|
|
|
|
2022-05-30 19:46:53 +01:00
|
|
|
}
|
|
|
|
|
2022-05-31 18:19:41 +01:00
|
|
|
public void capSpeed(){
|
2022-06-07 19:46:45 +01:00
|
|
|
if(xVelocity>speedCapx){
|
|
|
|
xVelocity = speedCapx;
|
|
|
|
} else if(xVelocity<-1*speedCapx) {
|
|
|
|
xVelocity = -1*speedCapx;
|
|
|
|
}
|
|
|
|
if(yVelocity>speedCapy){
|
|
|
|
yVelocity = speedCapy;
|
|
|
|
} else if(yVelocity<-1*speedCapy) {
|
|
|
|
yVelocity = -1*speedCapy;
|
2022-05-31 18:19:41 +01:00
|
|
|
}
|
2022-05-30 19:46:53 +01:00
|
|
|
}
|
|
|
|
|
2022-06-07 18:12:48 +01:00
|
|
|
private boolean collide(Tile tile, double x, double y){
|
|
|
|
if(!tile.collision){
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if(x+WIDTH>tile.x&&x<tile.x+Tile.length&&y-tile.y<Tile.length&&tile.y-y<HEIGHT){
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
2022-06-08 03:12:40 +01:00
|
|
|
|
2022-06-07 18:12:48 +01:00
|
|
|
public boolean canUpdate(double x, double y){
|
|
|
|
boolean canUpdate = true;
|
2022-06-08 03:12:40 +01:00
|
|
|
int lowX = Math.max(0, (this.x+GamePanel.GAME_WIDTH/2)/Tile.length-4);
|
|
|
|
int highX = Math.min(lowX + 8, GamePanel.map.length);
|
|
|
|
int lowY = Math.max(0,(this.y/Tile.length)-6);
|
|
|
|
int highY = Math.min(lowY + 12, GamePanel.map[0].length);
|
|
|
|
for(int i=lowX; i<highX; i++) {
|
|
|
|
for (int j = lowY; j < highY; j++) {
|
|
|
|
if (GamePanel.map[i][j] != null) {
|
|
|
|
if (collide(GamePanel.map[i][j], this.x + x, this.y + y)) {
|
2022-06-08 19:32:31 +01:00
|
|
|
if (GamePanel.map[i][j].isFinish&&isPlayer) {
|
2022-06-08 03:12:40 +01:00
|
|
|
LevelManager.nextLevel();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
canUpdate = false;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2022-06-07 18:12:48 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return canUpdate;
|
|
|
|
}
|
2022-05-30 19:46:53 +01:00
|
|
|
//called frequently from the GamePanel class
|
|
|
|
//draws the current location of the ball to the screen
|
|
|
|
public void draw(Graphics g){
|
2022-06-03 22:33:21 +01:00
|
|
|
|
|
|
|
|
2022-05-30 19:46:53 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|