diff --git a/src/main/java/de/siphalor/was/WhatAStorage.java b/src/main/java/de/siphalor/was/WhatAStorage.java index 1ed8935..2d4cd13 100644 --- a/src/main/java/de/siphalor/was/WhatAStorage.java +++ b/src/main/java/de/siphalor/was/WhatAStorage.java @@ -6,22 +6,15 @@ import de.siphalor.was.content.pack.FileContentPack; import de.siphalor.was.content.pack.JarContentPack; import de.siphalor.was.content.product.ProductManager; import de.siphalor.was.content.quest.QuestManager; -import de.siphalor.was.state.GameState; -import de.siphalor.was.state.NoopState; -import de.siphalor.was.state.State; -import de.siphalor.was.visual.layout.FixedAspectLayout; -import de.siphalor.was.visual.layout.FulfillingLayout; +import de.siphalor.was.visual.CanvasVisual; +import de.siphalor.was.visual.Visual; -import java.awt.*; -import java.awt.event.*; -import java.awt.image.BufferStrategy; import java.io.File; import java.nio.file.Path; public class WhatAStorage { public static final String TITLE = "What a Storage"; private static final WhatAStorage INSTANCE = new WhatAStorage(); - private static final double ASPECT_RATIO = 16.0 / 9.0; public static WhatAStorage getInstance() { return INSTANCE; @@ -32,14 +25,9 @@ public class WhatAStorage { private final ProductManager productManager; private final QuestManager questManager; - private Frame frame; - private Canvas canvas; - private boolean fullScreen = false; - private BufferStrategy bufferStrategy; - private State state = new NoopState(); + private Visual visual; - private boolean scheduleStop; - private long minTickTime = 1000 / 60; + private boolean stopScheduled; private WhatAStorage() { contentManager = new ContentManager(); @@ -47,6 +35,8 @@ public class WhatAStorage { contentManager.addPack(mainPack); productManager = new ProductManager(); questManager = new QuestManager(); + + visual = new CanvasVisual(); } public ContentManager getContentManager() { @@ -82,118 +72,18 @@ public class WhatAStorage { } public void start() { - frame = new Frame(TITLE); - frame.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent e) { - super.windowClosing(e); - scheduleStop = true; - } - }); - frame.addComponentListener(new ComponentAdapter() { - @Override - public void componentResized(ComponentEvent e) { - super.componentResized(e); - state.onResize(canvas.getWidth(), canvas.getHeight()); - } - }); - frame.addKeyListener(new KeyListener() { - @Override - public void keyTyped(KeyEvent e) { - - } - - @Override - public void keyPressed(KeyEvent e) { - if (e.getExtendedKeyCode() == KeyEvent.VK_F11) { - GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0]; - frame.dispose(); - if (fullScreen) { - System.out.println("End fullscreen"); - frame.setUndecorated(false); - frame.setVisible(true); - device.setFullScreenWindow(null); - fullScreen = false; - } else { - System.out.println("Start fullscreen"); - frame.setUndecorated(true); - frame.setVisible(true); - device.setFullScreenWindow(frame); - fullScreen = true; - } - } - } - - @Override - public void keyReleased(KeyEvent e) { - - } - }); - - Panel panel = new Panel(); - panel.setBackground(Color.BLACK); - frame.add(panel); - frame.setLayout(new FulfillingLayout(panel)); - - canvas = new Canvas(); - panel.add(canvas); - panel.setLayout(new FixedAspectLayout(ASPECT_RATIO, canvas)); - - frame.setVisible(true); - frame.pack(); - frame.setLocationRelativeTo(null); - - canvas.createBufferStrategy(2); - bufferStrategy = canvas.getBufferStrategy(); - - changeState(new GameState(frame.getWidth(), frame.getHeight())); + visual.start(this); } public void run() { - long time, timeDelta, tickBegin = System.nanoTime(); - - while (!scheduleStop) { - time = System.nanoTime(); - timeDelta = time - tickBegin; - tickBegin = System.nanoTime(); - - state.tick((int) (timeDelta / 1_000_000L)); - - do { - do { - Graphics graphics = bufferStrategy.getDrawGraphics(); - - state.render(graphics); - - graphics.dispose(); - - } while(bufferStrategy.contentsRestored()); - - bufferStrategy.show(); - } while(bufferStrategy.contentsLost()); - - time = System.nanoTime(); - timeDelta = time - tickBegin; - - if (timeDelta < minTickTime) { - try { - Thread.sleep((minTickTime - timeDelta) / 1_000_000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } - - frame.setVisible(false); - frame.dispose(); + visual.run(); } - public void changeState(State newState) { - if (state != null) { - state.leave(); - } - state = newState; - state.enter(); - state.onResize(frame.getWidth(), frame.getHeight()); + public void scheduleStop() { + stopScheduled = true; + } + + public boolean isStopScheduled() { + return stopScheduled; } } diff --git a/src/main/java/de/siphalor/was/state/GameState.java b/src/main/java/de/siphalor/was/state/GameState.java deleted file mode 100644 index 2f9146d..0000000 --- a/src/main/java/de/siphalor/was/state/GameState.java +++ /dev/null @@ -1,54 +0,0 @@ -package de.siphalor.was.state; - -import de.siphalor.was.assets.AssetsManager; -import de.siphalor.was.util.Util; -import de.siphalor.was.visual.render.AnimatedTextureObject; -import de.siphalor.was.visual.render.Renderable; -import de.siphalor.was.visual.render.TextureObject; - -import java.awt.*; -import java.util.Collection; -import java.util.LinkedList; - -public class GameState extends State { - private static final Image BG = AssetsManager.getImage("textures/bg.png"); - private static final Image BIN_OPEN = AssetsManager.getImage("textures/bin_open.png"); - private static final Image BIN_CLOSED = AssetsManager.getImage("textures/bin_closed.png"); - - Collection renderables = new LinkedList<>(); - - private boolean binOpen = false; - - public GameState(int width, int height) { - super(width, height); - - renderables.add(new TextureObject(600, 700, 400, 300) { - @Override - public Image getTexture() { - return binOpen ? BIN_OPEN : BIN_CLOSED; - } - }); - renderables.add(new AnimatedTextureObject(0, 500, 550, 400, 1000, - AssetsManager.getImage("textures/conveyor_in_0.png"), - AssetsManager.getImage("textures/conveyor_in_1.png"), - AssetsManager.getImage("textures/conveyor_in_2.png") - )); - } - - @Override - public void tick(int delta) { - renderables.forEach(renderable -> renderable.tick(delta)); - } - - @Override - public void render(Graphics graphics) { - graphics.drawImage(BG, 0, 0, getWidth(), getHeight(), Util.dummyImageObserver()); - - renderables.forEach(renderable -> renderable.render(graphics, getWidth(), getHeight())); - } - - @Override - public void onResize(int width, int height) { - super.onResize(width, height); - } -} diff --git a/src/main/java/de/siphalor/was/state/MainMenuState.java b/src/main/java/de/siphalor/was/state/MainMenuState.java deleted file mode 100644 index f63dfb3..0000000 --- a/src/main/java/de/siphalor/was/state/MainMenuState.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.siphalor.was.state; - -import de.siphalor.was.assets.AssetsManager; -import de.siphalor.was.util.Util; - -import java.awt.*; - -public class MainMenuState extends State { - private boolean bgDirty = true; - - public MainMenuState(int width, int height) { - super(width, height); - } - - @Override - public void tick(int delta) { - - } - - @Override - public void render(Graphics graphics) { - Image image = AssetsManager.getImage("assets/textures/bg.png"); - graphics.drawImage(image, 0, 0, getWidth(), getHeight(), Util.dummyImageObserver()); - } - - @Override - public void onResize(int width, int height) { - super.onResize(width, height); - bgDirty = true; - } -} diff --git a/src/main/java/de/siphalor/was/state/NoopState.java b/src/main/java/de/siphalor/was/state/NoopState.java deleted file mode 100644 index 60d868d..0000000 --- a/src/main/java/de/siphalor/was/state/NoopState.java +++ /dev/null @@ -1,19 +0,0 @@ -package de.siphalor.was.state; - -import java.awt.*; - -public class NoopState extends State { - public NoopState() { - super(0,0); - } - - @Override - public void tick(int delta) { - - } - - @Override - public void render(Graphics graphics) { - - } -} diff --git a/src/main/java/de/siphalor/was/state/State.java b/src/main/java/de/siphalor/was/state/State.java deleted file mode 100644 index 6edb8da..0000000 --- a/src/main/java/de/siphalor/was/state/State.java +++ /dev/null @@ -1,37 +0,0 @@ -package de.siphalor.was.state; - -import java.awt.*; - -public abstract class State { - private int width, height; - - public State(int width, int height) { - this.width = width; - this.height = height; - onResize(width, height); - } - - public int getWidth() { - return width; - } - - public int getHeight() { - return height; - } - - public void enter() { - - } - - public void leave() { - - } - - public abstract void tick(int delta); - public abstract void render(Graphics graphics); - - public void onResize(int width, int height) { - this.width = width; - this.height = height; - } -} diff --git a/src/main/java/de/siphalor/was/visual/CanvasVisual.java b/src/main/java/de/siphalor/was/visual/CanvasVisual.java new file mode 100644 index 0000000..2678274 --- /dev/null +++ b/src/main/java/de/siphalor/was/visual/CanvasVisual.java @@ -0,0 +1,122 @@ +package de.siphalor.was.visual; + +import de.siphalor.was.WhatAStorage; +import de.siphalor.was.visual.canvas.layout.FixedAspectLayout; +import de.siphalor.was.visual.canvas.layout.FulfillingLayout; + +import java.awt.*; +import java.awt.event.*; +import java.awt.image.BufferStrategy; + +public class CanvasVisual implements Visual { + private static final double ASPECT_RATIO = 16.0 / 9.0; + private WhatAStorage main; + + private final Frame frame = new Frame(WhatAStorage.TITLE); + private final Canvas canvas = new Canvas(); + private BufferStrategy bufferStrategy; + private long minTickTime = 1000L / 60L; + + private boolean fullScreen = false; + + @Override + public void start(WhatAStorage whatAStorage) { + main = whatAStorage; + frame.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + super.windowClosing(e); + main.scheduleStop(); + } + }); + frame.addComponentListener(new ComponentAdapter() { + @Override + public void componentResized(ComponentEvent e) { + super.componentResized(e); + } + }); + frame.addKeyListener(new KeyListener() { + @Override + public void keyTyped(KeyEvent e) { + + } + + @Override + public void keyPressed(KeyEvent e) { + if (e.getExtendedKeyCode() == KeyEvent.VK_F11) { + GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0]; + frame.dispose(); + if (fullScreen) { + System.out.println("End fullscreen"); + frame.setUndecorated(false); + frame.setVisible(true); + device.setFullScreenWindow(null); + fullScreen = false; + } else { + System.out.println("Start fullscreen"); + frame.setUndecorated(true); + frame.setVisible(true); + device.setFullScreenWindow(frame); + fullScreen = true; + } + } + } + + @Override + public void keyReleased(KeyEvent e) { + + } + }); + + Panel panel = new Panel(); + panel.setBackground(Color.BLACK); + frame.add(panel); + frame.setLayout(new FulfillingLayout(panel)); + + panel.add(canvas); + panel.setLayout(new FixedAspectLayout(ASPECT_RATIO, canvas)); + + frame.setVisible(true); + frame.pack(); + frame.setLocationRelativeTo(null); + + canvas.createBufferStrategy(2); + bufferStrategy = canvas.getBufferStrategy(); + } + + @Override + public void run() { + long time, timeDelta, tickBegin = System.nanoTime(); + + while (!main.isStopScheduled()) { + time = System.nanoTime(); + timeDelta = time - tickBegin; + tickBegin = System.nanoTime(); + + do { + do { + Graphics graphics = bufferStrategy.getDrawGraphics(); + + graphics.dispose(); + + } while(bufferStrategy.contentsRestored()); + + bufferStrategy.show(); + } while(bufferStrategy.contentsLost()); + + time = System.nanoTime(); + timeDelta = time - tickBegin; + + if (timeDelta < minTickTime) { + try { + Thread.sleep((minTickTime - timeDelta) / 1_000_000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + + frame.setVisible(false); + frame.dispose(); + } +} diff --git a/src/main/java/de/siphalor/was/visual/Visual.java b/src/main/java/de/siphalor/was/visual/Visual.java new file mode 100644 index 0000000..8309809 --- /dev/null +++ b/src/main/java/de/siphalor/was/visual/Visual.java @@ -0,0 +1,8 @@ +package de.siphalor.was.visual; + +import de.siphalor.was.WhatAStorage; + +public interface Visual { + void start(WhatAStorage whatAStorage); + void run(); +} diff --git a/src/main/java/de/siphalor/was/visual/layout/FixedAspectLayout.java b/src/main/java/de/siphalor/was/visual/canvas/layout/FixedAspectLayout.java similarity index 96% rename from src/main/java/de/siphalor/was/visual/layout/FixedAspectLayout.java rename to src/main/java/de/siphalor/was/visual/canvas/layout/FixedAspectLayout.java index 50b3ebe..6dcf7fd 100644 --- a/src/main/java/de/siphalor/was/visual/layout/FixedAspectLayout.java +++ b/src/main/java/de/siphalor/was/visual/canvas/layout/FixedAspectLayout.java @@ -1,4 +1,4 @@ -package de.siphalor.was.visual.layout; +package de.siphalor.was.visual.canvas.layout; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/de/siphalor/was/visual/layout/FulfillingLayout.java b/src/main/java/de/siphalor/was/visual/canvas/layout/FulfillingLayout.java similarity index 96% rename from src/main/java/de/siphalor/was/visual/layout/FulfillingLayout.java rename to src/main/java/de/siphalor/was/visual/canvas/layout/FulfillingLayout.java index 51b9939..8113159 100644 --- a/src/main/java/de/siphalor/was/visual/layout/FulfillingLayout.java +++ b/src/main/java/de/siphalor/was/visual/canvas/layout/FulfillingLayout.java @@ -1,4 +1,4 @@ -package de.siphalor.was.visual.layout; +package de.siphalor.was.visual.canvas.layout; import java.awt.*; diff --git a/src/main/java/de/siphalor/was/visual/render/AnimatedTextureObject.java b/src/main/java/de/siphalor/was/visual/canvas/render/AnimatedTextureObject.java similarity index 92% rename from src/main/java/de/siphalor/was/visual/render/AnimatedTextureObject.java rename to src/main/java/de/siphalor/was/visual/canvas/render/AnimatedTextureObject.java index 7b17e85..3e7ac5a 100644 --- a/src/main/java/de/siphalor/was/visual/render/AnimatedTextureObject.java +++ b/src/main/java/de/siphalor/was/visual/canvas/render/AnimatedTextureObject.java @@ -1,4 +1,4 @@ -package de.siphalor.was.visual.render; +package de.siphalor.was.visual.canvas.render; import java.awt.*; diff --git a/src/main/java/de/siphalor/was/visual/render/Renderable.java b/src/main/java/de/siphalor/was/visual/canvas/render/Renderable.java similarity index 74% rename from src/main/java/de/siphalor/was/visual/render/Renderable.java rename to src/main/java/de/siphalor/was/visual/canvas/render/Renderable.java index 577c8e8..4b55752 100644 --- a/src/main/java/de/siphalor/was/visual/render/Renderable.java +++ b/src/main/java/de/siphalor/was/visual/canvas/render/Renderable.java @@ -1,4 +1,4 @@ -package de.siphalor.was.visual.render; +package de.siphalor.was.visual.canvas.render; import java.awt.*; diff --git a/src/main/java/de/siphalor/was/visual/render/TextureObject.java b/src/main/java/de/siphalor/was/visual/canvas/render/TextureObject.java similarity index 94% rename from src/main/java/de/siphalor/was/visual/render/TextureObject.java rename to src/main/java/de/siphalor/was/visual/canvas/render/TextureObject.java index b47976c..520c32c 100644 --- a/src/main/java/de/siphalor/was/visual/render/TextureObject.java +++ b/src/main/java/de/siphalor/was/visual/canvas/render/TextureObject.java @@ -1,4 +1,4 @@ -package de.siphalor.was.visual.render; +package de.siphalor.was.visual.canvas.render; import de.siphalor.was.util.Util;