diff --git a/src/main/java/xyz/valnet/hadean/HadeanGame.java b/src/main/java/xyz/valnet/hadean/HadeanGame.java index fecc50a..3b8b643 100644 --- a/src/main/java/xyz/valnet/hadean/HadeanGame.java +++ b/src/main/java/xyz/valnet/hadean/HadeanGame.java @@ -28,7 +28,7 @@ public class HadeanGame extends Game { Drawing.setLayer(0); super.render(); Drawing.setLayer(99); - renderDebugInfo(); + // renderDebugInfo(); } private Runtime runtime = Runtime.getRuntime(); diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java b/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java index 0372972..84645b8 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java @@ -3,6 +3,7 @@ package xyz.valnet.hadean.gameobjects; import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.graphics.Sprite; import xyz.valnet.engine.math.Vector2f; +import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.scenegraph.GameObject; import xyz.valnet.hadean.interfaces.IWorldBoundsAdapter; @@ -38,6 +39,10 @@ public class Camera extends GameObject { return new Vector2f((x - screenWidth / 2 + focus.x * tileWidth) / tileWidth, (y - screenHeight / 2 + focus.y * tileWidth) / tileWidth); } + public Vector2i screen2worldI(float x, float y) { + return new Vector2i((int)Math.floor((x - screenWidth / 2 + focus.x * tileWidth) / tileWidth), (int)Math.floor((y - screenHeight / 2 + focus.y * tileWidth) / tileWidth)); + } + @Deprecated public void draw(Sprite sprite, float x, float y) { Vector2f screenPos = world2screen(x, y); diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/BuildLayer.java b/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/BuildLayer.java index 6476f9c..7ba83fe 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/BuildLayer.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/BuildLayer.java @@ -2,6 +2,7 @@ package xyz.valnet.hadean.gameobjects.inputlayer; import xyz.valnet.engine.App; import xyz.valnet.engine.math.Vector2f; +import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.scenegraph.GameObject; import xyz.valnet.engine.scenegraph.IMouseCaptureArea; @@ -46,7 +47,12 @@ public class BuildLayer extends GameObject implements IMouseCaptureArea { } private void broadcastWorldCoords() { - Vector2f worldcoords = camera.screen2world(App.mouseX, App.mouseY); + Vector2i worldcoords = camera.screen2worldI(App.mouseX, App.mouseY); + if(mouseDown) { + Vector2i[] ords = orderCoords(new Vector2i(x, y), worldcoords); + listener.update(ords[0].x, ords[0].y, ords[2].x + 1, ords[2].y + 1); + return; + } listener.update(worldcoords.x, worldcoords.y, 1, 1); } @@ -65,7 +71,7 @@ public class BuildLayer extends GameObject implements IMouseCaptureArea { hovered = false; } - private float x, y; + private int x, y; private int screenX, screenY; private boolean mouseDown = false; @@ -75,7 +81,7 @@ public class BuildLayer extends GameObject implements IMouseCaptureArea { listener.cancel(); deactiveate(); } else if(button == 0 && active && hovered) { - Vector2f worldcoords = camera.screen2world(App.mouseX, App.mouseY); + Vector2i worldcoords = camera.screen2worldI(App.mouseX, App.mouseY); mouseDown = true; screenX = App.mouseX; screenY = App.mouseY; @@ -87,20 +93,30 @@ public class BuildLayer extends GameObject implements IMouseCaptureArea { @Override public void mouseUp(int button) { if(button == 0 && active && mouseDown) { - Vector2f worldcoords = camera.screen2world(App.mouseX, App.mouseY); + Vector2i worldcoords = camera.screen2worldI(App.mouseX, App.mouseY); mouseDown = false; - float x1 = x; - float y1 = y; - float x2 = worldcoords.x; - float y2 = worldcoords.y; - float minX = Math.min(x1, x2); - float minY = Math.min(y1, y2); - float maxX = Math.max(x1, x2); - float maxY = Math.max(y1, y2); + int x1 = x; + int y1 = y; + int x2 = worldcoords.x; + int y2 = worldcoords.y; + int minX = Math.min(x1, x2); + int minY = Math.min(y1, y2); + int maxX = Math.max(x1, x2); + int maxY = Math.max(y1, y2); listener.select(minX, minY, maxX, maxY); } } + + + private Vector2i[] orderCoords(Vector2i a, Vector2i b) { + return new Vector2i[] { + new Vector2i(Math.min(a.x, b.x), Math.min(a.y, b.y)), + new Vector2i(Math.max(a.x, b.x), Math.max(a.y, b.y)), + new Vector2i(Math.max(a.x, b.x) - Math.min(a.x, b.x), Math.max(a.y, b.y) - Math.min(a.y, b.y)) + }; + } + @Override public Vector4f getBox() { return active ? new Vector4f(0, 0, 1024, 576) : Vector4f.zero; diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/tabs/BuildTab.java b/src/main/java/xyz/valnet/hadean/gameobjects/tabs/BuildTab.java index 8e3beb4..85d9c1e 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/tabs/BuildTab.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/tabs/BuildTab.java @@ -36,6 +36,7 @@ public class BuildTab extends Tab implements ISelectionChangeListener, IMouseCap private int padding = 10; private int x, y; + private int w, h; @Override public void render() { @@ -46,7 +47,9 @@ public class BuildTab extends Tab implements ISelectionChangeListener, IMouseCap if(opened.value()) { // draw the currently selected build item Assets.flat.pushColor(new Vector4f(1f, 1f, 1f, 0.8f)); - camera.draw(Layers.BUILD_INTERACTABLE, Assets.stockpile, x, y); + for(int i = 0; i < w; i ++) for(int j = 0; j < h; j ++) {{ + camera.draw(Layers.BUILD_INTERACTABLE, Assets.stockpile, x + i, y + j); + }} Assets.flat.popColor(); } } @@ -61,17 +64,19 @@ public class BuildTab extends Tab implements ISelectionChangeListener, IMouseCap IBuildLayerListener buildListener = new IBuildLayerListener() { @Override - public void update(float nx, float ny, float nw, float nh) { - x = (int)Math.floor(nx); - y = (int)Math.floor(ny); + public void update(int nx, int ny, int nw, int nh) { + x = nx; + y = ny; + w = nw; + h = nh; } @Override - public void select(float x1, float y1, float x2, float y2) { - int ix1 = (int)Math.floor(x1); - int iy1 = (int)Math.floor(y1); - int ix2 = (int)Math.floor(x2); - int iy2 = (int)Math.floor(y2); + public void select(int x1, int y1, int x2, int y2) { + int ix1 = x1; + int iy1 = y1; + int ix2 = x2; + int iy2 = y2; for(int x = ix1; x <= ix2; x ++) { for(int y = iy1; y <= iy2; y ++) { ITileThing thing = new FarmPlot(x, y); diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Item.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Item.java new file mode 100644 index 0000000..1ac1ef4 --- /dev/null +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Item.java @@ -0,0 +1,5 @@ +package xyz.valnet.hadean.gameobjects.worldobjects; + +public class Item { + +} diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Rice.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Rice.java index 027227b..5779a52 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Rice.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Rice.java @@ -1,5 +1,6 @@ package xyz.valnet.hadean.gameobjects.worldobjects; +import xyz.valnet.engine.math.Vector2f; import xyz.valnet.engine.math.Vector4f; import xyz.valnet.hadean.gameobjects.JobBoard; import xyz.valnet.hadean.interfaces.ISelectable; @@ -41,6 +42,11 @@ public class Rice extends WorldObject implements ITileThing, ISelectable { @Override public void render() { camera.draw(Layers.AIR, Assets.riceBag, x, y); + + Assets.flat.pushColor(Vector4f.black); + Vector2f screeCoords = camera.world2screen(x, y); + Assets.miniFont.drawString("123", (int)screeCoords.x, (int)screeCoords.y); + Assets.flat.popColor(); } @Override diff --git a/src/main/java/xyz/valnet/hadean/interfaces/IBuildLayerListener.java b/src/main/java/xyz/valnet/hadean/interfaces/IBuildLayerListener.java index 2b50d5c..0b8599e 100644 --- a/src/main/java/xyz/valnet/hadean/interfaces/IBuildLayerListener.java +++ b/src/main/java/xyz/valnet/hadean/interfaces/IBuildLayerListener.java @@ -1,7 +1,7 @@ package xyz.valnet.hadean.interfaces; public interface IBuildLayerListener { - public void update(float x, float y, float w, float h); - public void select(float x, float y, float w, float h); + public void update(int x, int y, int w, int h); + public void select(int x, int y, int w, int h); public void cancel(); } diff --git a/src/main/java/xyz/valnet/hadean/util/Assets.java b/src/main/java/xyz/valnet/hadean/util/Assets.java index fe02116..fdbc74c 100644 --- a/src/main/java/xyz/valnet/hadean/util/Assets.java +++ b/src/main/java/xyz/valnet/hadean/util/Assets.java @@ -14,6 +14,7 @@ public class Assets { public static final Texture atlas; public static final Font font; + public static final Font miniFont; public static final Tile9 redFrame; public static final Tile9 frame; public static final Tile9 fireFrame; @@ -165,6 +166,19 @@ public class Assets { charset.put('|', new Sprite(atlas, new Vector4i(224, 32, 8, 16))); font = new Font(charset, 8, 16); + Map miniCharset = new HashMap(); + miniCharset.put('1', new Sprite(atlas, new Vector4i(0, 112, 4, 5))); + miniCharset.put('2', new Sprite(atlas, new Vector4i(4, 112, 4, 5))); + miniCharset.put('3', new Sprite(atlas, new Vector4i(8, 112, 4, 5))); + miniCharset.put('4', new Sprite(atlas, new Vector4i(12, 112, 4, 5))); + miniCharset.put('5', new Sprite(atlas, new Vector4i(16, 112, 4, 5))); + miniCharset.put('6', new Sprite(atlas, new Vector4i(20, 112, 4, 5))); + miniCharset.put('7', new Sprite(atlas, new Vector4i(24, 112, 4, 5))); + miniCharset.put('8', new Sprite(atlas, new Vector4i(28, 112, 4, 5))); + miniCharset.put('9', new Sprite(atlas, new Vector4i(32, 112, 4, 5))); + miniCharset.put('0', new Sprite(atlas, new Vector4i(36, 112, 4, 5))); + miniFont = new Font(miniCharset, 4, 5); + frame = new Tile9( new Sprite(atlas, new Vector4i(24, 88, 8, 8)), new Sprite(atlas, new Vector4i(32, 88, 8, 8)),