layers are floats now, better camera implementation!

pull/1/head
Valerie 2022-06-02 03:27:38 -04:00
parent a0604b4555
commit a4aafa9b04
21 changed files with 80 additions and 76 deletions

View File

@ -9,5 +9,5 @@ public interface IMouseCaptureArea {
public void mouseUp(int button); public void mouseUp(int button);
public Vector4f getBox(); public Vector4f getBox();
public int getLayer(); public float getLayer();
} }

View File

@ -67,8 +67,8 @@ public abstract class SceneGraph implements IScene {
mouseListeners.sort(new Comparator<IMouseCaptureArea>() { mouseListeners.sort(new Comparator<IMouseCaptureArea>() {
@Override @Override
public int compare(IMouseCaptureArea a, IMouseCaptureArea b) { public int compare(IMouseCaptureArea a, IMouseCaptureArea b) {
int al = a.getLayer(); float al = a.getLayer();
int bl = b.getLayer(); float bl = b.getLayer();
return al < bl ? 1 : bl < al ? -1 : 0; return al < bl ? 1 : bl < al ? -1 : 0;
} }
}); });

View File

@ -3,7 +3,9 @@ package xyz.valnet.hadean.gameobjects;
import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.graphics.Drawing;
import xyz.valnet.engine.graphics.Sprite; import xyz.valnet.engine.graphics.Sprite;
import xyz.valnet.engine.math.Vector2f; import xyz.valnet.engine.math.Vector2f;
import xyz.valnet.engine.math.Vector4f;
import xyz.valnet.engine.scenegraph.GameObject; import xyz.valnet.engine.scenegraph.GameObject;
import xyz.valnet.hadean.interfaces.IWorldBoundsAdapter;
public class Camera extends GameObject { public class Camera extends GameObject {
@ -13,6 +15,16 @@ public class Camera extends GameObject {
private Vector2f focus = new Vector2f(0, 0); private Vector2f focus = new Vector2f(0, 0);
private float minY, maxY;
@Override
public void start() {
IWorldBoundsAdapter worldBoundsAdapter = get(IWorldBoundsAdapter.class);
Vector4f bounds = worldBoundsAdapter.getWorldBounds();
minY = bounds.y;
maxY = bounds.w;
}
public void focus(float x, float y) { public void focus(float x, float y) {
this.focus.x = x; this.focus.x = x;
this.focus.y = y; this.focus.y = y;
@ -26,14 +38,26 @@ public class Camera extends GameObject {
return new Vector2f((x - screenWidth / 2 + focus.x * tileWidth) / tileWidth, (y - screenHeight / 2 + focus.y * tileWidth) / tileWidth); return new Vector2f((x - screenWidth / 2 + focus.x * tileWidth) / tileWidth, (y - screenHeight / 2 + focus.y * tileWidth) / tileWidth);
} }
@Deprecated
public void draw(Sprite sprite, float x, float y) { public void draw(Sprite sprite, float x, float y) {
Vector2f screenPos = world2screen(x, y); Vector2f screenPos = world2screen(x, y);
Drawing.drawSprite(sprite, (int)(screenPos.x), (int)(screenPos.y), tileWidth, tileWidth); Drawing.drawSprite(sprite, (int)(screenPos.x), (int)(screenPos.y), tileWidth, tileWidth);
} }
@Deprecated
public void draw(Sprite sprite, float x, float y, float w, float h) { public void draw(Sprite sprite, float x, float y, float w, float h) {
Vector2f screenPos = world2screen(x, y); Vector2f screenPos = world2screen(x, y);
Drawing.drawSprite(sprite, (int)(screenPos.x), (int)(screenPos.y), (int)(tileWidth * w), (int)(tileWidth * h)); Drawing.drawSprite(sprite, (int)(screenPos.x), (int)(screenPos.y), (int)(tileWidth * w), (int)(tileWidth * h));
} }
public void draw(float layer, Sprite sprite, float x, float y) {
draw(layer, sprite, x, y, 1, 1);
}
public void draw(float layer, Sprite sprite, float x, float y, float w, float h) {
Vector2f screenPos = world2screen(x, y);
Drawing.setLayer(layer + (((y + h) - minY) / (maxY - minY)));
Drawing.drawSprite(sprite, (int)(screenPos.x), (int)(screenPos.y), (int)(tileWidth * w), (int)(tileWidth * h));
}
} }

View File

@ -198,7 +198,7 @@ public class SelectionUI extends GameObject implements ISelectionChangeListener,
} }
@Override @Override
public int getLayer() { public float getLayer() {
return Layers.GENERAL_UI; return Layers.GENERAL_UI;
} }
} }

