From 4aabe84d5988438000669a242e802e17913d8b1c Mon Sep 17 00:00:00 2001 From: Maurice Date: Fri, 12 Dec 2025 13:20:14 +0100 Subject: [PATCH] all entity arrays are now two-dimensional (with map index so entities won't be rendered on any map anymore) --- src/de/miaurizius/jgame2d/core/GamePanel.java | 28 ++--- .../jgame2d/core/handlers/AssetSetter.java | 103 +++++++++--------- .../core/handlers/CollisionHandler.java | 2 +- .../jgame2d/core/handlers/KeyHandler.java | 3 +- src/de/miaurizius/jgame2d/entity/Entity.java | 16 +-- src/de/miaurizius/jgame2d/entity/Player.java | 66 +++++------ .../jgame2d/entity/projectile/Projectile.java | 4 +- 7 files changed, 113 insertions(+), 109 deletions(-) diff --git a/src/de/miaurizius/jgame2d/core/GamePanel.java b/src/de/miaurizius/jgame2d/core/GamePanel.java index 79b8028..56e3d32 100644 --- a/src/de/miaurizius/jgame2d/core/GamePanel.java +++ b/src/de/miaurizius/jgame2d/core/GamePanel.java @@ -58,10 +58,10 @@ public class GamePanel extends JPanel implements Runnable { // ENTITY AND OBJECT public Player player = new Player(this, keyH); - public Entity[] obj = new Entity[20]; - public Entity[] npc = new Entity[10]; - public Entity[] monster = new Entity[20]; - public InteractiveTile[] iTile = new InteractiveTile[50]; + public Entity[][] obj = new Entity[Map.values().length][20]; + public Entity[][] npc = new Entity[Map.values().length][10]; + public Entity[][] monster = new Entity[Map.values().length][20]; + public InteractiveTile[][] iTile = new InteractiveTile[Map.values().length][50]; public ArrayList projectileList = new ArrayList<>(); public ArrayList particleList = new ArrayList<>(); ArrayList entityList = new ArrayList<>(); @@ -118,14 +118,14 @@ public class GamePanel extends JPanel implements Runnable { switch(gameState) { case PLAY: player.update(); - for(Entity entity : npc) if(entity != null) entity.update(); - for(int i = 0; i < monster.length; i++) { - Entity m = monster[i]; + for(Entity entity : npc[currentMap.getIndex()]) if(entity != null) entity.update(); + for(int i = 0; i < monster[currentMap.getIndex()].length; i++) { + Entity m = monster[currentMap.getIndex()][i]; if(m != null) { if(m.alive && !m.dying) m.update(); if(!m.alive) { - monster[i].checkDrop(); - monster[i] = null; + monster[currentMap.getIndex()][i].checkDrop(); + monster[currentMap.getIndex()][i] = null; } } } @@ -143,7 +143,7 @@ public class GamePanel extends JPanel implements Runnable { else particleList.remove(i); } } - for(Entity entity : iTile) if(entity != null) entity.update(); + for(Entity entity : iTile[currentMap.getIndex()]) if(entity != null) entity.update(); break; case PAUSE: break; @@ -162,13 +162,13 @@ public class GamePanel extends JPanel implements Runnable { // GAME tileM.draw(fg2); - for(Entity entity : iTile) if(entity != null) entity.draw(fg2); + for(Entity entity : iTile[currentMap.getIndex()]) if(entity != null) entity.draw(fg2); // ENTITY RENDER SYSTEM entityList.add(player); - for(Entity entity : npc) if(entity != null) entityList.add(entity); - for(Entity entity : obj) if(entity != null) entityList.add(entity); - for(Entity entity : monster) if(entity != null) entityList.add(entity); + for(Entity entity : npc[currentMap.getIndex()]) if(entity != null) entityList.add(entity); + for(Entity entity : obj[currentMap.getIndex()]) if(entity != null) entityList.add(entity); + for(Entity entity : monster[currentMap.getIndex()]) if(entity != null) entityList.add(entity); for(Entity entity : projectileList) if(entity != null) entityList.add(entity); for(Entity entity : particleList) if(entity != null) entityList.add(entity); entityList.sort(Comparator.comparingInt(o -> o.worldY)); diff --git a/src/de/miaurizius/jgame2d/core/handlers/AssetSetter.java b/src/de/miaurizius/jgame2d/core/handlers/AssetSetter.java index 68d5230..5ec5395 100644 --- a/src/de/miaurizius/jgame2d/core/handlers/AssetSetter.java +++ b/src/de/miaurizius/jgame2d/core/handlers/AssetSetter.java @@ -1,6 +1,7 @@ package de.miaurizius.jgame2d.core.handlers; import de.miaurizius.jgame2d.core.GamePanel; +import de.miaurizius.jgame2d.core.enums.Map; import de.miaurizius.jgame2d.entity.item.*; import de.miaurizius.jgame2d.entity.npc.OldManNPC; import de.miaurizius.jgame2d.entity.monster.GreenSlimeMON; @@ -16,86 +17,86 @@ public class AssetSetter { public void setObject() { int i = 0; - panel.obj[i] = new HeartObj(panel); - panel.obj[i].worldX = panel.tileSize*25; - panel.obj[i].worldY = panel.tileSize*23; + panel.obj[Map.OVERWORLD.getIndex()][i] = new HeartObj(panel); + panel.obj[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*25; + panel.obj[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*23; i++; - panel.obj[i] = new CoinObj(panel); - panel.obj[i].worldX = panel.tileSize*21; - panel.obj[i].worldY = panel.tileSize*19; + panel.obj[Map.OVERWORLD.getIndex()][i] = new CoinObj(panel); + panel.obj[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*21; + panel.obj[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*19; i++; - panel.obj[i] = new AxeObj(panel); - panel.obj[i].worldX = panel.tileSize*33; - panel.obj[i].worldY = panel.tileSize*21; + panel.obj[Map.OVERWORLD.getIndex()][i] = new AxeObj(panel); + panel.obj[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*33; + panel.obj[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*21; i++; - panel.obj[i] = new IronShieldObj(panel); - panel.obj[i].worldX = panel.tileSize*35; - panel.obj[i].worldY = panel.tileSize*21; + panel.obj[Map.OVERWORLD.getIndex()][i] = new IronShieldObj(panel); + panel.obj[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*35; + panel.obj[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*21; i++; - panel.obj[i] = new PotionObj(panel); - panel.obj[i].worldX = panel.tileSize*22; - panel.obj[i].worldY = panel.tileSize*27; + panel.obj[Map.OVERWORLD.getIndex()][i] = new PotionObj(panel); + panel.obj[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*22; + panel.obj[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*27; i++; } public void setNPC() { - panel.npc[0] = new OldManNPC(panel); - panel.npc[0].worldX = panel.tileSize*21; - panel.npc[0].worldY = panel.tileSize*21; + panel.npc[Map.OVERWORLD.getIndex()][0] = new OldManNPC(panel); + panel.npc[Map.OVERWORLD.getIndex()][0].worldX = panel.tileSize*21; + panel.npc[Map.OVERWORLD.getIndex()][0].worldY = panel.tileSize*21; } public void setMonster() { int i = 0; - panel.monster[i] = new GreenSlimeMON(panel); - panel.monster[i].worldX = panel.tileSize*23; - panel.monster[i].worldY = panel.tileSize*36; + panel.monster[Map.OVERWORLD.getIndex()][i] = new GreenSlimeMON(panel); + panel.monster[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*23; + panel.monster[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*36; i++; - panel.monster[i] = new GreenSlimeMON(panel); - panel.monster[i].worldX = panel.tileSize*23; - panel.monster[i].worldY = panel.tileSize*37; + panel.monster[Map.OVERWORLD.getIndex()][i] = new GreenSlimeMON(panel); + panel.monster[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*23; + panel.monster[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*37; i++; - panel.monster[i] = new GreenSlimeMON(panel); - panel.monster[i].worldX = panel.tileSize*24; - panel.monster[i].worldY = panel.tileSize*37; + panel.monster[Map.OVERWORLD.getIndex()][i] = new GreenSlimeMON(panel); + panel.monster[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*24; + panel.monster[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*37; i++; - panel.monster[i] = new GreenSlimeMON(panel); - panel.monster[i].worldX = panel.tileSize*34; - panel.monster[i].worldY = panel.tileSize*42; + panel.monster[Map.OVERWORLD.getIndex()][i] = new GreenSlimeMON(panel); + panel.monster[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*34; + panel.monster[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*42; i++; - panel.monster[i] = new GreenSlimeMON(panel); - panel.monster[i].worldX = panel.tileSize*38; - panel.monster[i].worldY = panel.tileSize*42; + panel.monster[Map.OVERWORLD.getIndex()][i] = new GreenSlimeMON(panel); + panel.monster[Map.OVERWORLD.getIndex()][i].worldX = panel.tileSize*38; + panel.monster[Map.OVERWORLD.getIndex()][i].worldY = panel.tileSize*42; } public void setITiles() { int i = 0; - panel.iTile[i] = new DryTreeTI(panel,27,12);i++; - panel.iTile[i] = new DryTreeTI(panel,28,12);i++; - panel.iTile[i] = new DryTreeTI(panel,29,12);i++; - panel.iTile[i] = new DryTreeTI(panel,30,12);i++; - panel.iTile[i] = new DryTreeTI(panel,31,12);i++; - panel.iTile[i] = new DryTreeTI(panel,32,12);i++; - panel.iTile[i] = new DryTreeTI(panel,33,12);i++; + panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,27,12);i++; + panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,28,12);i++; + panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,29,12);i++; + panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,30,12);i++; + panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,31,12);i++; + panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,32,12);i++; + panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,33,12);i++; - panel.iTile[i] = new DryTreeTI(panel,18,40);i++; - panel.iTile[i] = new DryTreeTI(panel,17,40);i++; - panel.iTile[i] = new DryTreeTI(panel,16,40);i++; - panel.iTile[i] = new DryTreeTI(panel,15,40);i++; - panel.iTile[i] = new DryTreeTI(panel,14,40);i++; - panel.iTile[i] = new DryTreeTI(panel,13,40);i++; - panel.iTile[i] = new DryTreeTI(panel,13,41);i++; - panel.iTile[i] = new DryTreeTI(panel,12,41);i++; - panel.iTile[i] = new DryTreeTI(panel,11,41);i++; - panel.iTile[i] = new DryTreeTI(panel,10,41);i++; - panel.iTile[i] = new DryTreeTI(panel,10,40);i++; + panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,18,40);i++; + panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,17,40);i++; + panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,16,40);i++; + panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,15,40);i++; + panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,14,40);i++; + panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,13,40);i++; + panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,13,41);i++; + panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,12,41);i++; + panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,11,41);i++; + panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,10,41);i++; + panel.iTile[Map.OVERWORLD.getIndex()][i] = new DryTreeTI(panel,10,40);i++; } } diff --git a/src/de/miaurizius/jgame2d/core/handlers/CollisionHandler.java b/src/de/miaurizius/jgame2d/core/handlers/CollisionHandler.java index 052bb44..ab3d352 100644 --- a/src/de/miaurizius/jgame2d/core/handlers/CollisionHandler.java +++ b/src/de/miaurizius/jgame2d/core/handlers/CollisionHandler.java @@ -56,7 +56,7 @@ public class CollisionHandler { int index = 999; int c = -1; - for(Entity obj : panel.obj) { + for(Entity obj : panel.obj[panel.currentMap.getIndex()]) { c++; if (obj != null) { diff --git a/src/de/miaurizius/jgame2d/core/handlers/KeyHandler.java b/src/de/miaurizius/jgame2d/core/handlers/KeyHandler.java index 4cbbd59..0e28aeb 100644 --- a/src/de/miaurizius/jgame2d/core/handlers/KeyHandler.java +++ b/src/de/miaurizius/jgame2d/core/handlers/KeyHandler.java @@ -3,6 +3,7 @@ package de.miaurizius.jgame2d.core.handlers; import de.miaurizius.jgame2d.core.GamePanel; import de.miaurizius.jgame2d.core.UI; import de.miaurizius.jgame2d.core.enums.GameState; +import de.miaurizius.jgame2d.core.enums.Map; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; @@ -54,7 +55,7 @@ public class KeyHandler implements KeyListener { // DEBUG OPTIONS case KeyEvent.VK_T -> debug = !debug; - case KeyEvent.VK_R -> panel.tileM.loadMap(panel.currentMap); + case KeyEvent.VK_R -> {for(Map m : Map.values()) panel.tileM.loadMap(m);} // GAME STATES case KeyEvent.VK_ESCAPE -> { diff --git a/src/de/miaurizius/jgame2d/entity/Entity.java b/src/de/miaurizius/jgame2d/entity/Entity.java index c083ece..b06c127 100644 --- a/src/de/miaurizius/jgame2d/entity/Entity.java +++ b/src/de/miaurizius/jgame2d/entity/Entity.java @@ -85,9 +85,9 @@ public class Entity { collisionOn = false; panel.collisionH.checkTile(this); panel.collisionH.checkObject(this, false); - panel.collisionH.checkEntity(this, panel.npc); - panel.collisionH.checkEntity(this, panel.monster); - panel.collisionH.checkEntity(this, panel.iTile); + panel.collisionH.checkEntity(this, panel.npc[panel.currentMap.getIndex()]); + panel.collisionH.checkEntity(this, panel.monster[panel.currentMap.getIndex()]); + panel.collisionH.checkEntity(this, panel.iTile[panel.currentMap.getIndex()]); boolean contactPlayer = panel.collisionH.checkPlayer(this); if(this.type == EntityType.MONSTER && contactPlayer) damagePlayer(attack); @@ -205,11 +205,11 @@ public class Entity { } public void dropItem(Entity droppedItem) { - for(int i = 0; i < panel.obj.length; i++) { - if(panel.obj[i] == null) { - panel.obj[i] = droppedItem; - panel.obj[i].worldX = worldX; - panel.obj[i].worldY = worldY; + for(int i = 0; i < panel.obj[panel.currentMap.getIndex()].length; i++) { + if(panel.obj[panel.currentMap.getIndex()][i] == null) { + panel.obj[panel.currentMap.getIndex()][i] = droppedItem; + panel.obj[panel.currentMap.getIndex()][i].worldX = worldX; + panel.obj[panel.currentMap.getIndex()][i].worldY = worldY; break; } } diff --git a/src/de/miaurizius/jgame2d/entity/Player.java b/src/de/miaurizius/jgame2d/entity/Player.java index 073aa47..3d4eeab 100644 --- a/src/de/miaurizius/jgame2d/entity/Player.java +++ b/src/de/miaurizius/jgame2d/entity/Player.java @@ -72,15 +72,15 @@ public class Player extends Entity { pickObject(objIndex); // CHECK ENTITY COLLISION - int npcIndex = panel.collisionH.checkEntity(this, panel.npc); + int npcIndex = panel.collisionH.checkEntity(this, panel.npc[panel.currentMap.getIndex()]); interactNPC(npcIndex); // CHECK MONSTER COLLISION - int monsterIndex = panel.collisionH.checkEntity(this, panel.monster); + int monsterIndex = panel.collisionH.checkEntity(this, panel.monster[panel.currentMap.getIndex()]); interactMonster(monsterIndex); // CHECK INTERACTIVE TILE COLLISION - int iTileIndex = panel.collisionH.checkEntity(this, panel.iTile); + int iTileIndex = panel.collisionH.checkEntity(this, panel.iTile[panel.currentMap.getIndex()]); // CHECK EVENT panel.eventH.checkEvent(); @@ -136,11 +136,11 @@ public class Player extends Entity { // INTERACTION public void pickObject(int index) { - if(index == 999 || panel.obj[index] == null) return; + if(index == 999 || panel.obj[panel.currentMap.getIndex()][index] == null) return; // PICKUP ONLY - if(panel.obj[index].type == EntityType.PICKUP) { - panel.obj[index].use(this); + if(panel.obj[panel.currentMap.getIndex()][index].type == EntityType.PICKUP) { + panel.obj[panel.currentMap.getIndex()][index].use(this); } // INVENTORY ITEMS else { @@ -148,18 +148,18 @@ public class Player extends Entity { panel.ui.addMessage("Your inventory is full!"); return; } - inventory.add(panel.obj[index]); + inventory.add(panel.obj[panel.currentMap.getIndex()][index]); panel.playSE(1); - panel.ui.addMessage("Picked up " + panel.obj[index].name + "!"); + panel.ui.addMessage("Picked up " + panel.obj[panel.currentMap.getIndex()][index].name + "!"); } - panel.obj[index] = null; + panel.obj[panel.currentMap.getIndex()][index] = null; } public void interactMonster(int index) { if(index == 999) return; - if(invincible || panel.monster[index].dying || !panel.monster[index].alive) return; + if(invincible || panel.monster[panel.currentMap.getIndex()][index].dying || !panel.monster[panel.currentMap.getIndex()][index].alive) return; - int damage = panel.monster[index].attack - defense; + int damage = panel.monster[panel.currentMap.getIndex()][index].attack - defense; if(damage > 0) { panel.playSE(6); @@ -188,10 +188,10 @@ public class Player extends Entity { solidArea.width = attackArea.width; solidArea.height = attackArea.height; - int monsterIndex = panel.collisionH.checkEntity(this, panel.monster); + int monsterIndex = panel.collisionH.checkEntity(this, panel.monster[panel.currentMap.getIndex()]); damageMonster(monsterIndex, attack); - int iTileIndex = panel.collisionH.checkEntity(this, panel.iTile); + int iTileIndex = panel.collisionH.checkEntity(this, panel.iTile[panel.currentMap.getIndex()]); interactTile(iTileIndex); worldX = currentWorldX; @@ -208,32 +208,32 @@ public class Player extends Entity { } public void damageMonster(int index, int attack) { if(index == 999) return; - if(panel.monster[index].invincible) return; + if(panel.monster[panel.currentMap.getIndex()][index].invincible) return; - int damage = attack - panel.monster[index].defense; + int damage = attack - panel.monster[panel.currentMap.getIndex()][index].defense; if(damage > 0) { panel.playSE(5); - panel.monster[index].life -= damage; - panel.monster[index].invincible = true; + panel.monster[panel.currentMap.getIndex()][index].life -= damage; + panel.monster[panel.currentMap.getIndex()][index].invincible = true; } - panel.monster[index].damageReaction(); - if(panel.monster[index].life <= 0) { - panel.monster[index].dying = true; - panel.ui.addMessage("Gained +" + panel.monster[index].exp + " XP!"); - exp += panel.monster[index].exp; + panel.monster[panel.currentMap.getIndex()][index].damageReaction(); + if(panel.monster[panel.currentMap.getIndex()][index].life <= 0) { + panel.monster[panel.currentMap.getIndex()][index].dying = true; + panel.ui.addMessage("Gained +" + panel.monster[panel.currentMap.getIndex()][index].exp + " XP!"); + exp += panel.monster[panel.currentMap.getIndex()][index].exp; checkLevelUp(); } } public void interactTile(int index) { - if(index == 999 || !panel.iTile[index].destructible || panel.iTile[index].invincible) return; - if(!panel.iTile[index].meetItemReq(this)) return; - panel.iTile[index].playSE(); - panel.iTile[index].life--; - panel.iTile[index].invincible = true; - generateParticle(panel.iTile[index], panel.iTile[index]); - if(panel.iTile[index].life == 0) panel.iTile[index] = panel.iTile[index].getDestroyedForm(); + if(index == 999 || !panel.iTile[panel.currentMap.getIndex()][index].destructible || panel.iTile[panel.currentMap.getIndex()][index].invincible) return; + if(!panel.iTile[panel.currentMap.getIndex()][index].meetItemReq(this)) return; + panel.iTile[panel.currentMap.getIndex()][index].playSE(); + panel.iTile[panel.currentMap.getIndex()][index].life--; + panel.iTile[panel.currentMap.getIndex()][index].invincible = true; + generateParticle(panel.iTile[panel.currentMap.getIndex()][index], panel.iTile[panel.currentMap.getIndex()][index]); + if(panel.iTile[panel.currentMap.getIndex()][index].life == 0) panel.iTile[panel.currentMap.getIndex()][index] = panel.iTile[panel.currentMap.getIndex()][index].getDestroyedForm(); } public void interactNPC(int index) { @@ -241,7 +241,7 @@ public class Player extends Entity { //if(!panel.keyH.spacePressed) return; //Only uncomment if text should only appear if player hits space attackCancel = true; panel.gameState = GameState.DIALOGUE; - panel.npc[index].speak(); + panel.npc[panel.currentMap.getIndex()][index].speak(); } public void speak() { //This method only exists for character specific things later... @@ -293,8 +293,10 @@ public class Player extends Entity { // SETTING THINGS UP public void setDefaultValues() { - worldX = panel.tileSize * 23; - worldY = panel.tileSize * 21; +// worldX = panel.tileSize * 23; +// worldY = panel.tileSize * 21; + worldX = panel.tileSize * 12; + worldY = panel.tileSize * 13; speed = 4; direction = Direction.DOWN; diff --git a/src/de/miaurizius/jgame2d/entity/projectile/Projectile.java b/src/de/miaurizius/jgame2d/entity/projectile/Projectile.java index 9175b23..6e9a7c9 100644 --- a/src/de/miaurizius/jgame2d/entity/projectile/Projectile.java +++ b/src/de/miaurizius/jgame2d/entity/projectile/Projectile.java @@ -25,10 +25,10 @@ public class Projectile extends Entity { public void update() { if(user.type == EntityType.PLAYER) { - int monsterIndex = panel.collisionH.checkEntity(this, panel.monster); + int monsterIndex = panel.collisionH.checkEntity(this, panel.monster[panel.currentMap.getIndex()]); if(monsterIndex != 999) { panel.player.damageMonster(monsterIndex, attack); - generateParticle(user.projectile, panel.monster[monsterIndex]); + generateParticle(user.projectile, panel.monster[panel.currentMap.getIndex()][monsterIndex]); alive = false; } }