diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardAsset.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Asset.java similarity index 90% rename from Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardAsset.java rename to Projekte/mdga/client/src/main/java/pp/mdga/client/Asset.java index 23717665..7dd38eef 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardAsset.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Asset.java @@ -1,6 +1,6 @@ -package pp.mdga.client.board; +package pp.mdga.client; -enum BoardAsset { +public enum Asset { bigTent, cardStack, cir, @@ -20,43 +20,44 @@ enum BoardAsset { node_start("./node_normal/node_normal.j3o", "./node_normal/node_start_diff.png"), node_bonus("./node_normal/node_normal.j3o", "./node_normal/node_bonus_diff.png"), radar, - shieldCard, ship(0.8f), smallTent, - swapCard, tank, - turboCard, // world(1.2f), world("./world_new/world_export_new.obj", "./world_new/world_new_diff.png", 1.2f), shield_ring("./shield_ring/shield_ring.obj", null), tree_small("./tree_small/tree_small.obj", "./tree_small/tree_small_diff.png"), - tree_big("./tree_big/tree_big.obj", "./tree_big/tree_big_diff.png"); + tree_big("./tree_big/tree_big.obj", "./tree_big/tree_big_diff.png"), + turboCard, + swapCard, + shieldCard + ; private final String modelPath; private final String diffPath; private final float size; - BoardAsset() { + Asset() { String folderFileName = "./" + name() + "/" + name(); this.modelPath = folderFileName + ".j3o"; this.diffPath = folderFileName + "_diff.png"; this.size = 1f; } - BoardAsset(String modelPath, String diffPath) { + Asset(String modelPath, String diffPath) { this.modelPath = modelPath; this.diffPath = diffPath; this.size = 1f; } - BoardAsset(float size) { + Asset(float size) { String folderFileName = "./" + name() + "/" + name(); this.modelPath = folderFileName + ".j3o"; this.diffPath = folderFileName + "_diff.png"; this.size = size; } - BoardAsset(String modelPath, String diffPath, float size){ + Asset(String modelPath, String diffPath, float size){ this.modelPath = modelPath; this.diffPath = diffPath; this.size = size; diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java index 95e69fc1..a9b56664 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java @@ -6,8 +6,6 @@ import pp.mdga.client.animation.AnimationHandler; import com.jme3.system.AppSettings; import pp.mdga.client.view.*; -import pp.mdga.game.Color; -import pp.mdga.notification.TskSelectNotification; public class MdgaApp extends SimpleApplication { private AnimationHandler animationHandler; @@ -17,9 +15,9 @@ public class MdgaApp extends SimpleApplication { private ModelSyncronizer modelSyncronizer; MdgaView view = null; - private MdgaState state = MdgaState.MAIN; + private MdgaState state = MdgaState.GAME; - private static float resolutionFactor = 1; + private static float resolutionFactor = 1f; public static void main(String[] args) { AppSettings settings = new AppSettings(true); diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/AssetOnMap.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/AssetOnMap.java index 7984ad77..d78d48fd 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/AssetOnMap.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/AssetOnMap.java @@ -1,3 +1,5 @@ package pp.mdga.client.board; -record AssetOnMap(BoardAsset asset, int x, int y, float rot) {} +import pp.mdga.client.Asset; + +record AssetOnMap(Asset asset, int x, int y, float rot) {} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardHandler.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardHandler.java index 3dd97499..acfd4090 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardHandler.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardHandler.java @@ -1,13 +1,13 @@ package pp.mdga.client.board; import com.jme3.material.Material; -import com.jme3.math.ColorRGBA; import com.jme3.math.Vector3f; import com.jme3.post.FilterPostProcessor; import com.jme3.renderer.queue.RenderQueue; import com.jme3.scene.Node; import com.jme3.scene.Spatial; import com.jme3.scene.control.AbstractControl; +import pp.mdga.client.Asset; import pp.mdga.client.MdgaApp; import pp.mdga.game.Color; @@ -70,10 +70,10 @@ private void initMap() { for (AssetOnMap assetOnMap : assetOnMaps) { switch (assetOnMap.asset()) { - case lw -> addFigureToPlayerMap(assetToColor(BoardAsset.lw), assetOnMap); - case heer -> addFigureToPlayerMap(assetToColor(BoardAsset.heer), assetOnMap); - case cir -> addFigureToPlayerMap(assetToColor(BoardAsset.cir), assetOnMap); - case marine -> addFigureToPlayerMap(assetToColor(BoardAsset.marine), assetOnMap); + case lw -> addFigureToPlayerMap(assetToColor(Asset.lw), assetOnMap); + case heer -> addFigureToPlayerMap(assetToColor(Asset.heer), assetOnMap); + case cir -> addFigureToPlayerMap(assetToColor(Asset.cir), assetOnMap); + case marine -> addFigureToPlayerMap(assetToColor(Asset.marine), assetOnMap); case node_normal, node_bonus, node_start -> infield.add(displayAndControl(assetOnMap, new NodeControl())); case node_home_black -> addHomeNode(homeNodesMap, Color.AIRFORCE, assetOnMap); @@ -90,7 +90,7 @@ private void initMap() { } } - private Color assetToColor(BoardAsset asset) { + private Color assetToColor(Asset asset) { return switch (asset) { case lw -> Color.AIRFORCE; case heer -> Color.ARMY; @@ -100,7 +100,7 @@ private Color assetToColor(BoardAsset asset) { }; } - private Spatial createModel(BoardAsset asset, Vector3f pos, float rot) { + private Spatial createModel(Asset asset, Vector3f pos, float rot) { String modelName = asset.getModelPath(); String texName = asset.getDiffPath(); Spatial model = app.getAssetManager().loadModel(modelName); diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/CameraHandler.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/CameraHandler.java index d523e6d6..ba4ab0d6 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/CameraHandler.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/CameraHandler.java @@ -33,7 +33,7 @@ public CameraHandler(MdgaApp app, FilterPostProcessor fpp){ public void init() { app.getFlyByCamera().setEnabled(true); - int zoom = 15; + int zoom = 20; app.getCamera().setLocation(new Vector3f(-zoom, 0, zoom)); app.getCamera().lookAt(new Vector3f(0, 0, 0), new Vector3f(0, 0, 1)); diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/MapLoader.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/MapLoader.java index 203f7fb4..8f57623f 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/MapLoader.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/MapLoader.java @@ -1,5 +1,8 @@ package pp.mdga.client.board; + +import pp.mdga.client.Asset; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -43,7 +46,7 @@ public static List loadMap(String mapName) { float rot = Float.parseFloat(parts[2]); - BoardAsset asset = getLoadedAsset(assetName); + Asset asset = getLoadedAsset(assetName); assetsOnMap.add(new AssetOnMap(asset, x, y, rot)); } } @@ -57,32 +60,32 @@ public static List loadMap(String mapName) { return assetsOnMap; } - private static BoardAsset getLoadedAsset(String assetName) { + private static Asset getLoadedAsset(String assetName) { return switch (assetName) { - case "lw" -> BoardAsset.lw; - case "cir" -> BoardAsset.cir; - case "marine" -> BoardAsset.marine; - case "heer" -> BoardAsset.heer; - case "node" -> BoardAsset.node_normal; - case "node_start" -> BoardAsset.node_start; - case "node_bonus" -> BoardAsset.node_bonus; - case "node_home_blue" -> BoardAsset.node_home_blue; - case "node_home_yellow" -> BoardAsset.node_home_yellow; - case "node_home_black" -> BoardAsset.node_home_black; - case "node_home_green" -> BoardAsset.node_home_green; - case "node_wait_blue" -> BoardAsset.node_wait_blue; - case "node_wait_yellow" -> BoardAsset.node_wait_yellow; - case "node_wait_black" -> BoardAsset.node_wait_black; - case "node_wait_green" -> BoardAsset.node_wait_green; - case "world" -> BoardAsset.world; - case "jet" -> BoardAsset.jet; - case "big_tent" -> BoardAsset.bigTent; - case "small_tent" -> BoardAsset.smallTent; - case "radar" -> BoardAsset.radar; - case "ship" -> BoardAsset.ship; - case "tank" -> BoardAsset.tank; - case "tree_small" -> BoardAsset.tree_small; - case "tree_big" -> BoardAsset.tree_big; + case "lw" -> Asset.lw; + case "cir" -> Asset.cir; + case "marine" -> Asset.marine; + case "heer" -> Asset.heer; + case "node" -> Asset.node_normal; + case "node_start" -> Asset.node_start; + case "node_bonus" -> Asset.node_bonus; + case "node_home_blue" -> Asset.node_home_blue; + case "node_home_yellow" -> Asset.node_home_yellow; + case "node_home_black" -> Asset.node_home_black; + case "node_home_green" -> Asset.node_home_green; + case "node_wait_blue" -> Asset.node_wait_blue; + case "node_wait_yellow" -> Asset.node_wait_yellow; + case "node_wait_black" -> Asset.node_wait_black; + case "node_wait_green" -> Asset.node_wait_green; + case "world" -> Asset.world; + case "jet" -> Asset.jet; + case "big_tent" -> Asset.bigTent; + case "small_tent" -> Asset.smallTent; + case "radar" -> Asset.radar; + case "ship" -> Asset.ship; + case "tank" -> Asset.tank; + case "tree_small" -> Asset.tree_small; + case "tree_big" -> Asset.tree_big; default -> throw new IllegalStateException("Unexpected value: " + assetName); }; } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/PieceControl.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/PieceControl.java index f54aa33c..112268a1 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/PieceControl.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/PieceControl.java @@ -14,6 +14,7 @@ import com.jme3.scene.Node; import com.jme3.scene.Spatial; import com.jme3.scene.control.AbstractControl; +import pp.mdga.client.Asset; import pp.mdga.client.MdgaApp; import pp.mdga.client.board.Outline.SelectObjectOutliner; @@ -107,7 +108,7 @@ public void rotateInit() { } public void activateShield(){ - shieldRing = assetManager.loadModel(BoardAsset.shield_ring.getModelPath()); + shieldRing = assetManager.loadModel(Asset.shield_ring.getModelPath()); shieldRing.scale(1f); shieldRing.rotate((float) Math.toRadians(0), 0, (float) Math.toRadians(0)); shieldRing.setLocalTranslation(spatial.getLocalTranslation().add(new Vector3f(0,0,SHIELD_Z))); diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/CardControl.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/CardControl.java new file mode 100644 index 00000000..15ac8cf6 --- /dev/null +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/CardControl.java @@ -0,0 +1,23 @@ +package pp.mdga.client.gui; + +import com.jme3.renderer.RenderManager; +import com.jme3.renderer.ViewPort; +import com.jme3.scene.control.AbstractControl; + +public class CardControl extends AbstractControl { + + public CardControl(){ + + } + + + @Override + protected void controlUpdate(float tpf) { + + } + + @Override + protected void controlRender(RenderManager rm, ViewPort vp) { + + } +} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/CardLayer.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/CardLayer.java new file mode 100644 index 00000000..cce20aa5 --- /dev/null +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/CardLayer.java @@ -0,0 +1,77 @@ +package pp.mdga.client.gui; + +import com.jme3.app.Application; +import com.jme3.app.state.AbstractAppState; +import com.jme3.app.state.AppStateManager; +import com.jme3.material.Material; +import com.jme3.math.Vector3f; +import com.jme3.renderer.Camera; +import com.jme3.renderer.RenderManager; +import com.jme3.renderer.ViewPort; +import com.jme3.scene.Node; +import com.jme3.scene.Spatial; +import pp.mdga.client.Asset; + +import java.util.*; + +public class CardLayer extends AbstractAppState { + + private Node root; + private Application app; + private boolean init; + + private List cardBuffer; + + + public CardLayer() { + this.cardBuffer = new ArrayList<>(); + init = false; + } + + @Override + public void initialize(AppStateManager stateManager, Application app ) { + this.app = app; + root = new Node("Under gui viewport Root"); + + Camera originalCam = app.getCamera(); + + Camera cam = new Camera(originalCam.getWidth(), originalCam.getHeight()); + cam.setParallelProjection(false); + cam.setFrustum(originalCam.getFrustumNear(), originalCam.getFrustumFar(), originalCam.getFrustumLeft(), originalCam.getFrustumRight(),originalCam.getFrustumTop(), originalCam.getFrustumBottom()); + cam.setFov(originalCam.getFov()); + cam.setLocation(new Vector3f(0, 0, 10)); + cam.lookAt(new Vector3f(0,0,0), Vector3f.UNIT_Y); + + ViewPort view = app.getRenderManager().createMainView("Under gui ViewPort", cam); + view.setEnabled(true); + view.setClearFlags(false, true, false); + view.attachScene(root); + + if(!init) init = true; + + + } + + + + @Override + public void render(RenderManager rm) { + root.updateGeometricState(); + } + + @Override + public void update( float tpf ) { + root.updateLogicalState(tpf); + + if (init && !cardBuffer.isEmpty()) { + for(Spatial spatial : cardBuffer){ + root.attachChild(spatial); + } + cardBuffer.clear(); + } + } + + public void addCard(Spatial card){ + cardBuffer.add(card); + } +} \ No newline at end of file diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/GuiHandler.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/GuiHandler.java index ca637feb..c4acdd2e 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/GuiHandler.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/gui/GuiHandler.java @@ -1,5 +1,70 @@ package pp.mdga.client.gui; +import com.jme3.material.Material; +import com.jme3.math.Vector3f; +import com.jme3.scene.Spatial; +import pp.mdga.client.Asset; +import pp.mdga.client.MdgaApp; +import pp.mdga.game.BonusCard; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + + public class GuiHandler { + private MdgaApp app; + private CardLayer cardLayer; + private Map ownCardsMap; + + private static final Vector3f START = new Vector3f(-3,-3,0); + private static final Vector3f MARGIN = new Vector3f(2.5f,0,0); + + public GuiHandler(MdgaApp app) { + this.app = app; + } + + public void init(){ + cardLayer = new CardLayer(); + app.getStateManager().attach(cardLayer); + ownCardsMap = new HashMap<>(); + + addCard(BonusCard.SHIELD, UUID.randomUUID()); + addCard(BonusCard.TURBO, UUID.randomUUID()); + addCard(BonusCard.SWAP, UUID.randomUUID()); + + } + + private Asset bonusToAsset(BonusCard card){ + return switch (card){ + case TURBO -> Asset.turboCard; + case SHIELD -> Asset.shieldCard; + case SWAP -> Asset.swapCard; + case HIDDEN -> throw new RuntimeException("HIDDEN is not allowed in GUI"); + }; + } + + public void addCard(BonusCard card, UUID uuid) { + CardControl control = createCard(bonusToAsset(card), nextPos()); + ownCardsMap.put(uuid, control); + cardLayer.addCard(control.getSpatial()); + } + + private Vector3f nextPos() { + return START.add(MARGIN.mult(ownCardsMap.size())); + } + + private CardControl createCard(Asset card, Vector3f pos){ + Spatial spatial = app.getAssetManager().loadModel(card.getModelPath()); + Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); + mat.setTexture("ColorMap", app.getAssetManager().loadTexture(card.getDiffPath())); + spatial.setMaterial(mat); + spatial.setLocalScale(1f); + spatial.setLocalTranslation(pos); + spatial.rotate((float)Math.toRadians(90), (float)Math.toRadians(180), (float)Math.toRadians(180)); + CardControl control = new CardControl(); + spatial.addControl(control); + return control; + } } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/view/GameView.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/view/GameView.java index 8f4af0e6..e04f520f 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/view/GameView.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/view/GameView.java @@ -7,10 +7,17 @@ import pp.mdga.client.dialog.SingleButtonRightDialog; import pp.mdga.client.MdgaApp; import pp.mdga.client.MdgaState; +import pp.mdga.client.gui.GuiHandler; +import pp.mdga.game.Color; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; public class GameView extends MdgaView { private BoardHandler boardHandler; private CameraHandler camera; + private GuiHandler guiHandler; private SingleButtonLeftDialog leaveButton; private SingleButtonRightDialog continueButton; @@ -24,6 +31,8 @@ public GameView(MdgaApp app) { this.boardHandler = new BoardHandler(app, fpp); app.getViewPort().addProcessor(fpp); + this.guiHandler = new GuiHandler(app); + leaveButton = new SingleButtonLeftDialog(app, settingsNode, "Verlassen", () -> leaveGame()); continueButton = new SingleButtonRightDialog(app, node, "Weiter", () -> app.getModelSyncronizer().enter(MdgaState.CEREMONY)); @@ -33,8 +42,9 @@ public GameView(MdgaApp app) { public void onEnter() { camera.init(); boardHandler.init(); - + guiHandler.init(); continueButton.show(); + } @Override diff --git a/Projekte/mdga/model/src/main/java/pp.mdga/game/BonusCard.java b/Projekte/mdga/model/src/main/java/pp.mdga/game/BonusCard.java index 42779b90..4b4f5e47 100644 --- a/Projekte/mdga/model/src/main/java/pp.mdga/game/BonusCard.java +++ b/Projekte/mdga/model/src/main/java/pp.mdga/game/BonusCard.java @@ -1,7 +1,7 @@ package pp.mdga.game; public enum BonusCard { - HIDDERN, + HIDDEN, SHIELD, TURBO, SWAP