View File

@ -1,6 +1,5 @@
package xyz.valnet.hadean.gameobjects; package xyz.valnet.hadean.gameobjects;
import xyz.valnet.engine.graphics.Drawing;
import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4f;
import xyz.valnet.hadean.gameobjects.worldobjects.WorldObject; import xyz.valnet.hadean.gameobjects.worldobjects.WorldObject;
import xyz.valnet.hadean.interfaces.ISelectable; import xyz.valnet.hadean.interfaces.ISelectable;
@ -24,8 +23,7 @@ public class Stockpile extends WorldObject implements ITileThing, ISelectable {
@Override @Override
public void render() { public void render() {
Drawing.setLayer(Layers.GROUND); camera.draw(Layers.GROUND, Assets.stockpile, x, y);
camera.draw(Assets.stockpile, x, y);
} }
@Override @Override

View File

@ -1,10 +1,11 @@
package xyz.valnet.hadean.gameobjects; package xyz.valnet.hadean.gameobjects;
import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector4f;
import xyz.valnet.engine.scenegraph.GameObject; import xyz.valnet.engine.scenegraph.GameObject;
import xyz.valnet.hadean.interfaces.IWorldBoundsAdapter;
import xyz.valnet.hadean.pathfinding.IPathable; import xyz.valnet.hadean.pathfinding.IPathable;
public class Terrain extends GameObject implements IPathable { public class Terrain extends GameObject implements IPathable, IWorldBoundsAdapter {
public static final int WORLD_SIZE = 24; public static final int WORLD_SIZE = 24;
public static final int TILE_SIZE = 8; public static final int TILE_SIZE = 8;
@ -32,12 +33,6 @@ public class Terrain extends GameObject implements IPathable {
camera.focus(WORLD_SIZE / 2, WORLD_SIZE / 2); camera.focus(WORLD_SIZE / 2, WORLD_SIZE / 2);
} }
private Tile getRandomTile() {
int x = (int) Math.floor(Math.random() * WORLD_SIZE);
int y = (int) Math.floor(Math.random() * WORLD_SIZE);
return getTile(x, y);
}
public Tile getTile(int x, int y) { public Tile getTile(int x, int y) {
return tiles[x][y]; return tiles[x][y];
} }
@ -55,4 +50,9 @@ public class Terrain extends GameObject implements IPathable {
return x < 0 || y < 0 || x >= WORLD_SIZE || y >= WORLD_SIZE; return x < 0 || y < 0 || x >= WORLD_SIZE || y >= WORLD_SIZE;
} }
@Override
public Vector4f getWorldBounds() {
return new Vector4f(0, 0, WORLD_SIZE, WORLD_SIZE);
}
} }

View File

