diff --git a/src/de/miaurizius/jgame2d/core/handlers/AssetSetter.java b/src/de/miaurizius/jgame2d/core/handlers/AssetSetter.java index 00bfb0a..f7a2c22 100644 --- a/src/de/miaurizius/jgame2d/core/handlers/AssetSetter.java +++ b/src/de/miaurizius/jgame2d/core/handlers/AssetSetter.java @@ -11,9 +11,7 @@ public class AssetSetter { this.panel = panel; } - public void setObject() { - - } + public void setObject() {} public void setNPC() { panel.npc[0] = new OldManNPC(panel); diff --git a/src/de/miaurizius/jgame2d/core/handlers/EventHandler.java b/src/de/miaurizius/jgame2d/core/handlers/EventHandler.java index 59bdb96..6f51b71 100644 --- a/src/de/miaurizius/jgame2d/core/handlers/EventHandler.java +++ b/src/de/miaurizius/jgame2d/core/handlers/EventHandler.java @@ -9,51 +9,84 @@ import java.awt.*; public class EventHandler { GamePanel panel; - Rectangle eventRect; - int eventRectDefaultX, eventRectDefaultY; + EventRect[][] eventRect; + int prevEventX, prevEventY; + boolean canTouchEvent = true; public EventHandler(GamePanel panel) { this.panel = panel; + eventRect = new EventRect[panel.maxWorldCol][panel.maxWorldRow]; - eventRect = new Rectangle(); - eventRect.x = 23; - eventRect.y = 23; - eventRect.width = 2; - eventRect.height = 2; - eventRectDefaultX = eventRect.x; - eventRectDefaultY = eventRect.y; + int col = 0; + int row = 0; + while(col < panel.maxWorldCol && row < panel.maxWorldRow) { + eventRect[col][row] = new EventRect(); + eventRect[col][row].x = 23; + eventRect[col][row].y = 23; + eventRect[col][row].width = 2; + eventRect[col][row].height = 2; + eventRect[col][row].eventRectDefaultX = eventRect[col][row].x; + eventRect[col][row].eventRectDefaultY = eventRect[col][row].y; + col++; + if(col == panel.maxWorldCol) { + col = 0; + row++; + } + } } public void checkEvent() { - if(hit(27,16, Direction.RIGHT)) damagePit(GameState.DIALOGUE); - if(hit(23,12, Direction.UP)) healingPool(GameState.DIALOGUE); + // Check if the player char is more than 1 tile away from the last event + int xDistance = Math.abs(panel.player.worldX - prevEventX); //return absolute number + int yDistance = Math.abs(panel.player.worldY - prevEventY); + int distance = Math.max(xDistance, yDistance); //picks greater number + if(distance > panel.tileSize) canTouchEvent = true; + if(!canTouchEvent) return; + + if(hit(27,16, Direction.RIGHT)) damagePit(27, 16, GameState.DIALOGUE); + if(hit(23,12, null)) healingPool(23, 12, GameState.DIALOGUE); } public boolean hit(int eventCol, int eventRow, Direction reqDirection) { boolean hit = false; panel.player.solidArea.x = panel.player.worldX + panel.player.solidArea.x; panel.player.solidArea.y = panel.player.worldY + panel.player.solidArea.y; - eventRect.x = eventCol*panel.tileSize + eventRect.x; - eventRect.y = eventRow*panel.tileSize + eventRect.y; - if(panel.player.solidArea.intersects(eventRect)) if(reqDirection == null || panel.player.direction == reqDirection) hit = true; + eventRect[eventCol][eventRow].x = eventCol*panel.tileSize + eventRect[eventCol][eventRow].x; + eventRect[eventCol][eventRow].y = eventRow*panel.tileSize + eventRect[eventCol][eventRow].y; + if( + panel.player.solidArea.intersects(eventRect[eventCol][eventRow]) && + (reqDirection == null || panel.player.direction == reqDirection) && + !eventRect[eventCol][eventRow].eventDone + ) { + hit = true; + prevEventX = panel.player.worldX; + prevEventY = panel.player.worldY; + } panel.player.solidArea.x = panel.player.solidAreaDefaultX; panel.player.solidArea.y = panel.player.solidAreaDefaultY; - eventRect.x = eventRectDefaultX; - eventRect.y = eventRectDefaultY; + eventRect[eventCol][eventRow].x = eventRect[eventCol][eventRow].eventRectDefaultX; + eventRect[eventCol][eventRow].y = eventRect[eventCol][eventRow].eventRectDefaultY; return hit; } - public void damagePit(GameState gameState) { + public void damagePit(int col, int row, GameState gameState) { panel.gameState = gameState; panel.ui.currentDialogue = "You have fallen into a pit!"; panel.player.life -= 1; + canTouchEvent = false; } - public void healingPool(GameState gameState) { + public void healingPool(int col, int row, GameState gameState) { if(!panel.keyH.spacePressed) return; panel.gameState = gameState; panel.ui.currentDialogue = "You drank the holy water.\nYour life has been recovered!"; panel.player.life = panel.player.maxLife; + canTouchEvent = false; } + static private class EventRect extends Rectangle { + int eventRectDefaultX, eventRectDefaultY; + boolean eventDone = false; + } } +