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); } }