Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            Вклады
                Система Сущностей Zay-ES
                    Пример системы повреждений
                        Пример системы повреждений

Пример системы повреждений

Опубликованно: 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

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.