com.dongbat.invasion.system.EnemyMovementSystem.java Source code

Java tutorial

Introduction

Here is the source code for com.dongbat.invasion.system.EnemyMovementSystem.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dongbat.invasion.system;

import com.artemis.Aspect;
import com.artemis.ComponentMapper;
import com.artemis.Entity;
import com.artemis.annotations.Wire;
import com.artemis.systems.EntityProcessingSystem;
import com.badlogic.gdx.math.Vector2;
import com.dongbat.invasion.component.Delay;
import com.dongbat.invasion.component.EnemyMovement;
import com.dongbat.invasion.util.Constants;
import com.dongbat.invasion.util.EntityUtil;
import com.dongbat.invasion.util.MovementUtil;
import com.dongbat.invasion.util.PhysicsUtil;
import com.dongbat.invasion.util.TimeUtil;

/**
 *
 * @author password
 */
@Wire
public class EnemyMovementSystem extends EntityProcessingSystem {

    private ComponentMapper<Delay> delayMapper;

    public EnemyMovementSystem() {
        super(Aspect.getAspectForAll(EnemyMovement.class));
    }

    @Override
    protected void process(Entity entity) {
        Delay delay = delayMapper.get(entity);
        if (delay != null && delay.getDuration() > 0) {
            long timePassed = TimeUtil.getGameTimeSince(delay.getStartTime());
            if (timePassed <= delay.getDuration()) {
                return;
            }
        }

        //    Vector2 prevVelocity = PhysicsUtil.getVelocity(entity).cpy();
        Vector2 position = PhysicsUtil.getPosition(entity);
        EnemyMovement movement = EntityUtil.getComponent(entity, EnemyMovement.class);
        PhysicsUtil.setVelocity(entity, new Vector2());
        Vector2 intent = movement.getIntent().cpy();
        Vector2 travel;
        MovementUtil.moveEnemyTo(entity, intent);
        // TODO check free enemy
        intent.y = position.y;
        // TODO free movement unit use moveTo
        Vector2 distance = intent.cpy().sub(position);
        travel = PhysicsUtil.getVelocity(entity).cpy().scl(world.delta);
        if (travel.dot(distance) > 0 && travel.len2() - distance.len2() > 0) {
            PhysicsUtil.setPosition(entity, intent);
            PhysicsUtil.setVelocity(entity, new Vector2());
        }

        if (TimeUtil.getGameTimeSince(movement.getStartDrag()) >= movement.getDragDuration()) {
            movement.setDraggedTo(null);
        }

        if (movement.getDraggedTo() == null) {
            return;
        }

        float max = movement.getDraggedTo().cpy().sub(movement.getDraggedFrom()).len2();
        float actual = position.cpy().sub(movement.getDraggedFrom()).len2();
        if (actual >= max) {
            return;
        }

        Vector2 drag = movement.getDraggedTo().cpy().sub(position);
        float dragLen2 = drag.len2();
        if (dragLen2 > movement.getDragForce() * movement.getDragForce()) {
            drag.nor().scl(movement.getDragForce());
        }
        PhysicsUtil.applyImpulseOnEnemy(entity, drag);

        // TODO fix this similar to above
        travel = PhysicsUtil.getVelocity(entity).cpy().scl(world.delta);
        if (travel.sub(drag).len2() <= Constants.GAME.EPSILON_SQUARED) {
            PhysicsUtil.setPosition(entity, movement.getDraggedTo());
            PhysicsUtil.applyImpulseOnEnemy(entity, drag.scl(-1));
        }
    }

}