Added support for item entities

Created ItemLoaderSystem to defer flippy file loading
Item entities are selectable only after their flippy file has been loaded since they have no bbox
Changed implementations from EntityListener to EntityAdapter
This commit is contained in:
Collin Smith
2019-11-21 04:11:16 -08:00
parent 07ec6a9bc1
commit f7bdd339e4
4 changed files with 108 additions and 7 deletions

View File

@ -5,12 +5,15 @@ import com.badlogic.ashley.core.ComponentMapper;
import com.badlogic.ashley.core.Entity;
import com.badlogic.ashley.core.PooledEngine;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.assets.AssetDescriptor;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Align;
import com.badlogic.gdx.utils.IntIntMap;
import com.riiablo.CharData;
import com.riiablo.Riiablo;
import com.riiablo.codec.COF;
import com.riiablo.codec.DC6;
import com.riiablo.codec.excel.Levels;
import com.riiablo.codec.excel.LvlWarp;
import com.riiablo.codec.excel.MonStats;
@ -26,6 +29,7 @@ import com.riiablo.engine.component.CofComponent;
import com.riiablo.engine.component.DS1Component;
import com.riiablo.engine.component.IdComponent;
import com.riiablo.engine.component.InteractableComponent;
import com.riiablo.engine.component.ItemComponent;
import com.riiablo.engine.component.LabelComponent;
import com.riiablo.engine.component.MapComponent;
import com.riiablo.engine.component.MonsterComponent;
@ -39,6 +43,7 @@ import com.riiablo.engine.component.TypeComponent;
import com.riiablo.engine.component.VelocityComponent;
import com.riiablo.engine.component.WarpComponent;
import com.riiablo.engine.component.ZoneAwareComponent;
import com.riiablo.item.Item;
import com.riiablo.map.DS1;
import com.riiablo.map.DT1;
import com.riiablo.map.Map;
@ -488,6 +493,28 @@ public class Engine extends PooledEngine {
return entity;
}
public Entity createItem(Item item, Vector2 position) {
TypeComponent typeComponent = createComponent(TypeComponent.class);
typeComponent.type = TypeComponent.Type.ITM;
AssetDescriptor<DC6> flippyDescriptor = new AssetDescriptor<>(TypeComponent.Type.ITM.PATH + "\\" + item.getFlippyFile() + ".dc6", DC6.class);
Riiablo.assets.load(flippyDescriptor);
ItemComponent itemComponent = createComponent(ItemComponent.class);
itemComponent.item = item;
itemComponent.flippyDescriptor = flippyDescriptor;
PositionComponent positionComponent = createComponent(PositionComponent.class);
positionComponent.position.set(position);
Entity entity = createEntity("item");
entity.add(typeComponent);
entity.add(itemComponent);
entity.add(positionComponent);
return entity;
}
public static <T extends Component> T getOrCreateComponent(Entity entity, com.badlogic.ashley.core.Engine engine, Class<T> componentType, ComponentMapper<T> componentMapper) {
T instance = componentMapper.get(entity);
if (instance == null) entity.add(instance = engine.createComponent(componentType));

View File

@ -0,0 +1,18 @@
package com.riiablo.engine.component;
import com.badlogic.ashley.core.Component;
import com.badlogic.gdx.assets.AssetDescriptor;
import com.badlogic.gdx.utils.Pool;
import com.riiablo.codec.DC6;
import com.riiablo.item.Item;
public class ItemComponent implements Component, Pool.Poolable {
public Item item;
public AssetDescriptor<DC6> flippyDescriptor;
@Override
public void reset() {
item = null;
flippyDescriptor = null;
}
}

View File

@ -0,0 +1,50 @@
package com.riiablo.engine.system;
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.Riiablo;
import com.riiablo.codec.Animation;
import com.riiablo.codec.DC6;
import com.riiablo.codec.util.BBox;
import com.riiablo.engine.component.AnimationComponent;
import com.riiablo.engine.component.BBoxComponent;
import com.riiablo.engine.component.ItemComponent;
import com.riiablo.engine.component.LabelComponent;
import com.riiablo.graphics.BlendMode;
public class ItemLoaderSystem extends IteratingSystem {
private final ComponentMapper<ItemComponent> itemComponent = ComponentMapper.getFor(ItemComponent.class);
public ItemLoaderSystem() {
super(Family.all(ItemComponent.class).exclude(AnimationComponent.class, BBoxComponent.class).get());
}
@Override
protected void processEntity(Entity entity, float delta) {
ItemComponent itemComponent = this.itemComponent.get(entity);
if (!Riiablo.assets.isLoaded(itemComponent.flippyDescriptor)) return;
DC6 flippy = Riiablo.assets.get(itemComponent.flippyDescriptor);
Animation animation = Animation.builder()
.layer(flippy, BlendMode.ID, (byte) ((itemComponent.item.base.Transform << 5) | (itemComponent.item.charColorIndex & 0x1F)))
.build();
animation.setMode(Animation.Mode.CLAMP);
AnimationComponent animationComponent = getEngine().createComponent(AnimationComponent.class);
animationComponent.animation = animation;
entity.add(animationComponent);
BBox box = flippy.getBox(0, flippy.getNumFramesPerDir() - 1);
BBoxComponent boxComponent = getEngine().createComponent(BBoxComponent.class);
boxComponent.box = box;
entity.add(boxComponent);
LabelComponent labelComponent = getEngine().createComponent(LabelComponent.class);
labelComponent.actor = itemComponent.item.details().header;
labelComponent.offset.set(box.xMin + box.width / 2, -box.yMax + box.height + labelComponent.actor.getHeight() / 2);
entity.add(labelComponent);
}
}

View File

@ -7,7 +7,9 @@ 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.EntityAdapter;
import com.riiablo.engine.component.CofComponent;
import com.riiablo.engine.component.ItemComponent;
import com.riiablo.engine.component.MonsterComponent;
import com.riiablo.engine.component.ObjectComponent;
import com.riiablo.engine.component.SelectableComponent;
@ -20,7 +22,7 @@ public class SelectableSystem extends EntitySystem {
private ImmutableArray<Entity> objectEntities;
private final Family monsterFamily = Family.all(MonsterComponent.class).get();
private final EntityListener monsterListener = new EntityListener() {
private final EntityListener monsterListener = new EntityAdapter() {
private final ComponentMapper<MonsterComponent> monsterComponent = ComponentMapper.getFor(MonsterComponent.class);
@Override
@ -28,20 +30,22 @@ public class SelectableSystem extends EntitySystem {
MonsterComponent monsterComponent = this.monsterComponent.get(entity);
setSelectable(entity, monsterComponent.monstats2.isSel);
}
@Override
public void entityRemoved(Entity entity) {}
};
private final Family warpFamily = Family.all(WarpComponent.class).get();
private final EntityListener warpListener = new EntityListener() {
private final Family itemFamily = Family.all(ItemComponent.class).get();
private final EntityListener itemListener = new EntityAdapter() {
@Override
public void entityAdded(Entity entity) {
setSelectable(entity, true);
}
};
private final Family warpFamily = Family.all(WarpComponent.class).get();
private final EntityListener warpListener = new EntityAdapter() {
@Override
public void entityRemoved(Entity entity) {}
public void entityAdded(Entity entity) {
setSelectable(entity, true);
}
};
private final ComponentMapper<SelectableComponent> selectableComponent = ComponentMapper.getFor(SelectableComponent.class);
@ -56,6 +60,7 @@ public class SelectableSystem extends EntitySystem {
objectEntities = engine.getEntitiesFor(objectFamily);
engine.addEntityListener(monsterFamily, monsterListener);
engine.addEntityListener(warpFamily, warpListener);
engine.addEntityListener(itemFamily, itemListener);
}
@Override
@ -64,6 +69,7 @@ public class SelectableSystem extends EntitySystem {
objectEntities = null;
engine.removeEntityListener(monsterListener);
engine.removeEntityListener(warpListener);
engine.removeEntityListener(itemListener);
}
@Override