package xyz.valnet.engine.scenegraph; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import xyz.valnet.engine.App; public abstract class SceneGraph implements IScene { protected final List objects = new ArrayList(); private final List newObjects = new ArrayList(); private final List removeObjects = new ArrayList(); private IMouseCaptureArea hoveredMouseListener = null; public T get(Class clazz) { for(GameObject obj : objects) { if(clazz.isInstance(obj)) { return clazz.cast(obj); } } return null; } public List getAll(Class clazz) { List stuff = new ArrayList(); for(GameObject obj : objects) { if(clazz.isInstance(obj)) { stuff.add(clazz.cast(obj)); } } return stuff; } @Override public void update(float dTime) { // ADD OBJECTS if(!newObjects.isEmpty()) { List added = new ArrayList(); for(GameObject obj : newObjects) { objects.add(obj); added.add(obj); } newObjects.clear(); } // REMOVE OBJECTS if(!removeObjects.isEmpty()) { for(GameObject obj : removeObjects) { objects.remove(obj); } removeObjects.clear(); } // TICK OBJECTS for(GameObject obj : objects) { obj.update(dTime); } // DO MOUSE UPDATES! List mouseListeners = getAll(IMouseCaptureArea.class); mouseListeners.sort(new Comparator() { @Override public int compare(IMouseCaptureArea a, IMouseCaptureArea b) { float al = a.getLayer(); float bl = b.getLayer(); return al < bl ? 1 : bl < al ? -1 : 0; } }); for(IMouseCaptureArea listener : mouseListeners) { boolean currentlyEntered = listener.getBox().contains(App.mouseX, App.mouseY); if(currentlyEntered) { if(listener != hoveredMouseListener) { if(hoveredMouseListener != null) { hoveredMouseListener.mouseLeave(); } hoveredMouseListener = listener; listener.mouseEnter(); } break; } else if(listener == hoveredMouseListener) { // this is the one that is currently hovered, but it isnt! // turn that shit OFF hoveredMouseListener.mouseLeave(); hoveredMouseListener = null; } } } @Override public void enable() { this.construct(); for(GameObject obj : objects) { obj.link(this); } for(GameObject obj : objects) { obj.start(); } } @Override public void render() { for(GameObject obj : objects) { obj.render(); } for(GameObject obj : objects) { obj.renderAlpha(); } } protected abstract void construct(); @Override public void disable() { objects.clear(); } public void add(GameObject obj) { newObjects.add(obj); obj.link(this); obj.start(); } public void remove(GameObject obj) { removeObjects.add(obj); } public boolean inScene(GameObject gameObject) { return objects.contains(gameObject) || newObjects.contains(gameObject); } public void dump() { for(GameObject go : objects) System.out.println(go); } @Override public void mouseDown(int button) { for(IMouseCaptureArea iml : getAll(IMouseCaptureArea.class)) { iml.mouseDown(button); } } @Override public void mouseUp(int button) { for(IMouseCaptureArea iml : getAll(IMouseCaptureArea.class)) { iml.mouseUp(button); } } }