Пример системы повреждений
Опубликованно: 26.07.2017, 22:36
Последняя редакция, Andry: 28.07.2017 18:35
Как написано в статье Система Сущностей Продвинутая, должен быть только один класс, который изменяет один специальный Компонент. Это упрощает отладку кода и предотвращает пропуск изменений компонентов.
Компоненты
HealthComponent
public class HealthComponent extends Component { public float health; public HealthComponent(float health) { this.health = health; } public float getHealth() { return health; } }
DamageComponent
private float damage; private EntityId target; public DamageComponent(EntityId target, float damage) { this.damage=damage; this.target=target; } public float getDamage() { return damage; } public EntityId getTarget() { return target; }
AppState
public class DamageAppState extends AbstractAppState { EntitySet damageSet; EntitySet healthSet; public void initialize(AppStateManager stateManager, Application app) { EntitySystem entitySystem = ((Main)app).getEntitySystem(); damageSet = entitySystem.getEntitySet(DamageComponent.class); healthSet = entitySystem.getEntitySet(HealthComponent.class); } @Override public void update(float tpf) { Map<EntityId,Float> damageSummary = new HashMap(); damageSet.applyChanges(); healthSet.applyChanges(); Iterator<Entity> iterator = damageSet.getIterator(); while(iterator.hasNext()) { Entity entity = iterator.next(); DamageComponent dc = entity.getComponent(DamageComponent.class); float f = 0; if(damageSummary.containsKey(dc.getTarget())) { f = damageSummary.get(dc.getTarget()); } f += dc.getDamage(); damageSummary.put(dc.getTarget(),f); entity.destroy(); } Iterator<EntityId> keyIterator = damageSummary.keySet().iterator(); while(keyIterator.hasNext()) { EntityId entityId = keyIterator.next(); float damage = damageSummary.get(entityId); Entity entity = healthSet.getEntity(entityId); if(entity != null) { HealthComponent hc = entity.getComponent(HealthComponent.class); float newLife = hc.getHealth()-damage; if(newLife < 0) { entity.removeComponent(HealthComponent.class); }else{ entity.setComponent(new HealthComponent(newLife)); } } } } }
Применение
//Создание новой Системы Сущностей entitySystem = new EntitySystem(new MapEntityData()); //Добавление DamageAppState в Application stateManager.attach(new DamageAppState()); //Создание новой Сущности со 100 HP EntityId healthEntity = entitySystem.newEntity(new HealthComponent(100)); //Создание новой Сущности Ущерба, которая наносит 5 урона здоровью Сущности entitySystem.newEntity(new DamageComponent(healthEntity,5));
Переведено для jmonkeyengine.ru, оригинал.
Автор перевода: Andry
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.