mirror of
https://github.com/collinsmith/riiablo.git
synced 2025-07-04 23:38:28 +07:00
Refactored SELECTABLE and SELECTED states to components
This commit is contained in:
@ -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);
|
||||
|
@ -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() {}
|
||||
}
|
@ -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() {}
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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));
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user