Refactored SELECTABLE and SELECTED states to components

This commit is contained in:
Collin Smith
2019-11-12 04:08:34 -08:00
parent 93be087793
commit 318382ee34
9 changed files with 50 additions and 33 deletions

View File

@ -3,10 +3,8 @@ package com.riiablo.engine;
public final class Flags { public final class Flags {
public static final int NONE = 0; public static final int NONE = 0;
public static final int DEBUG = 1 << 0; public static final int DEBUG = 1 << 0;
public static final int SELECTABLE = 1 << 1; public static final int INVISIBLE = 1 << 1;
public static final int SELECTED = 1 << 2; public static final int RUNNING = 1 << 2;
public static final int INVISIBLE = 1 << 3;
public static final int RUNNING = 1 << 4;
public static String toString(int bits) { public static String toString(int bits) {
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
@ -14,8 +12,6 @@ public final class Flags {
builder.append("NONE"); builder.append("NONE");
} else { } else {
if ((bits & DEBUG) == DEBUG) builder.append("DEBUG").append("|"); if ((bits & DEBUG) == DEBUG) builder.append("DEBUG").append("|");
if ((bits & SELECTABLE) == SELECTABLE) builder.append("SELECTABLE").append("|");
if ((bits & SELECTED) == SELECTED) builder.append("SELECTED").append("|");
if ((bits & INVISIBLE) == INVISIBLE) builder.append("INVISIBLE").append("|"); if ((bits & INVISIBLE) == INVISIBLE) builder.append("INVISIBLE").append("|");
if ((bits & RUNNING) == RUNNING) builder.append("RUNNING").append("|"); if ((bits & RUNNING) == RUNNING) builder.append("RUNNING").append("|");
if (builder.length() > 0) builder.setLength(builder.length() - 1); if (builder.length() > 0) builder.setLength(builder.length() - 1);

View File

@ -0,0 +1,8 @@
package com.riiablo.engine.component;
import com.badlogic.ashley.core.Component;
import com.badlogic.gdx.utils.Pool;
public class HoveredComponent implements Component, Pool.Poolable {
@Override public void reset() {}
}

View File

@ -0,0 +1,8 @@
package com.riiablo.engine.component;
import com.badlogic.ashley.core.Component;
import com.badlogic.gdx.utils.Pool;
public class SelectableComponent implements Component, Pool.Poolable {
@Override public void reset() {}
}

View File

@ -5,12 +5,13 @@ import com.badlogic.ashley.core.Entity;
import com.badlogic.ashley.core.Family; import com.badlogic.ashley.core.Family;
import com.badlogic.ashley.systems.IteratingSystem; import com.badlogic.ashley.systems.IteratingSystem;
import com.riiablo.codec.Animation; import com.riiablo.codec.Animation;
import com.riiablo.engine.Flags;
import com.riiablo.engine.SystemPriority; import com.riiablo.engine.SystemPriority;
import com.riiablo.engine.component.AnimationComponent; import com.riiablo.engine.component.AnimationComponent;
import com.riiablo.engine.component.HoveredComponent;
public class AnimationSystem extends IteratingSystem { public class AnimationSystem extends IteratingSystem {
private final ComponentMapper<AnimationComponent> animationComponent = ComponentMapper.getFor(AnimationComponent.class); private final ComponentMapper<AnimationComponent> animationComponent = ComponentMapper.getFor(AnimationComponent.class);
private final ComponentMapper<HoveredComponent> hoveredComponent = ComponentMapper.getFor(HoveredComponent.class);
public AnimationSystem() { public AnimationSystem() {
super(Family.all(AnimationComponent.class).get(), SystemPriority.AnimationSystem); super(Family.all(AnimationComponent.class).get(), SystemPriority.AnimationSystem);
@ -20,6 +21,6 @@ public class AnimationSystem extends IteratingSystem {
protected void processEntity(Entity entity, float delta) { protected void processEntity(Entity entity, float delta) {
Animation animation = animationComponent.get(entity).animation; Animation animation = animationComponent.get(entity).animation;
animation.act(delta); animation.act(delta);
animation.setHighlighted((entity.flags & Flags.SELECTED) == Flags.SELECTED); animation.setHighlighted(hoveredComponent.has(entity));
} }
} }

View File

@ -9,7 +9,7 @@ import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Align;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import com.riiablo.camera.IsometricCamera; import com.riiablo.camera.IsometricCamera;
import com.riiablo.engine.Flags; import com.riiablo.engine.component.HoveredComponent;
import com.riiablo.engine.component.LabelComponent; import com.riiablo.engine.component.LabelComponent;
import com.riiablo.engine.component.PositionComponent; import com.riiablo.engine.component.PositionComponent;
@ -23,7 +23,7 @@ public class LabelSystem extends IteratingSystem {
private final Array<Actor> labels = new Array<>(); private final Array<Actor> labels = new Array<>();
public LabelSystem(IsometricCamera iso) { public LabelSystem(IsometricCamera iso) {
super(Family.all(PositionComponent.class, LabelComponent.class).get()); super(Family.all(PositionComponent.class, LabelComponent.class, HoveredComponent.class).get());
this.iso = iso; this.iso = iso;
setProcessing(false); setProcessing(false);
} }
@ -36,10 +36,6 @@ public class LabelSystem extends IteratingSystem {
@Override @Override
protected void processEntity(Entity entity, float delta) { protected void processEntity(Entity entity, float delta) {
if ((entity.flags & Flags.SELECTED) != Flags.SELECTED) {
return;
}
PositionComponent positionComponent = this.positionComponent.get(entity); PositionComponent positionComponent = this.positionComponent.get(entity);
iso.toScreen(tmpVec2.set(positionComponent.position)); iso.toScreen(tmpVec2.set(positionComponent.position));

View File

@ -7,10 +7,10 @@ import com.badlogic.ashley.core.EntityListener;
import com.badlogic.ashley.core.EntitySystem; import com.badlogic.ashley.core.EntitySystem;
import com.badlogic.ashley.core.Family; import com.badlogic.ashley.core.Family;
import com.badlogic.ashley.utils.ImmutableArray; import com.badlogic.ashley.utils.ImmutableArray;
import com.riiablo.engine.Flags;
import com.riiablo.engine.component.CofComponent; import com.riiablo.engine.component.CofComponent;
import com.riiablo.engine.component.MonsterComponent; import com.riiablo.engine.component.MonsterComponent;
import com.riiablo.engine.component.ObjectComponent; import com.riiablo.engine.component.ObjectComponent;
import com.riiablo.engine.component.SelectableComponent;
import com.riiablo.engine.component.WarpComponent; import com.riiablo.engine.component.WarpComponent;
public class SelectableSystem extends EntitySystem { public class SelectableSystem extends EntitySystem {
@ -44,6 +44,8 @@ public class SelectableSystem extends EntitySystem {
public void entityRemoved(Entity entity) {} public void entityRemoved(Entity entity) {}
}; };
private final ComponentMapper<SelectableComponent> selectableComponent = ComponentMapper.getFor(SelectableComponent.class);
public SelectableSystem() { public SelectableSystem() {
super(); super();
} }
@ -75,11 +77,11 @@ public class SelectableSystem extends EntitySystem {
} }
} }
private static void setSelectable(Entity entity, boolean b) { private void setSelectable(Entity entity, boolean b) {
if (b) { if (b) {
entity.flags |= Flags.SELECTABLE; if (!selectableComponent.has(entity)) entity.add(getEngine().createComponent(SelectableComponent.class));
} else { } else {
entity.flags &= ~Flags.SELECTABLE; entity.remove(SelectableComponent.class);
} }
} }
} }

View File

@ -8,20 +8,22 @@ import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
import com.riiablo.camera.IsometricCamera; import com.riiablo.camera.IsometricCamera;
import com.riiablo.codec.util.BBox; import com.riiablo.codec.util.BBox;
import com.riiablo.engine.Flags;
import com.riiablo.engine.component.BBoxComponent; import com.riiablo.engine.component.BBoxComponent;
import com.riiablo.engine.component.HoveredComponent;
import com.riiablo.engine.component.PositionComponent; import com.riiablo.engine.component.PositionComponent;
import com.riiablo.engine.component.SelectableComponent;
public class SelectedSystem extends IteratingSystem { public class SelectedSystem extends IteratingSystem {
private final ComponentMapper<BBoxComponent> boxComponent = ComponentMapper.getFor(BBoxComponent.class); private final ComponentMapper<BBoxComponent> boxComponent = ComponentMapper.getFor(BBoxComponent.class);
private final ComponentMapper<PositionComponent> positionComponent = ComponentMapper.getFor(PositionComponent.class); private final ComponentMapper<PositionComponent> positionComponent = ComponentMapper.getFor(PositionComponent.class);
private final ComponentMapper<HoveredComponent> hoveredComponent = ComponentMapper.getFor(HoveredComponent.class);
private final IsometricCamera iso; private final IsometricCamera iso;
private final Vector2 coords = new Vector2(); private final Vector2 coords = new Vector2();
private final Vector2 tmpVec2 = new Vector2(); private final Vector2 tmpVec2 = new Vector2();
public SelectedSystem(IsometricCamera iso) { public SelectedSystem(IsometricCamera iso) {
super(Family.all(BBoxComponent.class).get()); super(Family.all(BBoxComponent.class, SelectableComponent.class).get());
this.iso = iso; this.iso = iso;
} }
@ -34,17 +36,22 @@ public class SelectedSystem extends IteratingSystem {
@Override @Override
protected void processEntity(Entity entity, float delta) { protected void processEntity(Entity entity, float delta) {
entity.flags &= ~Flags.SELECTED;
if ((entity.flags & Flags.SELECTABLE) != Flags.SELECTABLE) return;
BBox box = boxComponent.get(entity).box; BBox box = boxComponent.get(entity).box;
if (box == null) return; if (box == null) return;
Vector2 position = positionComponent.get(entity).position; Vector2 position = positionComponent.get(entity).position;
iso.toScreen(tmpVec2.set(position)); iso.toScreen(tmpVec2.set(position));
float x = tmpVec2.x + box.xMin; float x = tmpVec2.x + box.xMin;
float y = tmpVec2.y - box.yMax; float y = tmpVec2.y - box.yMax;
if (x <= coords.x && coords.x <= x + box.width boolean hover = x <= coords.x && coords.x <= x + box.width
&& y <= coords.y && coords.y <= y + box.height) { && y <= coords.y && coords.y <= y + box.height;
entity.flags |= Flags.SELECTED; setHovered(entity, hover);
}
private void setHovered(Entity entity, boolean b) {
if (b) {
if (!hoveredComponent.has(entity)) entity.add(getEngine().createComponent(HoveredComponent.class));
} else {
entity.remove(HoveredComponent.class);
} }
} }
} }

View File

@ -4,8 +4,7 @@ import com.badlogic.ashley.core.ComponentMapper;
import com.badlogic.ashley.core.Entity; import com.badlogic.ashley.core.Entity;
import com.badlogic.ashley.core.Family; import com.badlogic.ashley.core.Family;
import com.badlogic.ashley.systems.IteratingSystem; import com.badlogic.ashley.systems.IteratingSystem;
import com.riiablo.engine.Flags; import com.riiablo.engine.component.HoveredComponent;
import com.riiablo.engine.component.MapComponent;
import com.riiablo.engine.component.WarpComponent; import com.riiablo.engine.component.WarpComponent;
import com.riiablo.map.Map; import com.riiablo.map.Map;
@ -15,7 +14,7 @@ public class WarpSystem extends IteratingSystem {
private Map map; private Map map;
public WarpSystem() { public WarpSystem() {
super(Family.all(WarpComponent.class, MapComponent.class).get()); super(Family.all(WarpComponent.class, HoveredComponent.class).get());
} }
public Map getMap() { public Map getMap() {
@ -37,8 +36,6 @@ public class WarpSystem extends IteratingSystem {
@Override @Override
protected void processEntity(Entity entity, float delta) { protected void processEntity(Entity entity, float delta) {
WarpComponent warpComponent = this.warpComponent.get(entity); WarpComponent warpComponent = this.warpComponent.get(entity);
if ((entity.flags & Flags.SELECTED) == Flags.SELECTED) { map.addWarpSubsts(warpComponent.substs);
map.addWarpSubsts(warpComponent.substs);
}
} }
} }

View File

@ -32,6 +32,7 @@ import com.riiablo.engine.component.ClassnameComponent;
import com.riiablo.engine.component.CofComponent; import com.riiablo.engine.component.CofComponent;
import com.riiablo.engine.component.ObjectComponent; import com.riiablo.engine.component.ObjectComponent;
import com.riiablo.engine.component.PositionComponent; import com.riiablo.engine.component.PositionComponent;
import com.riiablo.engine.component.SelectableComponent;
import com.riiablo.engine.component.TypeComponent; import com.riiablo.engine.component.TypeComponent;
import com.riiablo.graphics.BlendMode; import com.riiablo.graphics.BlendMode;
import com.riiablo.graphics.PaletteIndexedBatch; import com.riiablo.graphics.PaletteIndexedBatch;
@ -100,6 +101,7 @@ public class RenderSystem extends EntitySystem {
private final ComponentMapper<TypeComponent> typeComponent = ComponentMapper.getFor(TypeComponent.class); private final ComponentMapper<TypeComponent> typeComponent = ComponentMapper.getFor(TypeComponent.class);
private final ComponentMapper<BBoxComponent> boxComponent = ComponentMapper.getFor(BBoxComponent.class); private final ComponentMapper<BBoxComponent> boxComponent = ComponentMapper.getFor(BBoxComponent.class);
private final ComponentMapper<AngleComponent> angleComponent = ComponentMapper.getFor(AngleComponent.class); private final ComponentMapper<AngleComponent> angleComponent = ComponentMapper.getFor(AngleComponent.class);
private final ComponentMapper<SelectableComponent> selectableComponent = ComponentMapper.getFor(SelectableComponent.class);
private final Family debugFamily = Family.all(PositionComponent.class).get(); private final Family debugFamily = Family.all(PositionComponent.class).get();
private ImmutableArray<Entity> debugEntities; private ImmutableArray<Entity> debugEntities;
@ -667,7 +669,7 @@ public class RenderSystem extends EntitySystem {
if (px > renderMaxX || px + Tile.WIDTH < renderMinX) continue; if (px > renderMaxX || px + Tile.WIDTH < renderMinX) continue;
TextureRegion texture = tile.tile.texture; TextureRegion texture = tile.tile.texture;
if (py > renderMaxY || py + texture.getRegionHeight() < renderMinY) continue; if (py > renderMaxY || py + texture.getRegionHeight() < renderMinY) continue;
batch.draw(texture, px, py, texture.getRegionWidth(), texture.getRegionHeight()); batch.draw(texture, px, py);
} }
/* /*
for (int i = Map.WALL_OFFSET; i < Map.WALL_OFFSET + Map.MAX_WALLS; i++) { for (int i = Map.WALL_OFFSET; i < Map.WALL_OFFSET + Map.MAX_WALLS; i++) {
@ -1149,7 +1151,7 @@ public class RenderSystem extends EntitySystem {
Vector2 tmp = iso.agg(tmpVec2.set(position)).toScreen().ret(); Vector2 tmp = iso.agg(tmpVec2.set(position)).toScreen().ret();
shapes.setColor(Color.WHITE); shapes.setColor(Color.WHITE);
DebugUtils.drawDiamond(shapes, tmp.x, tmp.y, Tile.SUBTILE_WIDTH, Tile.SUBTILE_HEIGHT); DebugUtils.drawDiamond(shapes, tmp.x, tmp.y, Tile.SUBTILE_WIDTH, Tile.SUBTILE_HEIGHT);
if (RENDER_DEBUG_SELECT && (entity.flags & Flags.SELECTABLE) == Flags.SELECTABLE) { if (RENDER_DEBUG_SELECT && selectableComponent.has(entity)) {
BBoxComponent boxComponent = this.boxComponent.get(entity); BBoxComponent boxComponent = this.boxComponent.get(entity);
if (boxComponent != null) { if (boxComponent != null) {
BBox box = boxComponent.box; BBox box = boxComponent.box;