216 lines
7.2 KiB
Java
216 lines
7.2 KiB
Java
package de.miaurizius.jgame2d.entity;
|
|
|
|
import de.miaurizius.jgame2d.core.*;
|
|
import de.miaurizius.jgame2d.core.enums.Direction;
|
|
import de.miaurizius.jgame2d.core.enums.GameState;
|
|
import de.miaurizius.jgame2d.core.handlers.KeyHandler;
|
|
|
|
import java.awt.*;
|
|
|
|
public class Player extends Entity {
|
|
|
|
KeyHandler keyH;
|
|
|
|
public final int screenX;
|
|
public final int screenY;
|
|
|
|
public Player(GamePanel panel, KeyHandler keyH) {
|
|
super(panel);
|
|
this.keyH = keyH;
|
|
name = "player";
|
|
|
|
screenX = panel.screenWidth/2 - panel.tileSize/2;
|
|
screenY = panel.screenHeight/2 - panel.tileSize/2;
|
|
|
|
solidArea = new Rectangle();
|
|
solidArea.x = 12;
|
|
solidArea.y = 20;
|
|
solidAreaDefaultX = solidArea.x;
|
|
solidAreaDefaultY = solidArea.y;
|
|
solidArea.width = 24;
|
|
solidArea.height = 24;
|
|
|
|
attackArea.width = 36;
|
|
attackArea.height = 36;
|
|
|
|
setDefaultValues();
|
|
getPlayerImage();
|
|
getPlayerAttackImage();
|
|
}
|
|
|
|
public void setDefaultValues() {
|
|
worldX = panel.tileSize * 23;
|
|
worldY = panel.tileSize * 21;
|
|
speed = 4;
|
|
direction = Direction.DOWN;
|
|
|
|
// PLAYER STATUS (1 heart = 2 lives)
|
|
maxLife = 6;
|
|
life = maxLife;
|
|
}
|
|
|
|
public void update() {
|
|
if(attacking) {
|
|
attacking();
|
|
return;
|
|
}
|
|
// MOVEMENT
|
|
if(keyH.upPressed || keyH.downPressed || keyH.leftPressed || keyH.rightPressed || keyH.spacePressed) {
|
|
if(!keyH.spacePressed) {
|
|
if(keyH.upPressed) direction = Direction.UP;
|
|
else if(keyH.downPressed) direction = Direction.DOWN;
|
|
else if(keyH.leftPressed) direction = Direction.LEFT;
|
|
else direction = Direction.RIGHT;
|
|
}
|
|
|
|
// CHECK TILE COLLISION
|
|
collisionOn = false;
|
|
panel.collisionH.checkTile(this);
|
|
|
|
// CHECK OBJECT COLLISION
|
|
int objIndex = panel.collisionH.checkObject(this, true);
|
|
pickObject(objIndex);
|
|
|
|
// CHECK ENTITY COLLISION
|
|
int npcIndex = panel.collisionH.checkEntity(this, panel.npc);
|
|
interactNPC(npcIndex);
|
|
|
|
// CHECK MONSTER COLLISION
|
|
int monsterIndex = panel.collisionH.checkEntity(this, panel.monster);
|
|
interactMonster(monsterIndex);
|
|
|
|
// CHECK EVENT
|
|
panel.eventH.checkEvent();
|
|
|
|
if(!collisionOn && !keyH.spacePressed) {
|
|
switch (direction) {
|
|
case UP -> worldY -= speed;
|
|
case DOWN -> worldY += speed;
|
|
case LEFT ->worldX -= speed;
|
|
case RIGHT -> worldX += speed;
|
|
}
|
|
}
|
|
|
|
panel.keyH.spacePressed = false;
|
|
|
|
spriteCounter++;
|
|
if(spriteCounter > 12) {
|
|
if(spriteNum == 1) spriteNum = 2;
|
|
else if(spriteNum == 2) spriteNum = 1;
|
|
else spriteNum = 0;
|
|
spriteCounter = 0;
|
|
}
|
|
}
|
|
if(!invincible) return;
|
|
invincibleCount++;
|
|
if(invincibleCount > 60) {
|
|
invincible = false;
|
|
invincibleCount = 0;
|
|
}
|
|
}
|
|
|
|
public void attacking() {
|
|
spriteCounter++;
|
|
if(spriteCounter <= 5) spriteNum = 1;
|
|
if(spriteCounter > 5 && spriteCounter <= 25) {
|
|
spriteNum = 2;
|
|
int currentWorldX = worldX;
|
|
int currentWorldY = worldY;
|
|
int solidAreaWidth = solidArea.width;
|
|
int solidAreaHeight = solidArea.height;
|
|
|
|
switch(direction) {
|
|
case UP -> worldY -= attackArea.height;
|
|
case DOWN -> worldY += attackArea.height;
|
|
case LEFT -> worldX -= attackArea.width;
|
|
case RIGHT -> worldX += attackArea.width;
|
|
}
|
|
solidArea.width = attackArea.width;
|
|
solidArea.height = attackArea.height;
|
|
|
|
int monsterIndex = panel.collisionH.checkEntity(this, panel.monster);
|
|
damageMonster(monsterIndex);
|
|
|
|
worldX = currentWorldX;
|
|
worldY = currentWorldY;
|
|
solidArea.width = solidAreaWidth;
|
|
solidArea.height = solidAreaHeight;
|
|
|
|
}
|
|
if(spriteCounter > 25) {
|
|
spriteNum = 1;
|
|
spriteCounter = 0;
|
|
attacking = false;
|
|
}
|
|
}
|
|
|
|
public void damageMonster(int index) {
|
|
if(index == 999) return;
|
|
}
|
|
|
|
public void draw(Graphics2D graphics2d) {
|
|
int screenX = worldX - panel.player.worldX + panel.player.screenX;
|
|
int screenY = worldY - panel.player.worldY + panel.player.screenY;
|
|
|
|
if(invincible) {
|
|
graphics2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f));
|
|
}
|
|
|
|
if(attacking) graphics2d.drawImage(parseSpriteATK(),
|
|
(direction == Direction.LEFT) ? screenX - panel.tileSize : screenX,
|
|
(direction == Direction.UP) ? screenY - panel.tileSize : screenY, null);
|
|
else graphics2d.drawImage(parseSprite(), screenX, screenY, null);
|
|
|
|
graphics2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f));
|
|
}
|
|
|
|
public void pickObject(int index) {
|
|
if(index == 999) return;
|
|
}
|
|
|
|
public void interactNPC(int index) {
|
|
if(index == 999) {
|
|
if(panel.keyH.spacePressed) attacking = true;
|
|
return;
|
|
}
|
|
//if(!panel.keyH.spacePressed) return; //Only uncomment if text should only appear if player hits space
|
|
panel.gameState = GameState.DIALOGUE;
|
|
panel.npc[index].speak();
|
|
}
|
|
|
|
public void interactMonster(int index) {
|
|
if(index == 999) return;
|
|
if(invincible) return;
|
|
life -= 1;
|
|
invincible = true;
|
|
}
|
|
|
|
public void speak() {
|
|
//This method only exists for character specific things later...
|
|
super.speak();
|
|
}
|
|
|
|
public void getPlayerImage() {
|
|
up1 = initEntitySprites("player/boy_up_1");
|
|
up2 = initEntitySprites("player/boy_up_2");
|
|
down1 = initEntitySprites("player/boy_down_1");
|
|
down2 = initEntitySprites("player/boy_down_2");
|
|
left1 = initEntitySprites("player/boy_left_1");
|
|
left2 = initEntitySprites("player/boy_left_2");
|
|
right1 = initEntitySprites("player/boy_right_1");
|
|
right2 = initEntitySprites("player/boy_right_2");
|
|
}
|
|
|
|
public void getPlayerAttackImage() {
|
|
attackUp1 = initEntitySprites("player/attack/boy_attack_up_1", panel.tileSize, panel.tileSize*2);
|
|
attackUp2 = initEntitySprites("player/attack/boy_attack_up_2", panel.tileSize, panel.tileSize*2);
|
|
attackDown1 = initEntitySprites("player/attack/boy_attack_down_1", panel.tileSize, panel.tileSize*2);
|
|
attackDown2 = initEntitySprites("player/attack/boy_attack_down_2", panel.tileSize, panel.tileSize*2);
|
|
attackLeft1 = initEntitySprites("player/attack/boy_attack_left_1", panel.tileSize*2, panel.tileSize);
|
|
attackLeft2 = initEntitySprites("player/attack/boy_attack_left_2", panel.tileSize*2, panel.tileSize);
|
|
attackRight1 = initEntitySprites("player/attack/boy_attack_right_1", panel.tileSize*2, panel.tileSize);
|
|
attackRight2 = initEntitySprites("player/attack/boy_attack_right_2", panel.tileSize*2, panel.tileSize);
|
|
}
|
|
|
|
}
|