package de.miaurizius.jgame2d.entity; import de.miaurizius.jgame2d.core.Boot; import de.miaurizius.jgame2d.core.enums.Direction; import de.miaurizius.jgame2d.core.GamePanel; import de.miaurizius.jgame2d.core.Utility; import de.miaurizius.jgame2d.core.enums.EntityType; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.FileInputStream; import java.io.IOException; import java.util.logging.Level; public class Entity { GamePanel panel; public BufferedImage up1, up2, down1, down2, left1, left2, right1, right2; public BufferedImage attackUp1, attackUp2, attackDown1, attackDown2, attackLeft1, attackLeft2, attackRight1, attackRight2; public BufferedImage image, image2, image3; public Rectangle solidArea = new Rectangle(0, 0, 48, 48); public Rectangle attackArea = new Rectangle(0, 0, 0, 0); public int solidAreaDefaultX, solidAreaDefaultY; public boolean collision = false; String[] dialogue = new String[20]; // STATE public int worldX, worldY; public Direction direction = Direction.DOWN; public int spriteNum = 1; int dialogueIndex = 0; public boolean collisionOn = false; public boolean invincible = false; boolean attacking = false; //TODO: https://youtu.be/HL39xRzPpm4?t=551 // COUNTER public int spriteCounter = 0; public int actionLock = 0; public int invincibleCount = 0; // ATTRIBUTES public EntityType type; public String name; public int speed; public int maxLife; public int life; public Entity(GamePanel panel) { this.panel = panel; } // DEFAULT public void update() { setAction(); collisionOn = false; panel.collisionH.checkTile(this); panel.collisionH.checkObject(this, false); panel.collisionH.checkEntity(this, panel.npc); panel.collisionH.checkEntity(this, panel.monster); boolean contactPlayer = panel.collisionH.checkPlayer(this); if(this.type == EntityType.MONSTER && contactPlayer) { if(panel.player.invincible) return; panel.player.life -= 1; panel.player.invincible = true; } if(!collisionOn) { switch (direction) { case UP -> worldY -= speed; case DOWN -> worldY += speed; case LEFT ->worldX -= speed; case RIGHT -> worldX += speed; } } spriteCounter++; if(spriteCounter > 12) { if(spriteNum == 1) spriteNum = 2; else if(spriteNum == 2) spriteNum = 1; else spriteNum = 0; spriteCounter = 0; } // INVINCIBLE COUNTER if(!invincible) return; invincibleCount++; if(invincibleCount > 40) { invincible = false; invincibleCount = 0; } } public void draw(Graphics2D graphics2d) { int screenX = worldX - panel.player.worldX + panel.player.screenX; int screenY = worldY - panel.player.worldY + panel.player.screenY; if(worldX + panel.tileSize > panel.player.worldX - panel.player.screenX && worldX - panel.tileSize < panel.player.worldX + panel.player.screenX && worldY + panel.tileSize > panel.player.worldY - panel.player.screenY && worldY - panel.tileSize < panel.player.worldY + panel.player.screenY ) { if(invincible) { graphics2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f)); } // only modify sprite render position for player because I dont know yet how monster attack sprite are gonna look if(type == EntityType.PLAYER) { 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); } else graphics2d.drawImage(parseSprite(), screenX, screenY, null); graphics2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f)); } } // INTERACTION public void speak() { if(dialogue[dialogueIndex] == null) dialogueIndex = 0; panel.ui.currentDialogue = dialogue[dialogueIndex]; dialogueIndex++; switch(panel.player.direction) { case UP -> direction = Direction.DOWN; case DOWN -> direction = Direction.UP; case LEFT -> direction = Direction.RIGHT; case RIGHT -> direction = Direction.LEFT; } } public void setAction() {} // SETTING THINGS UP BufferedImage parseSprite() { return switch (direction) { case UP -> (spriteNum == 1) ? up1 : up2; case DOWN -> (spriteNum == 1) ? down1 : down2; case LEFT -> (spriteNum == 1) ? left1 : left2; case RIGHT -> (spriteNum == 1) ? right1 : right2; }; } BufferedImage parseSpriteATK() { return switch (direction) { case UP -> (spriteNum == 1) ? attackUp1 : attackUp2; case DOWN -> (spriteNum == 1) ? attackDown1 : attackDown2; case LEFT -> (spriteNum == 1) ? attackLeft1 : attackLeft2; case RIGHT -> (spriteNum == 1) ? attackRight1 : attackRight2; }; } public BufferedImage initEntitySprites(String name) { try { return Utility.scaleImage(ImageIO.read(new FileInputStream("assets/" + name + ".png")), panel.tileSize, panel.tileSize); } catch (IOException e) { Boot.logger.log(Level.SEVERE, "Could not load entity-image", e); } return null; } public BufferedImage initEntitySprites(String name, int width, int height) { try { return Utility.scaleImage(ImageIO.read(new FileInputStream("assets/" + name + ".png")), width, height); } catch (IOException e) { Boot.logger.log(Level.SEVERE, "Could not load entity-image", e); } return null; } }