From c0ef02df49b1f110b0db1016e0eedd163047df04 Mon Sep 17 00:00:00 2001 From: Aaron <rudkowsk@uni-bremen.de> Date: Sat, 11 Jul 2020 18:34:06 +0100 Subject: [PATCH] controller als singleton, crew in views --- core/assets/crew/background.png | Bin 0 -> 6364 bytes .../ClientControllerCommunicator.java | 9 ++ .../Controller/BattleController.java | 1 + .../Controller/CrewController.java | 16 +++- .../Controller/HangerController.java | 11 ++- .../Controller/TraderController.java | 29 +++--- .../Controller/TravelController.java | 11 ++- .../Server/Services/TraderService.java | 4 +- ...smissButton.java => CrewSelectButton.java} | 4 +- .../View/Screen/GamePlay.java | 59 +++--------- .../View/UI/Ship/ShipView.java | 59 ++++++++---- .../View/UI/ShipInformation/CrewUI.java | 89 +++++++++++------- .../View/UI/ShipInformation/RoomUI.java | 13 +-- database.mv.db | Bin 53248 -> 53248 bytes 14 files changed, 175 insertions(+), 130 deletions(-) create mode 100644 core/assets/crew/background.png rename core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/{CrewDismissButton.java => CrewSelectButton.java} (89%) diff --git a/core/assets/crew/background.png b/core/assets/crew/background.png new file mode 100644 index 0000000000000000000000000000000000000000..6940a39e42533fe79f1bd917d04d58f458e0c3e4 GIT binary patch literal 6364 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 literal 0 HcmV?d00001 diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/ClientControllerCommunicator.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/ClientControllerCommunicator.java index 114c48ab..f9ae6b7f 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/ClientControllerCommunicator.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/ClientControllerCommunicator.java @@ -1,5 +1,6 @@ package com.galaxytrucker.galaxytruckerreloaded.Communication; +import com.galaxytrucker.galaxytruckerreloaded.Controller.*; import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Overworld; import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet; import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; @@ -58,6 +59,10 @@ public class ClientControllerCommunicator { return permittedLogin; } + /** + * Issue logout request + * @return true if the user was succesfully logged out + */ public boolean logout() { try { RequestObject requestObject = new RequestObject(); @@ -78,6 +83,10 @@ public class ClientControllerCommunicator { if (singleton == null){ singleton = new ClientControllerCommunicator(client); } + CrewController.getInstance(singleton); + HangerController.getInstance(); + TraderController.getInstance(singleton); + TravelController.getInstance(singleton); // TODO CREATE ALL CONTROLLERS HERE, all controllers should be singletons return singleton; } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/BattleController.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/BattleController.java index f779b660..9da29831 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/BattleController.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/BattleController.java @@ -8,6 +8,7 @@ import lombok.*; @Setter @RequiredArgsConstructor(access = AccessLevel.PUBLIC) public class BattleController extends Controller{ + @NonNull private Ship myself; diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/CrewController.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/CrewController.java index 9ef3d096..29cea0ec 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/CrewController.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/CrewController.java @@ -12,15 +12,29 @@ import lombok.*; @Getter @Setter -@RequiredArgsConstructor(access = AccessLevel.PUBLIC) +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) public class CrewController extends Controller { + private static CrewController singleton; + /** * ClientControllerCommunicator */ @NonNull private ClientControllerCommunicator clientControllerCommunicator; + /** + * return the instance of this singleton + * @param communicator the communicator + * @return the singleton instance + */ + public static CrewController getInstance(ClientControllerCommunicator communicator) { + if(singleton == null) { + singleton = new CrewController(communicator); + } + return singleton; + } + /** * Move a crew member to a different section * diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/HangerController.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/HangerController.java index e8b677f1..83b4bb30 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/HangerController.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/HangerController.java @@ -7,9 +7,18 @@ import lombok.Setter; @Getter @Setter -@RequiredArgsConstructor(access = AccessLevel.PUBLIC) +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) public class HangerController extends Controller { + private static HangerController singleton; + + public static HangerController getInstance() { + if(singleton == null) { + singleton = new HangerController(); + } + return singleton; + } + /** * Picks a Shipmodel * @param username - the specified username diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TraderController.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TraderController.java index 70687733..5eee83c3 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TraderController.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TraderController.java @@ -16,22 +16,27 @@ import java.util.List; @Getter @Setter -@RequiredArgsConstructor(access = AccessLevel.PUBLIC) +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) public class TraderController extends Controller{ - /** the trader */ - @NonNull - private Trader trader; - /** ClientControllerCommunicator */ @NonNull private ClientControllerCommunicator clientControllerCommunicator; + private static TraderController singleton; + + public static TraderController getInstance(ClientControllerCommunicator communicator) { + if(singleton == null) { + singleton = new TraderController(communicator); + } + return singleton; + } + /** * Buy a weapon from the trader * @param weapon - the weapon to buy */ - public boolean purchaseWeapon(Weapon weapon) { + public boolean purchaseWeapon(Trader trader, Weapon weapon) { try { RequestObject requestObject = new RequestObject(); requestObject.setWeapon(weapon); @@ -65,7 +70,7 @@ public class TraderController extends Controller{ * Buy crew from a trader * @param crew - the crew to buy */ - public boolean purchaseCrew(Crew crew) { + public boolean purchaseCrew(Trader trader, Crew crew) { try { RequestObject requestObject = new RequestObject(); requestObject.setRequestType(RequestType.TRADERBUYCREW); @@ -98,7 +103,7 @@ public class TraderController extends Controller{ * Buy rockets from the trader * @param amount - the amount of rockets to buy */ - public boolean purchaseRockets(int amount) { + public boolean purchaseRockets(Trader trader, int amount) { try { RequestObject requestObject = new RequestObject(); requestObject.setRequestType(RequestType.TRADERBUYROCKETS); @@ -130,7 +135,7 @@ public class TraderController extends Controller{ * Buy fuel from the trader * @param amount - the amount of fuel to buy */ - public boolean purchaseFuel( int amount) { + public boolean purchaseFuel(Trader trader, int amount) { try { RequestObject requestObject = new RequestObject(); requestObject.setShip(clientControllerCommunicator.getClientShip()); @@ -162,7 +167,7 @@ public class TraderController extends Controller{ * Buy health from the trader * @param amount - the amount to buy */ - public boolean purchaseHP(int amount) { + public boolean purchaseHP(Trader trader, int amount) { try { RequestObject requestObject = new RequestObject(); requestObject.setShip(clientControllerCommunicator.getClientShip()); @@ -194,7 +199,7 @@ public class TraderController extends Controller{ * Sell weapon to the trader * @param weapon the weapon */ - public boolean sellWeapon(Weapon weapon) { + public boolean sellWeapon(Trader trader, Weapon weapon) { try { RequestObject requestObject = new RequestObject(); requestObject.setShip(clientControllerCommunicator.getClientShip()); @@ -228,7 +233,7 @@ public class TraderController extends Controller{ * sell rockets to the trader * @param amount the amount of rockets */ - public boolean sellRockets(int amount) { + public boolean sellRockets(Trader trader, int amount) { try { RequestObject requestObject = new RequestObject(); requestObject.setShip(clientControllerCommunicator.getClientShip()); diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TravelController.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TravelController.java index 85f240ae..67ea4a37 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TravelController.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TravelController.java @@ -12,13 +12,22 @@ import java.util.List; @Getter @Setter -@RequiredArgsConstructor(access = AccessLevel.PUBLIC) +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) public class TravelController extends Controller{ /** ClientControllerCommunicator */ @NonNull private ClientControllerCommunicator clientControllerCommunicator; + private static TravelController singleton; + + public static TravelController getInstance(ClientControllerCommunicator communicator) { + if(singleton == null) { + singleton = new TravelController(communicator); + } + return singleton; + } + /** * travels from one location to another * @param destination - the destination diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/TraderService.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/TraderService.java index b6f34195..38fd9243 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/TraderService.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/TraderService.java @@ -121,7 +121,7 @@ public class TraderService extends PlanetEventService { ship.setCoins(shipCoins - crew.getPrice()); //List<Crew> shipCrew = ship. TODO wie crew von schiff? //set current Room - crew.setCurrentRoom(ship.getSystems().get(0)); //TODO in welchen raum setzen? + crew.setCurrentRoom(ship.getSystems().get(0)); crew.setAssociatedUser(ship.getAssociatedUser()); crewDAO.update(crew); return true; @@ -133,7 +133,7 @@ public class TraderService extends PlanetEventService { trader.setCrewStock(traderCrew); traderDAO.update(trader); //set current Room - crew.setCurrentRoom(null); //TODO ? + crew.setCurrentRoom(null); crew.setAssociatedUser(user); crewDAO.update(crew); //remove from ship? diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/CrewDismissButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/CrewSelectButton.java similarity index 89% rename from core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/CrewDismissButton.java rename to core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/CrewSelectButton.java index df0ca863..a0cb3700 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/CrewDismissButton.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/CrewSelectButton.java @@ -15,7 +15,7 @@ import com.galaxytrucker.galaxytruckerreloaded.View.UI.ShipInformation.CrewUI; /** * Button for dismissing a Crew Member */ -public class CrewDismissButton extends ImButton +public class CrewSelectButton extends ImButton { /** * Background @@ -38,7 +38,7 @@ public class CrewDismissButton extends ImButton * * @param crew the crew member */ - public CrewDismissButton(Texture texture, float x, float y, float width, float height, int crew, CrewUI ui) { + public CrewSelectButton(Texture texture, float x, float y, float width, float height, int crew, CrewUI ui) { super(texture, x, y, width, height); this.crewID = crew; this.ui = ui; diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/GamePlay.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/GamePlay.java index 0d73a906..d6df9e94 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/GamePlay.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/GamePlay.java @@ -10,6 +10,8 @@ import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.utils.viewport.FitViewport; import com.badlogic.gdx.utils.viewport.Viewport; +import com.galaxytrucker.galaxytruckerreloaded.Communication.ClientControllerCommunicator; +import com.galaxytrucker.galaxytruckerreloaded.Controller.TravelController; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew; import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Overworld; @@ -144,48 +146,11 @@ public class GamePlay implements Screen { stage = new Stage(viewport); pauseStage = new Stage(viewport); - player = new ShipView(main, main.getClient().getMyShip(), stage, main.getClient().getOverworld(), this); //TODO wie schiff aus controller? + player = new ShipView(main, main.getClient().getMyShip(), stage, main.getClient().getOverworld(), this); Gdx.input.setInputProcessor(stage); } - //TODO only for testing - public Ship fakeShip(){ - Trader trader = new Trader(); - //Planet planet = new Planet("planet", 125f, 125f, PlanetEvent.SHOP, false, new LinkedList<>(), trader); - Planet planet = new Planet(); - List<Room> rooms = new LinkedList<>(); -// rooms.add(new BlankRoom()); -// rooms.add(new BlankRoom()); -// rooms.add(new BlankRoom()); - List<Weapon> weapons = new LinkedList<>(); -// weapons.add(new LaserBlaster("karl")); -// weapons.add(new LaserBlaster("test")); - return new Ship(1, "aaron", ShipType.DEFAULT, 100, 49, 5, 5, 7, 9, 23, 6f, planet, 6, 6, rooms, weapons, false); - } - - /** - * später durch laden aus controller ersetzen - */ - public Overworld fakeMap() { - Overworld res = main.getClient().getOverworld(); - - HashMap<String, Planet> hmap = new HashMap<>(); - - - Planet sp = new Planet(0, "planet1", (float) 78, (float) 199, PlanetEvent.SHOP, new LinkedList<Ship>()); - String f = "78, 199"; - hmap.put(f, sp); - Planet sp1 = new Planet(1, "planet2", (float) 200, (float) 154, PlanetEvent.COMBAT, new LinkedList<Ship>()); - String f1 = "200, 154"; - hmap.put(f1, sp1); - //TODO - //res.setPlanetMap(hmap); - res.setStartPlanet(sp); - - return res; - } - @Override public void show() { @@ -271,7 +236,7 @@ public class GamePlay implements Screen { * @return whether or not it is a valid request */ public boolean travel(Planet planet) { - boolean success = true; //TODO call to controller + boolean success = TravelController.getInstance(null).travel(planet); //Communicator can be null since already created, so never used if(success) { createEvent(planet.getEvent()); if(planet.getEvent() == PlanetEvent.SHOP) { @@ -534,14 +499,14 @@ public class GamePlay implements Screen { * @param crew the id of the crew member * @param room the new room */ - public void crewMoved(int crew, Room room) {} //call controller, ask for permission + public void crewMoved(Crew crew, Room room) {} //call controller, ask for permission /** * update the health of a crew member * @param crew the crew member * @param health the new health */ - public void crewHealth(int crew, int health) { player.crewHealth(crew, health); } + public void crewHealth(Crew crew, int health) { player.crewHealth(crew, health); } /** * update the energy status of the overall energy not yet assigned to a system @@ -559,7 +524,7 @@ public class GamePlay implements Screen { * the player has chosen a new amount of energy for a system * @param amount how much should be subtracted/added */ - public void roomSystemEnergyChosen(int id, int amount) { + public void roomSystemEnergyChosen(Room room, int amount) { //call controller } @@ -567,17 +532,17 @@ public class GamePlay implements Screen { * the energy for a system is updated * @param amount the new total amount */ - public void roomSystemEnergyUpdate(int id, int amount) { - player.roomSystemEnergyUpdate(id, amount); + public void roomSystemEnergyUpdate(Room room, int amount) { + player.roomSystemEnergyUpdate(room, amount); } /** * update the status of a system - * @param id the id of the system + * @param room the system * @param amount the new status */ - public void roomSystemStatusUpdate(int id, int amount) { - player.roomSystemStatusUpdate(id, amount); + public void roomSystemStatusUpdate(Room room, int amount) { + player.roomSystemStatusUpdate(room, amount); } /** diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/ShipView.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/ShipView.java index bfb38d30..daf5303d 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/ShipView.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/ShipView.java @@ -3,6 +3,7 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.scenes.scene2d.Stage; import com.galaxytrucker.galaxytruckerreloaded.Main; +import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew; import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Overworld; import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet; import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; @@ -16,6 +17,7 @@ import com.galaxytrucker.galaxytruckerreloaded.View.UI.Inventory.InventoryUI; import com.galaxytrucker.galaxytruckerreloaded.View.UI.Map.MapUI; import com.galaxytrucker.galaxytruckerreloaded.View.UI.ShipInformation.*; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -94,14 +96,24 @@ public class ShipView extends AbstractShip { */ public ShipView(Main main, Ship ship, Stage stage, Overworld map, GamePlay game) { super(main, ship, stage, game); - //java.util.List crew = ship.get ?? + + List<Crew> crews = new ArrayList<>(); + for(Room r : ship.getSystems()) { + crews.addAll(r.getCrew()); + } + crew = new HashMap<>(); + float cy = main.HEIGHT - 150; + for(Crew c : crews) { + crew.put(c.getId(), new CrewUI(main, c, stage, ship, this, 30, cy)); + cy -= 60; + } this.map = map; rooms = new HashMap<>(); - List<Room> existingRooms = ship.getSystems(); - for(Room r : existingRooms) { - //TODO wie system das zu raum gehört? dann sys id als key, roomui als value + List<Room> existingSystems = ship.getSystems(); + for(Room r : existingSystems) { + } moveButton = new MoveButton(850, main.HEIGHT - 90, 150, 92, this); @@ -127,8 +139,8 @@ public class ShipView extends AbstractShip { public void render() { main.batch.begin(); - main.batch.draw(shipBackground, main.WIDTH -1730, main.HEIGHT/2 - shipBackground.getHeight()/2 - 200, 1000, 1000); - main.batch.draw(shipRoomBackground, main.WIDTH -1500, main.HEIGHT/2 - shipRoomBackground.getHeight()/2 - 100, 550, 550); + main.batch.draw(shipBackground, 70, main.HEIGHT/2 - shipBackground.getHeight()/2, shipBackground.getWidth(), shipBackground.getHeight()); + main.batch.draw(shipRoomBackground, (70 + shipBackground.getWidth()/2) - shipRoomBackground.getWidth()/2, main.HEIGHT/2 - shipRoomBackground.getHeight()/2, shipRoomBackground.getWidth(), shipRoomBackground.getHeight()); main.batch.draw(weaponGeneralBackground, 700, 100, 328, 90); main.batch.end(); @@ -146,6 +158,10 @@ public class ShipView extends AbstractShip { for(RoomUI r : rooms.values()) { r.render(); } + + for(CrewUI c : crew.values()) { + c.render(); + } } /** @@ -166,6 +182,9 @@ public class ShipView extends AbstractShip { for(RoomUI r : rooms.values()) { r.disposeRoomUI(); } + for(CrewUI c : crew.values()) { + c.disposeCrewUI(); + } } /** @@ -237,24 +256,24 @@ public class ShipView extends AbstractShip { /** * a crew member is moved to a new room * called by crew ui after player attempts to move a crew - * @param crewid the id of the crew member + * @param crew the crew member * @param room the new room */ - public void crewMoved(int crewid, Room room) { - game.crewMoved(crewid, room); + public void crewMoved(Crew crew, Room room) { + game.crewMoved(crew, room); } /** * crew member health update. called by game - * @param crewid the crew member + * @param crew the crew member * @param health the new health */ - public void crewHealth(int crewid, int health) { + public void crewHealth(Crew crew, int health) { if(health == 0) { - crew.get(crewid).crewDied(); + this.crew.get(crew.getId()).crewDied(); } else { - crew.get(crewid).statusUpdate(health); + this.crew.get(crew.getId()).statusUpdate(health); } } @@ -266,25 +285,25 @@ public class ShipView extends AbstractShip { * update the energy of a system in a room * @param amount the new total amount */ - public void roomSystemEnergyUpdate(int sysid, int amount) { - rooms.get(sysid).systemEnergyUpdate(amount); + public void roomSystemEnergyUpdate(Room room, int amount) { + rooms.get(room.getId()).systemEnergyUpdate(amount); } /** * update the status of a system in a room - * @param sysid the system id + * @param room the system * @param amount the new status */ - public void roomSystemStatusUpdate(int sysid, int amount) { - rooms.get(sysid).systemStatusUpdate(amount); + public void roomSystemStatusUpdate(Room room, int amount) { + rooms.get(room.getId()).systemStatusUpdate(amount); } /** * the player has chosen a new amount of energy * @param amount how much should be subtracted/added */ - public void roomSystemEnergyChosen(int id, int amount) { - game.roomSystemEnergyChosen(id, amount); + public void roomSystemEnergyChosen(Room room, int amount) { + game.roomSystemEnergyChosen(room, amount); } /** diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/CrewUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/CrewUI.java index 260d5c05..bbe7d72b 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/CrewUI.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/CrewUI.java @@ -2,17 +2,20 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.ShipInformation; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.GlyphLayout; +import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator; import com.badlogic.gdx.scenes.scene2d.Stage; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew; -import java.util.LinkedList; import java.util.List; import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Room; -import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.CrewDismissButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.CrewSelectButton; import com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship.ShipView; /** @@ -47,59 +50,73 @@ public class CrewUI { * button to click to send the crew to another room. After the button is clicked, * the player needs to click on a room in their own ship */ - private CrewDismissButton crewButton; + private CrewSelectButton crewButton; /** - * the name of the crew member + * the background box */ - private String name; + private Texture background; /** - * id of the crew member + * the crew member displayed with this ui */ - private int id; + private Crew crew; /** - * the current health of the crew member + * the main class */ - private int health; + private Main main; /** - * the maximum health of the crew member + * rooms of the ship */ - private int maxhealth; + private List<Room> rooms; /** - * the main class + * the shipview of this crewui */ - private Main main; + private ShipView shipView; /** - * the stage for buttons + * the x position of the picture of the crew member in the upper left corner */ - private Stage stage; + private float x; /** - * rooms of the ship + * the y position of the picture of the crew member in the upper left corner */ - private List<Room> rooms; + private float y; - private ShipView shipView; + private BitmapFont font; + + private GlyphLayout glyph = new GlyphLayout(); /** * constructor * @param main the main class * @param crew the crew member */ - public CrewUI(Main main, Crew crew, Stage stage, Ship ship, ShipView shipView) { + public CrewUI(Main main, Crew crew, Stage stage, Ship ship, ShipView shipView, float x, float y) { this.main = main; - this.stage = stage; + this.crew = crew; this.shipView = shipView; - - name = crew.getName(); - maxhealth = crew.getMaxhealth(); - health = crew.getHealth(); - id = crew.getId(); + this.x = x; + this.y = y; + + //font generator to get bitmapfont from .ttf file + FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.local("fonts/JustinFont11Bold.ttf")); + FreeTypeFontGenerator.FreeTypeFontParameter params = new FreeTypeFontGenerator.FreeTypeFontParameter(); + //setting parameters of font + params.borderWidth = 1; + params.borderColor = Color.BLACK; + params.characters = FreeTypeFontGenerator.DEFAULT_CHARS; + params.magFilter = Texture.TextureFilter.Nearest; + params.minFilter = Texture.TextureFilter.Nearest; + params.genMipMaps = true; + params.size = 15; + + font = generator.generateFont(params); + glyph.setText(font, crew.getName()); if(crew.getName().equals("ana")) { crewImage = new Texture("crew/anaerobic.png"); @@ -108,18 +125,20 @@ public class CrewUI { crewImage = new Texture("crew/battle.png"); } else { - crewImage = new Texture("crew/energy.png"); //TODO wie sieht das mit namen aus? + crewImage = new Texture("crew/energy.png"); } - crewButton = new CrewDismissButton(crewImage, 0, 0, 10, 10, crew.getId(), this); + crewButton = new CrewSelectButton(crewImage, x, y+15, 50, 50, crew.getId(), this); stage.addActor(crewButton); - crewInShip = crewImage; //TODO for now + crewInShip = crewImage; crewStatus = new Texture("gameuis/energybar.png"); box = new Texture("crew/health_box.png"); + background = new Texture("crew/background.png"); + currentTexture = 10; rooms = ship.getSystems(); @@ -143,12 +162,14 @@ public class CrewUI { */ public void render() { main.batch.begin(); + main.batch.draw(background, x, y, 200, 55); + font.draw(main.batch, glyph, x + 55, y + 40); main.batch.draw(crewInShip, 0, 0, 0, 0); //TODO whxy - main.batch.draw(box, 0, 0, 10, 10); //TODO xywh - float x=0; + main.batch.draw(box, x + 35, y +5, 140, 20); + float ex=x+55; for(int i=0;i<=currentTexture;i++) { - main.batch.draw(crewStatus, x, 0, 0, 0); //TODO whxy - x+=5; + main.batch.draw(crewStatus, ex, y+13, 8.75f, 5); + ex+=8.75; } main.batch.end(); } @@ -160,7 +181,7 @@ public class CrewUI { * @param room the new room */ public void crewMoved(Room room) { - shipView.crewMoved(id, room); + shipView.crewMoved(crew, room); } /** @@ -209,7 +230,7 @@ public class CrewUI { * @param status the new status */ public void statusUpdate(int status) { - int percent = status/maxhealth; + int percent = status/crew.getMaxhealth(); currentTexture = percent * 10; //adapt currentTexture according to amount of textures we end up having } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/RoomUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/RoomUI.java index 069ce529..bec9dde3 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/RoomUI.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/RoomUI.java @@ -27,15 +27,7 @@ public class RoomUI { */ private Texture roomLowOxyTexture; - /** - * Höhe des Raumes. Räume sind immer rechteckig. - */ - private int height; - - /** - * Weite des Raumes. Räume sind immer rechteckig. - */ - private int width; + private Room room; private Main main; @@ -49,6 +41,7 @@ public class RoomUI { */ public RoomUI(Main main, Room room, Stage stage, ShipView ship) { this.main = main; + this.room = room; // TODO // height = room.getHeight(); // width = room.getWidth(); @@ -92,7 +85,7 @@ public class RoomUI { * @param amount how much should be subtracted/added */ public void systemEnergyChosen(int id, int amount) { - ship.roomSystemEnergyChosen(id, amount); + ship.roomSystemEnergyChosen(room, amount); } /** diff --git a/database.mv.db b/database.mv.db index 4284f5cf13e807bc594694175d5c882cd17f743a..d4e9f32ecfc33bf4cb8255bf3291a845051340b5 100644 GIT binary patch literal 53248 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 T{U0&c|6L8%|Ixp~`v3m}qUVI( literal 53248 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 BZ-4** -- GitLab