@ -3,12 +3,10 @@ package xyz.valnet.hadean.gameobjects;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import xyz.valnet.engine.graphics.Drawing;
import xyz.valnet.engine.graphics.Sprite; import xyz.valnet.engine.graphics.Sprite;
import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector2i;
import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4f;
import xyz.valnet.engine.scenegraph.GameObject; import xyz.valnet.engine.scenegraph.GameObject;
import xyz.valnet.hadean.gameobjects.worldobjects.Log;
import xyz.valnet.hadean.gameobjects.worldobjects.Tree; import xyz.valnet.hadean.gameobjects.worldobjects.Tree;
import xyz.valnet.hadean.interfaces.ITileThing; import xyz.valnet.hadean.interfaces.ITileThing;
import xyz.valnet.hadean.util.Assets; import xyz.valnet.hadean.util.Assets;
@ -37,7 +35,7 @@ public class Tile extends GameObject {
public void start() { public void start() {
camera = get(Camera.class); camera = get(Camera.class);
if(Math.random() > 0.97) { if(Math.random() > 0.9) {
Tree tree = new Tree(x, y); Tree tree = new Tree(x, y);
stuff.add(tree); stuff.add(tree);
add(tree); add(tree);
@ -77,9 +75,8 @@ public class Tile extends GameObject {
@Override @Override
public void render() { public void render() {
Drawing.setLayer(Layers.TILES);
Assets.flat.pushColor(color); Assets.flat.pushColor(color);
camera.draw(sprite, x, y); camera.draw(Layers.TILES, sprite, x, y);
Assets.flat.popColor(); Assets.flat.popColor();
} }

View File

@ -95,7 +95,7 @@ public class BuildLayer extends GameObject implements IMouseCaptureArea {
} }
@Override @Override
public int getLayer() { public float getLayer() {
return Layers.BUILD_INTERACTABLE; return Layers.BUILD_INTERACTABLE;
} }

View File

@ -166,7 +166,7 @@ public class Selection extends GameObject implements IMouseCaptureArea {
} }
@Override @Override
public int getLayer() { public float getLayer() {
return 0; return 0;
} }

View File

@ -44,10 +44,9 @@ public class BuildTab extends Tab implements ISelectionChangeListener, IMouseCap
Assets.uiFrame.draw((int) left, padding, (int) width, 576 - padding * 2 - BottomBar.bottomBarHeight); Assets.uiFrame.draw((int) left, padding, (int) width, 576 - padding * 2 - BottomBar.bottomBarHeight);
if(opened.value()) { if(opened.value()) {
Drawing.setLayer(Layers.BUILD_INTERACTABLE);
// draw the currently selected build item // draw the currently selected build item
Assets.flat.pushColor(new Vector4f(1f, 1f, 1f, 0.8f)); Assets.flat.pushColor(new Vector4f(1f, 1f, 1f, 0.8f));
camera.draw(Assets.stockpile, x, y); camera.draw(Layers.BUILD_INTERACTABLE, Assets.stockpile, x, y);
Assets.flat.popColor(); Assets.flat.popColor();
} }
} }
@ -145,7 +144,7 @@ public class BuildTab extends Tab implements ISelectionChangeListener, IMouseCap
} }
@Override @Override
public int getLayer() { public float getLayer() {
return Layers.GENERAL_UI; return Layers.GENERAL_UI;
} }
} }

View File

