workshop ui start

stable
Bronwen 2023-02-11 18:01:57 -05:00
parent 39710d33a7
commit 51d6c3db8b
8 changed files with 145 additions and 6 deletions

View File

@ -3,6 +3,7 @@ package xyz.valnet.engine.scenegraph;
import java.io.Serializable;
import java.util.List;
import xyz.valnet.engine.scenegraph.SceneGraph.GameObjectCallback;
import xyz.valnet.hadean.util.Pair;
public class GameObject implements IRenderable, ITickable, Serializable {
@ -91,4 +92,12 @@ public class GameObject implements IRenderable, ITickable, Serializable {
protected Pair<Float, Integer> getFPS() {
return scene.getFPS();
}
protected void onAddGameObject(GameObjectCallback listener) {
scene.registerAddListener(listener);
}
protected void onRemoveGameObject(GameObjectCallback listener) {
scene.registerRemoveListener(listener);
}
}

View File

@ -4,6 +4,7 @@ import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
@ -17,7 +18,6 @@ import java.util.stream.Collectors;
import xyz.valnet.engine.App;
import xyz.valnet.engine.Game;
import xyz.valnet.engine.math.Box;
import xyz.valnet.hadean.HadeanGame;
import xyz.valnet.hadean.gameobjects.ui.tabs.DebugTab;
import xyz.valnet.hadean.util.Pair;
@ -31,6 +31,22 @@ public abstract class SceneGraph implements IScene {
private boolean loadFlag = false;
private boolean saveFlag = false;
@FunctionalInterface
public interface GameObjectCallback extends Serializable {
public void apply(GameObject obj);
}
private Set<GameObjectCallback> onAddListeners = new HashSet<>();
private Set<GameObjectCallback> onRemoveListeners = new HashSet<>();
public void registerAddListener(GameObjectCallback cb) {
onAddListeners.add(cb);
}
public void registerRemoveListener(GameObjectCallback cb) {
onRemoveListeners.add(cb);
}
public <T> T get(Class<T> clazz) {
for(GameObject obj : objects) {
if(clazz.isInstance(obj)) {
@ -52,7 +68,7 @@ public abstract class SceneGraph implements IScene {
@Override
public void update(float dTime) {
dTime = 1;
dTime = Math.min(dTime, 6);
// ADD OBJECTS
if(!newObjects.isEmpty()) {
List<GameObject> added = new ArrayList<GameObject>();
@ -155,6 +171,12 @@ public abstract class SceneGraph implements IScene {
for(GameObject obj : objects) {
obj.addedToScene();
}
for(GameObject obj : objects) {
for(GameObjectCallback listener : onAddListeners) {
listener.apply(obj);
}
}
}
@Override
@ -180,6 +202,9 @@ public abstract class SceneGraph implements IScene {
newObjects.add(obj);
obj.link(this);
obj.addedToScene();
for(GameObjectCallback listener : onAddListeners) {
listener.apply(obj);
}
addObjectToCache(obj);
}
@ -191,6 +216,9 @@ public abstract class SceneGraph implements IScene {
public void remove(GameObject obj) {
removeObjects.add(obj);
for(GameObjectCallback listener : onRemoveListeners) {
listener.apply(obj);
}
}
public boolean inScene(GameObject gameObject) {

View File

@ -0,0 +1,27 @@
package xyz.valnet.engine.util;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class ClassToInstanceSet<B> {
private Map<Class<? extends B>, Set<B>> map = new HashMap<>();
private final <T extends B> void ensure(Class<T> clazz) {
if(!map.containsKey(clazz)) {
map.put(clazz, new HashSet<>());
}
}
public <T extends B> void add(Class<T> clazz, T obj) {
ensure(clazz);
var set = map.get(clazz);
set.add(obj);
}
@SuppressWarnings("unchecked") // it IS checked, by way of the add method.
public final <T extends B> Set<T> get(Class<T> clazz) {
return (Set<T>) map.get(clazz);
}
}

View File

@ -60,8 +60,7 @@ public class BuildLayer extends GameObject implements IMouseCaptureArea, ITransi
private void broadcastWorldCoords() {
Vector2i worldcoords = camera.getWorldMouse().asInt();
if(mouseDown) {
Vector2i[] ords = orderCoords(startingPoint, worldcoords);
listener.update(new Box(ords[0].x, ords[0].y, ords[2].x + 1, ords[2].y + 1));
listener.update(Box.fromPoints(startingPoint, camera.getWorldMouse()));
return;
}
if(type == BuildType.SINGLE && dimensions != null) {

View File

@ -0,0 +1,46 @@
package xyz.valnet.hadean.gameobjects.ui;
import xyz.valnet.engine.graphics.ImmediateUI;
import xyz.valnet.engine.scenegraph.ITransient;
import xyz.valnet.hadean.gameobjects.inputlayer.SelectionLayer;
import xyz.valnet.hadean.interfaces.IWorkshop;
public class WorkshopOrdersUI extends ImmediateUI implements ITransient {
private IWorkshop shop;
private SelectionLayer selectionLayer;
public void open(IWorkshop shop) {
this.shop = shop;
}
public void close() {
this.shop = null;
}
@Override
protected void gui() {
if(shop == null) return;
window(0, 0, 200, 300, () -> {
text("stuff");
});
}
@Override
protected void connect() {
super.connect();
this.selectionLayer = get(SelectionLayer.class);
}
@Override
protected void start() {
super.start();
this.selectionLayer.subscribe((selection) -> {
if(!selection.contains(shop)) {
close();
}
});
}
}

View File

@ -2,11 +2,17 @@ package xyz.valnet.hadean.gameobjects.worldobjects.constructions;
import xyz.valnet.engine.graphics.Sprite;
import xyz.valnet.engine.math.Vector2i;
import xyz.valnet.hadean.gameobjects.ui.WorkshopOrdersUI;
import xyz.valnet.hadean.gameobjects.worldobjects.items.Log;
import xyz.valnet.hadean.interfaces.IItemPredicate;
import xyz.valnet.hadean.interfaces.IWorkshop;
import xyz.valnet.hadean.util.Action;
import xyz.valnet.hadean.util.Assets;
public class MasonWorkshop extends Construction {
public class MasonWorkshop extends Construction implements IWorkshop {
private static Action OPEN_ORDERS = new Action("Orders");
private transient WorkshopOrdersUI ordersWindow;
@Override
protected IItemPredicate getBuildingMaterial() {
@ -37,5 +43,23 @@ public class MasonWorkshop extends Construction {
public Vector2i getDimensions() {
return new Vector2i(3, 3);
}
@Override
public Action[] getActions() {
return new Action[] { OPEN_ORDERS };
}
@Override
public void runAction(Action action) {
if(action == OPEN_ORDERS) {
ordersWindow.open(this);
}
}
@Override
protected void connect() {
super.connect();
ordersWindow = get(WorkshopOrdersUI.class);
}
}

View File

@ -0,0 +1,5 @@
package xyz.valnet.hadean.interfaces;
public interface IWorkshop {
}

View File

@ -7,6 +7,7 @@ import xyz.valnet.hadean.gameobjects.Camera;
import xyz.valnet.hadean.gameobjects.Clock;
import xyz.valnet.hadean.gameobjects.jobs.JobBoard;
import xyz.valnet.hadean.gameobjects.ui.SelectionUI;
import xyz.valnet.hadean.gameobjects.ui.WorkshopOrdersUI;
import xyz.valnet.hadean.gameobjects.terrain.Terrain;
import xyz.valnet.hadean.gameobjects.inputlayer.BuildLayer;
import xyz.valnet.hadean.gameobjects.inputlayer.SelectionLayer;
@ -43,12 +44,12 @@ public class GameScene extends SceneGraph {
objects.add(new Pawn());
}
objects.add(new WorkshopOrdersUI());
objects.add(new SelectionLayer());
objects.add(new SelectionUI());
objects.add(new BuildLayer());
objects.add(new HoverQuery());
objects.add(new BottomBar());