2022-05-31 18:19:23 +01:00
|
|
|
/* Eric Li, ICS4U, Completed 5/29/2022
|
|
|
|
|
|
|
|
Paddle class defines behaviours for the left and right player-controlled paddles */
|
|
|
|
|
2022-06-03 18:50:13 +01:00
|
|
|
import javax.sound.sampled.LineUnavailableException;
|
|
|
|
import javax.sound.sampled.UnsupportedAudioFileException;
|
2022-05-31 18:19:23 +01:00
|
|
|
import java.awt.*;
|
|
|
|
import java.awt.event.KeyEvent;
|
2022-06-09 05:07:44 +01:00
|
|
|
import java.awt.event.MouseEvent;
|
2022-05-31 18:19:23 +01:00
|
|
|
import java.awt.image.BufferedImage;
|
|
|
|
import java.awt.image.ImageObserver;
|
2022-06-03 18:50:13 +01:00
|
|
|
import java.io.IOException;
|
2022-05-31 18:19:23 +01:00
|
|
|
|
|
|
|
public class Player extends GenericSprite {
|
|
|
|
public final int SPEED = 5;
|
2022-06-06 03:18:10 +01:00
|
|
|
public static final int PLAYER_WIDTH = 52;
|
2022-06-05 22:33:24 +01:00
|
|
|
public static final int PLAYER_HEIGHT = 94;
|
2022-06-01 19:39:57 +01:00
|
|
|
public int lastXDirection, lastYDirection, lastFrame;
|
2022-05-31 18:19:23 +01:00
|
|
|
public int upKey, downKey, rightKey, leftKey;
|
2022-06-03 18:50:13 +01:00
|
|
|
|
2022-06-07 19:46:45 +01:00
|
|
|
public static final int walkSpeedCap = 5;
|
2022-06-06 03:18:10 +01:00
|
|
|
public boolean alive;
|
2022-06-03 22:33:21 +01:00
|
|
|
private final Sound jump;
|
2022-06-09 19:19:23 +01:00
|
|
|
|
2022-06-12 01:02:41 +01:00
|
|
|
public static int mouseX;
|
|
|
|
public static int mouseY;
|
|
|
|
|
2022-06-09 19:19:23 +01:00
|
|
|
public boolean leftMouseDown;
|
2022-06-12 01:02:41 +01:00
|
|
|
|
2022-06-12 22:28:27 +01:00
|
|
|
public boolean rightMouseDown;
|
|
|
|
boolean holdingSteel;
|
|
|
|
|
2022-06-12 01:02:41 +01:00
|
|
|
|
2022-05-31 18:19:23 +01:00
|
|
|
// sA[0] is -x, -y
|
|
|
|
// sA[1] is x, -y
|
|
|
|
// sA[2] is -x, y
|
|
|
|
// sA[3] is x, y
|
2022-06-01 19:39:57 +01:00
|
|
|
public BufferedImage[][][] spriteArray;
|
2022-06-03 18:50:13 +01:00
|
|
|
public Player(int x, int y, int upKey, int downKey, int leftKey, int rightKey, BufferedImage[][][] sprites) throws UnsupportedAudioFileException, LineUnavailableException, IOException {
|
2022-05-31 18:19:23 +01:00
|
|
|
super(x, y, PLAYER_HEIGHT, PLAYER_WIDTH);
|
2022-06-03 18:50:13 +01:00
|
|
|
jump = new Sound("sound/jump.wav");
|
2022-05-31 18:19:23 +01:00
|
|
|
this.upKey = upKey;
|
|
|
|
this.downKey = downKey;
|
|
|
|
this.leftKey = leftKey;
|
|
|
|
this.rightKey = rightKey;
|
|
|
|
spriteArray = sprites;
|
2022-06-06 03:18:10 +01:00
|
|
|
alive = true;
|
2022-06-08 19:32:31 +01:00
|
|
|
isPlayer = true;
|
2022-06-09 19:19:23 +01:00
|
|
|
leftMouseDown = false;
|
2022-06-12 22:28:27 +01:00
|
|
|
holdingSteel = false;
|
2022-05-31 18:19:23 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// moves paddle when key is pressed
|
|
|
|
public void keyPressed(KeyEvent e) {
|
2022-06-09 19:18:16 +01:00
|
|
|
if(e.getKeyCode() == KeyEvent.VK_D){
|
2022-06-02 18:21:29 +01:00
|
|
|
rightPressed = true;
|
|
|
|
}
|
2022-06-09 19:18:16 +01:00
|
|
|
if(e.getKeyCode() == KeyEvent.VK_A){
|
2022-06-02 18:21:29 +01:00
|
|
|
leftPressed = true;
|
|
|
|
}
|
2022-06-09 19:18:16 +01:00
|
|
|
if(e.getKeyCode() == KeyEvent.VK_W){
|
2022-06-02 18:21:29 +01:00
|
|
|
upPressed = true;
|
|
|
|
}
|
2022-06-09 19:18:16 +01:00
|
|
|
if(e.getKeyCode() == KeyEvent.VK_S){
|
2022-06-02 18:21:29 +01:00
|
|
|
downPressed = true;
|
|
|
|
}
|
2022-05-31 18:19:23 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// stops moving paddle when key is released
|
|
|
|
public void keyReleased(KeyEvent e) {
|
2022-06-09 19:18:16 +01:00
|
|
|
if(e.getKeyCode() == KeyEvent.VK_D){
|
2022-06-02 18:21:29 +01:00
|
|
|
rightPressed = false;
|
|
|
|
}
|
2022-06-09 19:18:16 +01:00
|
|
|
if(e.getKeyCode() == KeyEvent.VK_A){
|
2022-06-02 18:21:29 +01:00
|
|
|
leftPressed = false;
|
|
|
|
}
|
2022-06-09 19:18:16 +01:00
|
|
|
if(e.getKeyCode() == KeyEvent.VK_W){
|
2022-06-02 18:21:29 +01:00
|
|
|
upPressed = false;
|
|
|
|
}
|
2022-06-09 19:18:16 +01:00
|
|
|
if(e.getKeyCode() == KeyEvent.VK_S){
|
2022-06-02 18:21:29 +01:00
|
|
|
downPressed = false;
|
|
|
|
}
|
2022-05-31 18:19:23 +01:00
|
|
|
}
|
|
|
|
|
2022-06-09 19:48:21 +01:00
|
|
|
public boolean collide(Tile tile, double x, double y){
|
2022-06-08 03:12:40 +01:00
|
|
|
if(tile==null){return false;}
|
2022-06-05 16:53:03 +01:00
|
|
|
if(!tile.collision){
|
|
|
|
return false;
|
|
|
|
}
|
2022-06-07 18:12:48 +01:00
|
|
|
if(x+WIDTH>tile.realX&&x<tile.realX+Tile.length&&y-tile.y<Tile.length&&tile.y-y<HEIGHT){
|
2022-06-05 16:53:03 +01:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
2022-05-31 18:19:23 +01:00
|
|
|
// calls parent
|
2022-06-05 16:53:03 +01:00
|
|
|
|
2022-06-05 22:33:24 +01:00
|
|
|
public boolean canUpdate(double x, double y){
|
2022-06-05 16:53:03 +01:00
|
|
|
boolean canUpdate = true;
|
2022-06-08 03:12:40 +01:00
|
|
|
int lowX = Math.max(0, ((GamePanel.camera.x+GamePanel.GAME_WIDTH)/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 != null) {
|
|
|
|
if (collide(GamePanel.map[i][j], this.x + x, this.y + y)) {
|
|
|
|
if (GamePanel.map[i][j].isFinish) {
|
|
|
|
LevelManager.nextLevel();
|
2022-06-12 19:11:09 +01:00
|
|
|
GamePanel.player.reset();
|
2022-06-08 03:12:40 +01:00
|
|
|
return true;
|
|
|
|
}
|
2022-06-08 04:59:19 +01:00
|
|
|
if (GamePanel.map[i][j].kills) {
|
|
|
|
GamePanel.player.reset();
|
|
|
|
return true;
|
|
|
|
}
|
2022-06-08 03:12:40 +01:00
|
|
|
canUpdate = false;
|
|
|
|
break;
|
|
|
|
}
|
2022-06-06 16:24:46 +01:00
|
|
|
}
|
2022-06-05 16:53:03 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return canUpdate;
|
|
|
|
}
|
2022-06-08 19:32:31 +01:00
|
|
|
public void move() throws IOException {
|
2022-06-12 01:02:41 +01:00
|
|
|
// mouseX = MouseInfo.getPointerInfo().getLocation().x;
|
|
|
|
// mouseY = MouseInfo.getPointerInfo().getLocation().y;
|
2022-06-05 22:33:24 +01:00
|
|
|
if(canUpdate(xVelocity, 0)&&canUpdate(0, yVelocity)&&!canUpdate(xVelocity, yVelocity)){
|
|
|
|
GamePanel.camera.x += -Math.signum(xVelocity);
|
|
|
|
}
|
2022-06-05 16:53:03 +01:00
|
|
|
if(!canUpdate(xVelocity, 0)){
|
|
|
|
int updateAmount = 0;
|
|
|
|
if(xVelocity>0){
|
|
|
|
while(canUpdate(updateAmount, 0)){
|
|
|
|
updateAmount++;
|
|
|
|
}
|
|
|
|
GamePanel.camera.x+=updateAmount-1;
|
|
|
|
} else if(xVelocity<0){
|
|
|
|
while(canUpdate(updateAmount, 0)){
|
|
|
|
updateAmount--;
|
|
|
|
}
|
|
|
|
GamePanel.camera.x+=updateAmount+1;
|
|
|
|
}
|
2022-06-07 19:46:45 +01:00
|
|
|
//xVelocity = 0;
|
2022-06-05 22:33:24 +01:00
|
|
|
}
|
|
|
|
if(!canUpdate(0, yVelocity)){
|
2022-06-05 16:53:03 +01:00
|
|
|
if(yVelocity>0){
|
|
|
|
while(canUpdate(0,1)){
|
|
|
|
y+=1;
|
|
|
|
}
|
|
|
|
isGrounded = true;
|
2022-06-05 22:33:24 +01:00
|
|
|
} else if(yVelocity<0){
|
2022-06-05 16:53:03 +01:00
|
|
|
while(canUpdate(0,-1)){
|
|
|
|
y-=1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
yVelocity = 0;
|
|
|
|
}
|
|
|
|
if(canUpdate(xVelocity, yVelocity)) {
|
|
|
|
y = y + (int) yVelocity;
|
|
|
|
GamePanel.camera.x = GamePanel.camera.x + (int) xVelocity;
|
2022-06-07 19:46:45 +01:00
|
|
|
} else if(canUpdate(0,yVelocity)){
|
|
|
|
y = y + (int) yVelocity;
|
2022-06-08 03:12:40 +01:00
|
|
|
xVelocity*=0.75;
|
2022-06-07 19:46:45 +01:00
|
|
|
} else if(canUpdate(xVelocity,0)){
|
|
|
|
GamePanel.camera.x = GamePanel.camera.x + (int) xVelocity;
|
2022-06-08 03:12:40 +01:00
|
|
|
|
2022-06-05 16:53:03 +01:00
|
|
|
}
|
|
|
|
|
2022-06-08 16:23:57 +01:00
|
|
|
if(rightPressed){
|
|
|
|
if(isGrounded){
|
2022-06-08 19:32:31 +01:00
|
|
|
addParticle(-1);
|
2022-06-08 16:23:57 +01:00
|
|
|
}
|
|
|
|
if(xVelocity<5) {
|
|
|
|
xVelocity += 1;
|
|
|
|
}
|
2022-06-02 18:21:29 +01:00
|
|
|
}
|
2022-06-08 16:23:57 +01:00
|
|
|
if(leftPressed) {
|
2022-06-08 19:32:31 +01:00
|
|
|
if(isGrounded){
|
|
|
|
addParticle(1);
|
|
|
|
}
|
2022-06-08 16:23:57 +01:00
|
|
|
if(xVelocity>-5) {
|
|
|
|
xVelocity -= 1;
|
|
|
|
}
|
2022-06-02 18:21:29 +01:00
|
|
|
}
|
|
|
|
if(upPressed&isGrounded){
|
2022-06-05 16:53:03 +01:00
|
|
|
y-=1;
|
|
|
|
isGrounded = false;
|
|
|
|
if(canUpdate(0,-8)) {
|
|
|
|
jump.start();
|
|
|
|
}
|
2022-06-02 18:21:29 +01:00
|
|
|
yVelocity = -10;
|
|
|
|
}
|
2022-06-09 05:07:44 +01:00
|
|
|
xVelocity *= 0.93;
|
|
|
|
|
2022-06-05 16:53:03 +01:00
|
|
|
if(!isGrounded) {
|
|
|
|
yVelocity += 0.3;
|
2022-06-05 22:33:24 +01:00
|
|
|
if(downPressed){
|
|
|
|
yVelocity+=1;
|
|
|
|
}
|
2022-06-05 16:53:03 +01:00
|
|
|
}
|
2022-06-06 03:18:10 +01:00
|
|
|
|
|
|
|
if(!alive){
|
|
|
|
alive = true;
|
|
|
|
reset();
|
|
|
|
}
|
2022-06-02 18:21:29 +01:00
|
|
|
capSpeed();
|
|
|
|
}
|
|
|
|
|
2022-06-06 03:18:10 +01:00
|
|
|
public void reset(){
|
2022-06-12 19:11:09 +01:00
|
|
|
LevelManager.setLevel(LevelManager.level);
|
2022-06-06 03:18:10 +01:00
|
|
|
GamePanel.camera.x = LevelManager.xSpawn;
|
|
|
|
y = LevelManager.ySpawn;
|
|
|
|
}
|
2022-06-08 19:32:31 +01:00
|
|
|
|
2022-06-12 22:28:27 +01:00
|
|
|
public void mousePressed(MouseEvent e) throws SpriteException, IOException {
|
2022-06-12 01:02:41 +01:00
|
|
|
mouseX = e.getX();
|
|
|
|
mouseY = e.getY();
|
2022-06-09 19:19:23 +01:00
|
|
|
if(e.getButton()==MouseEvent.BUTTON1) {
|
|
|
|
leftMouseDown = true;
|
|
|
|
}
|
2022-06-12 22:28:27 +01:00
|
|
|
if(e.getButton()==MouseEvent.BUTTON3) {
|
|
|
|
int x = (mouseX + GamePanel.camera.x + GamePanel.GAME_WIDTH / 2) / Tile.length;
|
|
|
|
int y = (mouseY / Tile.length);
|
|
|
|
if (GamePanel.map[x][y] != null) {
|
|
|
|
if (!holdingSteel) {
|
|
|
|
rightMouseDown = true;
|
|
|
|
if (GamePanel.map[x][y].movable) {
|
|
|
|
holdingSteel = true;
|
|
|
|
GamePanel.map[x][y] = null;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
holdingSteel = false;
|
|
|
|
MapReader.TileX = x;
|
|
|
|
MapReader.TileY = y;
|
|
|
|
MapReader.newTile("img/tiles/boxes/steel.png");
|
|
|
|
GamePanel.map[x][y].movable = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-06-12 01:02:41 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public void mouseDragged(MouseEvent e) {
|
|
|
|
|
|
|
|
mouseX = e.getX();
|
|
|
|
mouseY = e.getY();
|
2022-06-09 19:19:23 +01:00
|
|
|
}
|
|
|
|
public void mouseReleased(MouseEvent e) {
|
2022-06-12 01:02:41 +01:00
|
|
|
mouseX = e.getX();
|
|
|
|
mouseY = e.getY();
|
2022-06-09 19:19:23 +01:00
|
|
|
if(e.getButton()==MouseEvent.BUTTON1) {
|
|
|
|
leftMouseDown = false;
|
2022-06-12 19:11:09 +01:00
|
|
|
if (GamePanel.bombs.size() < 3 && LevelManager.bombs>0) {
|
|
|
|
LevelManager.bombs--;
|
2022-06-12 01:02:41 +01:00
|
|
|
GamePanel.bombs.add(new StickyBomb(GamePanel.player.x + GamePanel.camera.x + WIDTH/2, GamePanel.player.y+HEIGHT/2,
|
|
|
|
(mouseX - GamePanel.player.x) / 20, (mouseY - GamePanel.player.y) / 10, GamePanel.bomb, GamePanel.explosionArray));
|
2022-06-09 19:19:23 +01:00
|
|
|
}
|
2022-06-09 18:40:43 +01:00
|
|
|
}
|
2022-06-12 22:28:27 +01:00
|
|
|
if(e.getButton()==MouseEvent.BUTTON3){
|
|
|
|
rightMouseDown = false;
|
|
|
|
}
|
2022-06-09 05:07:44 +01:00
|
|
|
}
|
2022-06-08 19:32:31 +01:00
|
|
|
public void addParticle(int x) throws IOException {
|
|
|
|
if(GlobalState.randInt(1,3)==3) {
|
|
|
|
GamePanel.particles.add(new Particle(this.x + GamePanel.camera.x + WIDTH / 2 + GlobalState.randInt(-PLAYER_WIDTH / 2, PLAYER_WIDTH / 2)
|
|
|
|
, (int) (y + HEIGHT * 0.95), GlobalState.randInt(-2, 2) + x, GlobalState.randInt(-4, 1), GlobalState.randInt(1, 7), "img/particles/GrassParticle.png"));
|
|
|
|
}
|
|
|
|
}
|
2022-05-31 18:19:23 +01:00
|
|
|
public int draw(Graphics g, int frame) {
|
2022-06-12 19:11:09 +01:00
|
|
|
//g.drawString(mouseX+" "+mouseY, 300, 300);
|
2022-06-03 22:33:21 +01:00
|
|
|
frame %= spriteArray[0][0].length;
|
2022-06-12 22:28:27 +01:00
|
|
|
if(rightMouseDown){
|
|
|
|
g.drawRect(mouseX,mouseY,35,35);
|
|
|
|
}
|
2022-06-01 19:39:57 +01:00
|
|
|
if (!upPressed && !downPressed && !leftPressed && !rightPressed) {
|
2022-06-06 03:18:10 +01:00
|
|
|
g.drawImage(spriteArray[lastXDirection][lastYDirection][0], x-10, y, null);
|
2022-05-31 18:19:23 +01:00
|
|
|
return 0;
|
|
|
|
} else {
|
2022-06-01 19:39:57 +01:00
|
|
|
lastXDirection = (int)(Math.signum(xVelocity) + 1) / 2;
|
|
|
|
lastYDirection = (int)(Math.signum(yVelocity) + 1) / 2;
|
|
|
|
lastFrame = frame;
|
2022-06-06 03:18:10 +01:00
|
|
|
g.drawImage(spriteArray[lastXDirection][lastYDirection][frame], x-10, y, null);
|
2022-05-31 18:19:23 +01:00
|
|
|
return 1;
|
|
|
|
}
|
2022-06-12 01:02:41 +01:00
|
|
|
|
|
|
|
|
2022-05-31 18:19:23 +01:00
|
|
|
}
|
|
|
|
}
|