diff --git a/src/projectzombie/Main.java b/src/projectzombie/Main.java index 91e0a15..2c5e170 100644 --- a/src/projectzombie/Main.java +++ b/src/projectzombie/Main.java @@ -8,6 +8,7 @@ import projectzombie.audio.AudioSources; import projectzombie.cheats.Cheats; import projectzombie.display.DisplayStatsEventHandler; import projectzombie.display.DisplayWindow; +import projectzombie.display.bossbar.BossBars; import projectzombie.entity.EntityEventHandler; import projectzombie.entity.player.EntityPlayer; import projectzombie.init.Layers; @@ -19,6 +20,7 @@ import projectzombie.input.KeyCallback; import projectzombie.mainloop.MainloopEventHandler; import projectzombie.menu.Menu; import projectzombie.menu.MenuGame; +import projectzombie.menu.MenuMain; import projectzombie.tiles.LightLevelNoise; import projectzombie.time.GameTimer; import projectzombie.time.NoSleep; @@ -29,7 +31,7 @@ public class Main { public static MainloopManager mainloop; public static DisplayWindow window; - public static EntityPlayer player = new EntityPlayer(); + public static EntityPlayer player; public static World world; public static AudioEngine audio; public static Random rand = new Random(); @@ -37,6 +39,15 @@ public class Main public static boolean game_paused = false; public static int tickrate = 10; + public static void respawn() + { + // Reset the world and the player + Layers.init(rand.nextLong()); + player = new EntityPlayer(); + GameTimer.resetTime(); + BossBars.clear(); + } + public static void main(String[] args) { // Initialize the cheats @@ -74,14 +85,11 @@ public class Main // Initialize the gamepad JoystickCallback.JOYSTICK_CALLBACK.init(); - // Create the world - Layers.init(rand.nextLong()); - // Initialise the entities mainloop.register(EntityEventHandler.ENTITY_EVENT_HANDLER); // Start the mainloop - menu = new MenuGame(); + menu = new MenuMain(); mainloop.start(); } } diff --git a/src/projectzombie/display/DisplayRenderUI.java b/src/projectzombie/display/DisplayRenderUI.java index 02f1a61..5d1a56a 100644 --- a/src/projectzombie/display/DisplayRenderUI.java +++ b/src/projectzombie/display/DisplayRenderUI.java @@ -13,10 +13,23 @@ import projectzombie.util.math.vec.Vec2d; public class DisplayRenderUI { - + public static boolean showFPS = false; + public static boolean showPos = false; public static void render() { + // Get some text settings + Vec2d text_size = new Vec2d(0.5, 0.5); + + // Render the fps + if(showFPS) { + GlHelpers.pushMatrix(); + GlHelpers.translate2(-9.5, 9.5); + GlHelpers.color3(1, 1, 0); + Text.render("FPS: " + DisplayStatsEventHandler.fps, text_size); + GlHelpers.popMatrix(); + } + // Get the player EntityPlayer player = Main.player; @@ -29,25 +42,17 @@ public class DisplayRenderUI ((double) Main.window.getWidth()) / ((double) Main.window.getHeight())); - // Get some text settings - Vec2d text_size = new Vec2d(0.45, 0.45); - - /*// Render the fps - GlHelpers.pushMatrix(); - GlHelpers.translate2(-9.5, 9.5); - GlHelpers.color3(1, 1, 0); - Text.render("FPS: " + DisplayStatsEventHandler.fps, text_size); - GlHelpers.popMatrix();*/ - - if(Main.menu.doGameRender) + if(Main.menu.doGameRender && Main.menu.showIngameGUI) { - /*// Render the fps and the position - GlHelpers.pushMatrix(); - GlHelpers.translate2(-9.5, 9); - GlHelpers.color3(1, 1, 0); - Text.render("x: " + (int) player.pos.x + ", y: " + (int) player.pos.y, text_size); - GlHelpers.color3(1, 1, 1); - GlHelpers.popMatrix();*/ + // Render the position + if(showPos) { + GlHelpers.pushMatrix(); + GlHelpers.translate2(-9.5, 9); + GlHelpers.color3(1, 1, 0); + Text.render("x: " + (int) player.pos.x + ", y: " + (int) player.pos.y, text_size); + GlHelpers.color3(1, 1, 1); + GlHelpers.popMatrix(); + } // Render the healthbar double max_health = player.maxHealth(); diff --git a/src/projectzombie/menu/Menu.java b/src/projectzombie/menu/Menu.java index 745530d..a3913f6 100644 --- a/src/projectzombie/menu/Menu.java +++ b/src/projectzombie/menu/Menu.java @@ -7,6 +7,7 @@ public abstract class Menu public boolean doGameloop; public boolean doGameRender; public boolean keepMouse = true; + public boolean showIngameGUI = true; public Input input; public abstract void render(); diff --git a/src/projectzombie/menu/MenuDeath.java b/src/projectzombie/menu/MenuDeath.java index 01fcc4f..f27c0a6 100644 --- a/src/projectzombie/menu/MenuDeath.java +++ b/src/projectzombie/menu/MenuDeath.java @@ -2,7 +2,8 @@ package projectzombie.menu; import projectzombie.input.types.InputDeath; import projectzombie.menu.gui.GUI; -import projectzombie.menu.gui.components.ButtonRespawn; +import projectzombie.menu.gui.components.LabelRespawn; +import projectzombie.menu.gui.components.OverlayBackground; import projectzombie.text.Text; import projectzombie.util.gl.GlHelpers; import projectzombie.util.math.vec.Vec2d; @@ -19,30 +20,12 @@ public class MenuDeath extends Menu this.gui = new GUI(); this.input = new InputDeath(this.gui); - gui.add(new ButtonRespawn()); + gui.add(new OverlayBackground()); + gui.add(new LabelRespawn("You Died")); } @Override - public void render() - { - // Render the screen darkening of the gameplay - GlHelpers.disableTexture2d(); - GlHelpers.color4(0, 0, 0, 0.5); - GlHelpers.begin(); - GlHelpers.vertex3(-10, -10, 0); - GlHelpers.vertex3(-10, 10, 0); - GlHelpers.vertex3(10, 10, 0); - GlHelpers.vertex3(10, -10, 0); - GlHelpers.end(); - GlHelpers.color4(1, 1, 1, 1); - GlHelpers.enableTexture2d(); - - // Render some text to say the player is dead - GlHelpers.pushMatrix(); - GlHelpers.translate2(0, 2.4); - Text.renderCenter("You Died", new Vec2d(1, 1)); - GlHelpers.popMatrix(); - + public void render() { gui.render(); } diff --git a/src/projectzombie/menu/MenuGamePause.java b/src/projectzombie/menu/MenuGamePause.java index cc47388..9ee2793 100644 --- a/src/projectzombie/menu/MenuGamePause.java +++ b/src/projectzombie/menu/MenuGamePause.java @@ -1,10 +1,12 @@ package projectzombie.menu; +import projectzombie.Main; import projectzombie.input.types.InputGamePause; +import projectzombie.menu.gui.ButtonGroup; import projectzombie.menu.gui.GUI; -import projectzombie.menu.gui.components.ButtonRespawn; -import projectzombie.text.Text; -import projectzombie.util.gl.GlHelpers; +import projectzombie.menu.gui.components.ButtonBasic; +import projectzombie.menu.gui.components.LabelRespawn; +import projectzombie.menu.gui.components.OverlayBackground; import projectzombie.util.math.vec.Vec2d; public class MenuGamePause extends Menu @@ -19,30 +21,25 @@ public class MenuGamePause extends Menu this.gui = new GUI(); this.input = new InputGamePause(this.gui); - gui.add(new ButtonRespawn()); + gui.add(new OverlayBackground()); + gui.add(new LabelRespawn("Game Paused")); + + ButtonGroup group = new ButtonGroup(); + + group.add(new ButtonBasic("Settings", button -> { + Main.menu = new MenuSettings(new MenuGamePause()); + })); + + group.add(new ButtonBasic("Quit", button -> { + Main.menu = new MenuMain(); + })); + + group.setPos(new Vec2d(0, -2)); + gui.add(group); } @Override - public void render() - { - // Render the screen darkening of the gameplay - GlHelpers.disableTexture2d(); - GlHelpers.color4(0, 0, 0, 0.5); - GlHelpers.begin(); - GlHelpers.vertex3(-10, -10, 0); - GlHelpers.vertex3(-10, 10, 0); - GlHelpers.vertex3(10, 10, 0); - GlHelpers.vertex3(10, -10, 0); - GlHelpers.end(); - GlHelpers.color4(1, 1, 1, 1); - GlHelpers.enableTexture2d(); - - // Render some text to say the game is paused - GlHelpers.pushMatrix(); - GlHelpers.translate2(0, 2.4); - Text.renderCenter("Game Paused", new Vec2d(1, 1)); - GlHelpers.popMatrix(); - + public void render() { gui.render(); } } diff --git a/src/projectzombie/menu/MenuMain.java b/src/projectzombie/menu/MenuMain.java index f5a4d5c..6b0fc46 100644 --- a/src/projectzombie/menu/MenuMain.java +++ b/src/projectzombie/menu/MenuMain.java @@ -1,7 +1,11 @@ package projectzombie.menu; +import projectzombie.Main; import projectzombie.input.types.InputGUI; +import projectzombie.menu.gui.ButtonGroup; import projectzombie.menu.gui.GUI; +import projectzombie.menu.gui.components.ButtonBasic; +import projectzombie.menu.gui.components.LabelMain; public class MenuMain extends Menu { @@ -9,15 +13,48 @@ public class MenuMain extends Menu public MenuMain() { this.doGameloop = false; - this.doGameRender = false; + this.doGameRender = true; + this.keepMouse = false; + this.showIngameGUI = false; this.gui = new GUI(); this.input = new InputGUI(gui); + + gui.add(new LabelMain()); + + ButtonGroup group = new ButtonGroup(); + + group.add(new ButtonBasic("Play", button -> { + Main.respawn(); + Main.menu = new MenuGame(); + })); + + group.add(new ButtonBasic("Settings", button -> { + Main.menu = new MenuSettings(Main.menu); + })); + + group.add(new ButtonBasic("Quit", button -> { + Main.mainloop.stop(); + })); + + gui.add(group); + + Main.respawn(); + Main.player.dead = true; } @Override public void render() { this.gui.render(); } + + @Override + public void update() { + super.update(); + + Main.player.angle += 0.05; + Main.player.angle %= 360; + Main.player.pos.x += 0.005; + } } diff --git a/src/projectzombie/menu/MenuRespawn.java b/src/projectzombie/menu/MenuRespawn.java deleted file mode 100644 index eb65119..0000000 --- a/src/projectzombie/menu/MenuRespawn.java +++ /dev/null @@ -1,60 +0,0 @@ -package projectzombie.menu; - -import java.util.Random; - -import projectzombie.Main; -import projectzombie.display.bossbar.BossBars; -import projectzombie.entity.player.EntityPlayer; -import projectzombie.init.Layers; -import projectzombie.text.Text; -import projectzombie.time.GameTimer; -import projectzombie.util.gl.GlHelpers; -import projectzombie.util.math.vec.Vec2d; - -class MenuRespawn -{ - private int reset_progress = 0; - private static final Random rand = new Random(); - - void update(boolean resetting) - { - if(resetting) { - this.reset_progress += 10; - } else if(this.reset_progress > 0) { - this.reset_progress -= 5; - } - - if(this.reset_progress >= 1000) - { - // Reset the world and the player - Layers.init(rand.nextLong()); - Main.player = new EntityPlayer(); - Main.menu = new MenuGame(); - Main.game_paused = false; - GameTimer.resetTime(); - BossBars.clear(); - } - } - - void render() - { - GlHelpers.pushMatrix(); - GlHelpers.translate2(0, 2.5); - Text.renderCenter("Press and hold fire to respawn", new Vec2d(0.5, 0.5)); - GlHelpers.popMatrix(); - - double p = reset_progress/1000.0*8; - GlHelpers.disableTexture2d(); - GlHelpers.color4(1, 1, 0, 1); - GlHelpers.begin(); - { - GlHelpers.vertex2(-4.0, -3.2); - GlHelpers.vertex2(-4+p, -3.2); - GlHelpers.vertex2(-4+p, -3.0); - GlHelpers.vertex2(-4.0, -3.0); - } - GlHelpers.end(); - GlHelpers.color3(0, 0, 0); - GlHelpers.enableTexture2d(); - } -} diff --git a/src/projectzombie/menu/MenuSettings.java b/src/projectzombie/menu/MenuSettings.java new file mode 100644 index 0000000..673b8e7 --- /dev/null +++ b/src/projectzombie/menu/MenuSettings.java @@ -0,0 +1,82 @@ +package projectzombie.menu; + +import projectzombie.Main; +import projectzombie.display.DisplayRenderUI; +import projectzombie.input.types.InputGUI; +import projectzombie.menu.gui.Button; +import projectzombie.menu.gui.ButtonGroup; +import projectzombie.menu.gui.GUI; +import projectzombie.menu.gui.Label; +import projectzombie.menu.gui.components.ButtonBasic; +import projectzombie.menu.gui.components.ButtonSetting; +import projectzombie.menu.gui.components.OverlayBackground; +import projectzombie.util.math.vec.Vec2d; + +public class MenuSettings extends Menu +{ + private GUI gui; + private Menu menuOld; + + public MenuSettings(Menu menuOld) { + + this.menuOld = menuOld; + + doGameloop = false; + doGameRender = menuOld.doGameRender; + showIngameGUI = menuOld.showIngameGUI; + keepMouse = false; + + ButtonGroup group = new ButtonGroup(); + group.setPos(new Vec2d(-1, 4)); + + group.add(new ButtonSetting(DisplayRenderUI.showFPS ? "FPS: On" : "FPS: Off", button -> { + if(DisplayRenderUI.showFPS) { + button.setText("FPS: Off"); + } else { + button.setText("FPS: On"); + } + DisplayRenderUI.showFPS = !DisplayRenderUI.showFPS; + })); + + group.add(new ButtonSetting(DisplayRenderUI.showPos ? "Pos Indicator: On" : "Pos Indicator: Off", + button -> { + if(DisplayRenderUI.showPos) { + button.setText("Pos Indicator: Off"); + } else { + button.setText("Pos Indicator: On"); + } + DisplayRenderUI.showPos = !DisplayRenderUI.showPos; + })); + + gui = new GUI(); + input = new InputGUI(gui); + + if(doGameRender) { + gui.add(new OverlayBackground()); + } + + gui.add(group); + + Label labelSettings = new Label(); + labelSettings.setText("Settings"); + labelSettings.setSize(new Vec2d(1, 1)); + labelSettings.setPos(new Vec2d(0, 6.8)); + gui.add(labelSettings); + + gui.add(new ButtonBasic("Back", new Vec2d(0, -8), button -> { + Main.menu = menuOld; + })); + } + + @Override + public void render() { + gui.render(); + } + + @Override + public void update() { + super.update(); + this.menuOld.update(); + } + +} diff --git a/src/projectzombie/menu/gui/Alignment.java b/src/projectzombie/menu/gui/Alignment.java new file mode 100644 index 0000000..ca4a71c --- /dev/null +++ b/src/projectzombie/menu/gui/Alignment.java @@ -0,0 +1,5 @@ +package projectzombie.menu.gui; + +public enum Alignment { + LEFT, CENTRE, RIGHT +} diff --git a/src/projectzombie/menu/gui/Button.java b/src/projectzombie/menu/gui/Button.java index f1fe28a..87d8401 100644 --- a/src/projectzombie/menu/gui/Button.java +++ b/src/projectzombie/menu/gui/Button.java @@ -9,15 +9,23 @@ import projectzombie.util.math.vec.Vec2d; public class Button implements GUIComponent { - private Vec2d pos; - private String text; + private Vec2d pos = new Vec2d(0, 0); + private String text = ""; + private Alignment alignment = Alignment.CENTRE; - private static Vec2d textSize = new Vec2d(0.5, 0.5); + public static final Vec2d textSize = new Vec2d(0.5, 0.5); - public Button(Vec2d pos, String text) { + public void setPos(Vec2d pos) { this.pos = pos; + } + + public void setText(String text) { this.text = text; } + + public void setAlign(Alignment alignment) { + this.alignment = alignment; + } @Override public void render(Vec2d mousePos) { @@ -25,9 +33,31 @@ public class Button implements GUIComponent GlHelpers.translate2(pos.x, pos.y); double m = 2.5; - double w = textSize.x * m * 8 / 2; + double w = textSize.x * m * 8; double h = textSize.x * m / 2; + double w1 = 0; + double w2 = 0; + double wt = 0; + + if(alignment == Alignment.LEFT) { + w1 = 0; + w2 = w; + wt = w/2; + } + + if(alignment == Alignment.CENTRE) { + w1 = -w/2; + w2 = w/2; + wt = 0; + } + + if(alignment == Alignment.RIGHT) { + w1 = -w; + w2 = 0; + wt = -w/2; + } + TextureReference tex; boolean mouseHover = this.checkMouseHover(mousePos); if(mouseHover) { @@ -39,15 +69,15 @@ public class Button implements GUIComponent GlHelpers.color4(1, 1, 1, 1); GlHelpers.begin(); { - tex.texCoord(0, 0); GlHelpers.vertex2(-w, -h); - tex.texCoord(1, 0); GlHelpers.vertex2( w, -h); - tex.texCoord(1, 1); GlHelpers.vertex2( w, h); - tex.texCoord(0, 1); GlHelpers.vertex2(-w, h); + tex.texCoord(0, 0); GlHelpers.vertex2(w1, -h); + tex.texCoord(1, 0); GlHelpers.vertex2(w2, -h); + tex.texCoord(1, 1); GlHelpers.vertex2(w2, h); + tex.texCoord(0, 1); GlHelpers.vertex2(w1, h); } GlHelpers.end(); GlHelpers.translate2( - (-textSize.x * text.length() / 2)/GlHelpers.getAspectRatio(), + (-textSize.x * text.length() / 2 + wt)/GlHelpers.getAspectRatio(), -textSize.y / 2 ); @@ -65,18 +95,40 @@ public class Button implements GUIComponent public boolean checkMouseHover(Vec2d pos) { double m = 2.5; - double w = textSize.x * m * 8 / 2 / GlHelpers.getAspectRatio(); + double w = textSize.x * m * 8 / GlHelpers.getAspectRatio(); double h = textSize.x * m / 2; double mx = pos.x / Main.window.getWidth() * 20 - 10; double my = pos.y / Main.window.getHeight() * 20 - 10; - return ( - mx > -w - this.pos.x && - mx < w - this.pos.x && - my > -h - this.pos.y && - my < h - this.pos.y - ); + if(alignment == Alignment.LEFT) { + return ( + mx > -this.pos.x && + mx < w - this.pos.x && + my > -h - this.pos.y && + my < h - this.pos.y + ); + } + + if(alignment == Alignment.CENTRE) { + return ( + mx > -w/2 - this.pos.x && + mx < w/2 - this.pos.x && + my > -h - this.pos.y && + my < h - this.pos.y + ); + } + + if(alignment == Alignment.RIGHT) { + return ( + mx > -w - this.pos.x && + mx < -this.pos.x && + my > -h - this.pos.y && + my < h - this.pos.y + ); + } + + return false; } @Override diff --git a/src/projectzombie/menu/gui/ButtonGroup.java b/src/projectzombie/menu/gui/ButtonGroup.java new file mode 100644 index 0000000..ea3cdd3 --- /dev/null +++ b/src/projectzombie/menu/gui/ButtonGroup.java @@ -0,0 +1,56 @@ +package projectzombie.menu.gui; + +import java.util.ArrayList; + +import projectzombie.util.math.vec.Vec2d; + +public class ButtonGroup implements GUIComponent, GUIContainer +{ + private ArrayList