@ -7,10 +7,7 @@ import java.util.List;
import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.graphics.Drawing;
import xyz.valnet.hadean.gameobjects.BottomBar; import xyz.valnet.hadean.gameobjects.BottomBar;
import xyz.valnet.hadean.gameobjects.Camera;
import xyz.valnet.hadean.gameobjects.JobBoard; import xyz.valnet.hadean.gameobjects.JobBoard;
import xyz.valnet.hadean.gameobjects.Terrain;
import xyz.valnet.hadean.gameobjects.inputlayer.BuildLayer;
import xyz.valnet.hadean.gameobjects.inputlayer.Selection; import xyz.valnet.hadean.gameobjects.inputlayer.Selection;
import xyz.valnet.hadean.interfaces.ISelectable; import xyz.valnet.hadean.interfaces.ISelectable;
import xyz.valnet.hadean.interfaces.ISelectionChangeListener; import xyz.valnet.hadean.interfaces.ISelectionChangeListener;
@ -29,8 +26,6 @@ public class JobBoardTab extends Tab implements ISelectionChangeListener {
private int padding = 10; private int padding = 10;
private int x, y;
@Override @Override
public void render() { public void render() {
Drawing.setLayer(Layers.GENERAL_UI); Drawing.setLayer(Layers.GENERAL_UI);

View File

@ -1,6 +1,5 @@
package xyz.valnet.hadean.gameobjects.worldobjects; package xyz.valnet.hadean.gameobjects.worldobjects;
import xyz.valnet.engine.graphics.Drawing;
import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector2i;
import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4f;
import xyz.valnet.hadean.gameobjects.JobBoard; import xyz.valnet.hadean.gameobjects.JobBoard;
@ -30,15 +29,13 @@ public class FarmPlot extends WorldObject implements IWorkable, ISelectable, ITi
@Override @Override
public void render() { public void render() {
Drawing.setLayer(Layers.GROUND); camera.draw(Layers.GROUND, Assets.farmPlot, x, y);
camera.draw(Assets.farmPlot, x, y);
if(planted) { if(planted) {
if(stage > 1) { if(stage > 1) {
Drawing.setLayer(Layers.AIR); camera.draw(Layers.AIR, Assets.growingRice[stage], x, y - 1, 1, 2);
camera.draw(Assets.growingRice[stage], x, y - 1, 1, 2);
} else { } else {
camera.draw(Assets.growingRice[stage], x, y); camera.draw(Layers.AIR, Assets.growingRice[stage], x, y);
} }
} }
} }

View File

@ -1,6 +1,5 @@
package xyz.valnet.hadean.gameobjects.worldobjects; package xyz.valnet.hadean.gameobjects.worldobjects;
import xyz.valnet.engine.graphics.Drawing;
import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector2i;
import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4f;
import xyz.valnet.hadean.gameobjects.JobBoard; import xyz.valnet.hadean.gameobjects.JobBoard;
@ -47,11 +46,9 @@ public class Log extends WorldObject implements ITileThing, ISelectable, IHaulab
@Override @Override
public void render() { public void render() {
Drawing.setLayer(Layers.GROUND); camera.draw(Layers.GROUND, Assets.log, x, y);
camera.draw(Assets.log, x, y);
if(haul.value()) { if(haul.value()) {
Drawing.setLayer(Layers.MARKERS); camera.draw(Layers.MARKERS, Assets.haulArrow, x, y);
camera.draw(Assets.haulArrow, x, y);
} }
} }

View File

@ -7,7 +7,6 @@ import static org.lwjgl.opengl.GL11.glVertex3f;
import static org.lwjgl.opengl.GL20.glVertexAttrib2f; import static org.lwjgl.opengl.GL20.glVertexAttrib2f;
import static xyz.valnet.engine.util.Math.lerp; import static xyz.valnet.engine.util.Math.lerp;
import xyz.valnet.engine.graphics.Drawing;
import xyz.valnet.engine.math.Vector2f; import xyz.valnet.engine.math.Vector2f;
import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector2i;
import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4f;
@ -27,6 +26,7 @@ import xyz.valnet.hadean.pathfinding.Node;
import xyz.valnet.hadean.pathfinding.Path; import xyz.valnet.hadean.pathfinding.Path;
import xyz.valnet.hadean.util.Action; import xyz.valnet.hadean.util.Action;
import xyz.valnet.hadean.util.Assets; import xyz.valnet.hadean.util.Assets;
import xyz.valnet.hadean.util.Layers;
public class Pawn extends WorldObject implements ISelectable, IWorker { public class Pawn extends WorldObject implements ISelectable, IWorker {
@ -77,13 +77,11 @@ public class Pawn extends WorldObject implements ISelectable, IWorker {
@Override @Override
public void render() { public void render() {
Drawing.setLayer(3f);
if(path != null && !path.isComplete()) { if(path != null && !path.isComplete()) {
Node next = path.peek(); Node next = path.peek();
float t = counter / invocationThreshold; float t = counter / invocationThreshold;
camera.draw(Assets.pawn, lerp(x - 0.5f, next.x, t), lerp(y - 0.5f, next.y, t)); camera.draw(Layers.PAWNS, Assets.pawn, lerp(x - 0.5f, next.x, t), lerp(y - 0.5f, next.y, t));
if(path != null && debug) { if(path != null && debug) {
for(Node node : path) { for(Node node : path) {
@ -102,7 +100,7 @@ public class Pawn extends WorldObject implements ISelectable, IWorker {
} }
} }
} else { } else {
camera.draw(Assets.pawn, x - 0.5f, y - 0.5f); camera.draw(Layers.PAWNS, Assets.pawn, x - 0.5f, y - 0.5f);
} }
// Drawing.setLayer(0.1f); // Drawing.setLayer(0.1f);

View File

@ -1,19 +1,12 @@
package xyz.valnet.hadean.gameobjects.worldobjects; package xyz.valnet.hadean.gameobjects.worldobjects;
import xyz.valnet.engine.graphics.Drawing;
import xyz.valnet.engine.math.Vector2i;
import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4f;
import xyz.valnet.hadean.gameobjects.JobBoard; import xyz.valnet.hadean.gameobjects.JobBoard;
import xyz.valnet.hadean.gameobjects.Stockpile;
import xyz.valnet.hadean.gameobjects.Tile;
import xyz.valnet.hadean.interfaces.IHaulable;
import xyz.valnet.hadean.interfaces.ISelectable; import xyz.valnet.hadean.interfaces.ISelectable;
import xyz.valnet.hadean.interfaces.ITileThing; import xyz.valnet.hadean.interfaces.ITileThing;
import xyz.valnet.hadean.util.Action; import xyz.valnet.hadean.util.Action;
import xyz.valnet.hadean.util.Assets; import xyz.valnet.hadean.util.Assets;
import xyz.valnet.hadean.util.Layers; import xyz.valnet.hadean.util.Layers;
import xyz.valnet.hadean.util.SmartBoolean;
import xyz.valnet.hadean.util.SmartBoolean.IListener;
public class Rice extends WorldObject implements ITileThing, ISelectable { public class Rice extends WorldObject implements ITileThing, ISelectable {
@ -47,8 +40,7 @@ public class Rice extends WorldObject implements ITileThing, ISelectable {
@Override @Override
public void render() { public void render() {
Drawing.setLayer(Layers.AIR); camera.draw(Layers.AIR, Assets.riceBag, x, y);
camera.draw(Assets.riceBag, x, y);
} }
@Override @Override

View File

@ -1,6 +1,5 @@
package xyz.valnet.hadean.gameobjects.worldobjects; package xyz.valnet.hadean.gameobjects.worldobjects;
import xyz.valnet.engine.graphics.Drawing;
import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector2i;
import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.math.Vector4f;
import xyz.valnet.hadean.gameobjects.JobBoard; import xyz.valnet.hadean.gameobjects.JobBoard;
@ -28,12 +27,10 @@ public class Tree extends WorldObject implements ITileThing, ISelectable, IWorka
@Override @Override
public void render() { public void render() {
Assets.flat.pushColor(new Vector4f(1 - getProgress(), 1 - getProgress(), 1 - getProgress(), 1.0f)); Assets.flat.pushColor(new Vector4f(1 - getProgress(), 1 - getProgress(), 1 - getProgress(), 1.0f));
Drawing.setLayer(Layers.AIR); camera.draw(Layers.AIR, Assets.tree, x - 1, y - 2, 3, 3);
camera.draw(Assets.tree, x - 1, y - 2, 3, 3);
Assets.flat.popColor(); Assets.flat.popColor();
if(hasWork()) { if(hasWork()) {
Drawing.setLayer(Layers.MARKERS); camera.draw(Layers.MARKERS, Assets.lilAxe, x, y);
camera.draw(Assets.lilAxe, x, y);
} }
} }

View File

@ -26,9 +26,9 @@ public class Button extends GameObject implements IMouseCaptureArea {
protected float activeVPad = 0.1f; protected float activeVPad = 0.1f;
protected float activeHPad = 0.0f; protected float activeHPad = 0.0f;
protected int layer; protected float layer;
public Button(Tile9 frame, String text, int x, int y, int w, int h, int l) { public Button(Tile9 frame, String text, int x, int y, int w, int h, float l) {
this.x = x; this.x = x;
this.y = y; this.y = y;
width = w; width = w;
@ -188,7 +188,7 @@ public class Button extends GameObject implements IMouseCaptureArea {
} }
@Override @Override
public int getLayer() { public float getLayer() {
return layer; return layer;
} }
} }

View File

@ -57,7 +57,7 @@ public class GOButton extends GameObject implements IMouseCaptureArea {
} }
@Override @Override
public int getLayer() { public float getLayer() {
return layer; return layer;
} }

View File

@ -4,7 +4,7 @@ import xyz.valnet.hadean.util.Assets;
public class SimpleButton extends Button { public class SimpleButton extends Button {
public SimpleButton(String text, int x, int y, int w, int h, int l) { public SimpleButton(String text, int x, int y, int w, int h, float l) {
super(Assets.uiFrame, text, x, y, w, h, l); super(Assets.uiFrame, text, x, y, w, h, l);
this.activeHPad = 0f; this.activeHPad = 0f;

View File

@ -0,0 +1,9 @@
package xyz.valnet.hadean.interfaces;
import xyz.valnet.engine.math.Vector4f;
public interface IWorldBoundsAdapter {
public Vector4f getWorldBounds();
}

View File

@ -6,16 +6,17 @@ public class Layers {
return current; return current;
} }
public static final int BACKGROUND = current ++; public static final float BACKGROUND = current ++;
public static final int TILES = current ++; public static final float TILES = current ++;
public static final int GROUND = current ++; public static final float GROUND = current ++;
public static final int AIR = current ++; public static final float AIR = current ++;
public static final int MARKERS = current ++; public static final float PAWNS = Layers.AIR + 0.001f;
public static final int SELECTION_IDENTIFIERS = current ++; public static final float MARKERS = current ++;
public static final int AREA_SELECT_BOX = current ++; public static final float SELECTION_IDENTIFIERS = current ++;
public static final int BUILD_INTERACTABLE = current ++; public static final float AREA_SELECT_BOX = current ++;
public static final int GENERAL_UI = current ++; public static final float BUILD_INTERACTABLE = current ++;
public static final int GENERAL_UI_INTERACTABLE = current ++; public static final float GENERAL_UI = current ++;
public static final int BOTTOM_BAR = current ++; public static final float GENERAL_UI_INTERACTABLE = current ++;
public static final float BOTTOM_BAR = current ++;
} }