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 static final int NONE = 0;
public static final int DEBUG = 1 << 0;
public static final int SELECTABLE = 1 << 1;
public static final int SELECTED = 1 << 2;
public static final int INVISIBLE = 1 << 3;
public static final int RUNNING = 1 << 4;
public static final int INVISIBLE = 1 << 1;
public static final int RUNNING = 1 << 2;
public static String toString(int bits) {
StringBuilder builder = new StringBuilder();
@ -14,8 +12,6 @@ public final class Flags {
builder.append("NONE");
} else {
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 & RUNNING) == RUNNING) builder.append("RUNNING").append("|");
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.systems.IteratingSystem;
import com.riiablo.codec.Animation;
import com.riiablo.engine.Flags;
import com.riiablo.engine.SystemPriority;
import com.riiablo.engine.component.AnimationComponent;
import com.riiablo.engine.component.HoveredComponent;
public class AnimationSystem extends IteratingSystem {
private final ComponentMapper<AnimationComponent> animationComponent = ComponentMapper.getFor(AnimationComponent.class);
private final ComponentMapper<HoveredComponent> hoveredComponent = ComponentMapper.getFor(HoveredComponent.class);
public 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) {
Animation animation = animationComponent.get(entity).animation;
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.Array;
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.PositionComponent;
@ -23,7 +23,7 @@ public class LabelSystem extends IteratingSystem {
private final Array<Actor> labels = new Array<>();
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;
setProcessing(false);
}
@ -36,10 +36,6 @@ public class LabelSystem extends IteratingSystem {
@Override
protected void processEntity(Entity entity, float delta) {
if ((entity.flags & Flags.SELECTED) != Flags.SELECTED) {
return;
}
PositionComponent positionComponent = this.positionComponent.get(entity);
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.Family;
import com.badlogic.ashley.utils.ImmutableArray;
import com.riiablo.engine.Flags;
import com.riiablo.engine.component.CofComponent;
import com.riiablo.engine.component.MonsterComponent;
import com.riiablo.engine.component.ObjectComponent;
import com.riiablo.engine.component.SelectableComponent;
import com.riiablo.engine.component.WarpComponent;
public class SelectableSystem extends EntitySystem {
@ -44,6 +44,8 @@ public class SelectableSystem extends EntitySystem {
public void entityRemoved(Entity entity) {}
};
private final ComponentMapper<SelectableComponent> selectableComponent = ComponentMapper.getFor(SelectableComponent.class);
public SelectableSystem() {
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) {
entity.flags |= Flags.SELECTABLE;
if (!selectableComponent.has(entity)) entity.add(getEngine().createComponent(SelectableComponent.class));
} 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.riiablo.camera.IsometricCamera;
import com.riiablo.codec.util.BBox;
import com.riiablo.engine.Flags;
import com.riiablo.engine.component.BBoxComponent;
import com.riiablo.engine.component.HoveredComponent;
import com.riiablo.engine.component.PositionComponent;
import com.riiablo.engine.component.SelectableComponent;
public class SelectedSystem extends IteratingSystem {
private final ComponentMapper<BBoxComponent> boxComponent = ComponentMapper.getFor(BBoxComponent.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 Vector2 coords = new Vector2();
private final Vector2 tmpVec2 = new Vector2();
public SelectedSystem(IsometricCamera iso) {
super(Family.all(BBoxComponent.class).get());
super(Family.all(BBoxComponent.class, SelectableComponent.class).get());
this.iso = iso;
}
@ -34,17 +36,22 @@ public class SelectedSystem extends IteratingSystem {
@Override
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;
if (box == null) return;
Vector2 position = positionComponent.get(entity).position;
iso.toScreen(tmpVec2.set(position));
float x = tmpVec2.x + box.xMin;
float y = tmpVec2.y - box.yMax;
if (x <= coords.x && coords.x <= x + box.width
&& y <= coords.y && coords.y <= y + box.height) {
entity.flags |= Flags.SELECTED;
boolean hover = x <= coords.x && coords.x <= x + box.width
&& y <= coords.y && coords.y <= y + box.height;
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.Family;
import com.badlogic.ashley.systems.IteratingSystem;
import com.riiablo.engine.Flags;
import com.riiablo.engine.component.MapComponent;
import com.riiablo.engine.component.HoveredComponent;
import com.riiablo.engine.component.WarpComponent;
import com.riiablo.map.Map;
@ -15,7 +14,7 @@ public class WarpSystem extends IteratingSystem {
private Map map;
public WarpSystem() {
super(Family.all(WarpComponent.class, MapComponent.class).get());
super(Family.all(WarpComponent.class, HoveredComponent.class).get());
}
public Map getMap() {
@ -37,8 +36,6 @@ public class WarpSystem extends IteratingSystem {
@Override
protected void processEntity(Entity entity, float delta) {
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.ObjectComponent;
import com.riiablo.engine.component.PositionComponent;
import com.riiablo.engine.component.SelectableComponent;
import com.riiablo.engine.component.TypeComponent;
import com.riiablo.graphics.BlendMode;
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<BBoxComponent> boxComponent = ComponentMapper.getFor(BBoxComponent.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 ImmutableArray<Entity> debugEntities;
@ -667,7 +669,7 @@ public class RenderSystem extends EntitySystem {
if (px > renderMaxX || px + Tile.WIDTH < renderMinX) continue;
TextureRegion texture = tile.tile.texture;
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++) {
@ -1149,7 +1151,7 @@ public class RenderSystem extends EntitySystem {
Vector2 tmp = iso.agg(tmpVec2.set(position)).toScreen().ret();
shapes.setColor(Color.WHITE);
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);
if (boxComponent != null) {
BBox box = boxComponent.box;