Android Open Source - Avoidance Enemy Control System






From Project

Back to project page Avoidance.

License

The source code is released under:

GNU General Public License

If you think the Android project Avoidance listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright (c) 2012 Filip Brynfors//w ww .  j a  v a  2s . com
 * 
 * Parts if this file are derived from an example, written by Oliver Lade, which
 * can be found under the following link:
 * https://bitbucket.org/piemaster/artemoids/src/5c3a11ff2bdd/src/net/piemaster/artemoids/
 *     systems/PlayerShipControlSystem.java
 *
 * This file is part of Avoidance.
 *
 * Avoidance is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Avoidance is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Avoidance. If not, see <http://www.gnu.org/licenses/>.
 *
 */

package se.chalmers.avoidance.core.systems;

import se.chalmers.avoidance.constants.GameConstants;
import se.chalmers.avoidance.core.components.Acceleration;
import se.chalmers.avoidance.core.components.Friction;
import se.chalmers.avoidance.core.components.Size;
import se.chalmers.avoidance.core.components.Transform;
import se.chalmers.avoidance.core.components.Velocity;
import se.chalmers.avoidance.util.Utils;

import com.artemis.Aspect;
import com.artemis.ComponentMapper;
import com.artemis.Entity;
import com.artemis.EntitySystem;
import com.artemis.managers.GroupManager;
import com.artemis.managers.TagManager;
import com.artemis.utils.ImmutableBag;

/**
 * System that updates the enemies velocity and position.
 * 
 * @author Filip Brynfors
 * 
 */
public class EnemyControlSystem extends EntitySystem {
  private static final float MAX_SPEED = 400;
  private ComponentMapper<Transform> transformMapper;
  private ComponentMapper<Velocity> velocityMapper;
  private ComponentMapper<Size> sizeMapper;
  private ComponentMapper<Friction> frictionMapper;
  private ComponentMapper<Acceleration> accelerationMapper;
  private TagManager tagManager;
  private GroupManager groupManager;

  /**
   * Constructs a new PlayerControlSystem.
   */
  public EnemyControlSystem() {
    super(Aspect.getAspectForAll(Transform.class, Velocity.class,
        Size.class));
  }

  /**
   * This method is called when the system is initialized.
   */
  @Override
  protected void initialize() {
    transformMapper = world.getMapper(Transform.class);
    velocityMapper = world.getMapper(Velocity.class);
    sizeMapper = world.getMapper(Size.class);
    frictionMapper = world.getMapper(Friction.class);
    accelerationMapper = world.getMapper(Acceleration.class);
    tagManager = world.getManager(TagManager.class);
    groupManager = world.getManager(GroupManager.class);
  }

  /**
   * Determines if the system should be processed or not.
   * 
   * @return true if system should be processed, false otherwise
   */
  @Override
  protected boolean checkProcessing() {
    return true;
  }

  /**
   * This method is called when the enemies are to be updated. Updates the
   * velocity and position of the enemies
   * 
   * @param bag
   *            the bag of entities with the wanted components
   */
  @Override
  protected void processEntities(ImmutableBag<Entity> bag) {

    Entity player = tagManager.getEntity(GameConstants.TAG_PLAYER);
    if (player != null) {
      Transform playerTransform = transformMapper.get(player);
      Size playerSize = sizeMapper.get(player);
      float playerCenterX = playerTransform.getX()
          + playerSize.getWidth() / 2;
      float playerCenterY = playerTransform.getY()
          + playerSize.getHeight() / 2;

      ImmutableBag<Entity> enemyBag = groupManager
          .getEntities(GameConstants.GROUP_ENEMIES);
      for (int i = 0; i < enemyBag.size(); i++) {
        Entity enemy = enemyBag.get(i);
        Transform enemyTransform = transformMapper.get(enemy);
        Size enemySize = sizeMapper.get(enemy);
        float enemyCenterX = enemyTransform.getX()
            + enemySize.getWidth() / 2;
        float enemyCenterY = enemyTransform.getY()
            + enemySize.getHeight() / 2;

        float accelerationAngle = (float) Math.atan2(playerCenterY
            - enemyCenterY, playerCenterX - enemyCenterX);
        float accelerationSpeed = accelerationMapper.get(enemy)
            .getAcceleration();
        float accelX = Utils.getHorizontalSpeed(accelerationSpeed,
            accelerationAngle);
        float accelY = Utils.getVerticalSpeed(accelerationSpeed,
            accelerationAngle);

        // Update the Velocity
        // Based on
        // https://bitbucket.org/piemaster/artemoids/src/5c3a11ff2bdd/src/net/piemaster/artemoids/
        // systems/PlayerShipControlSystem.java
        Velocity vel = velocityMapper.get(enemy);
        float startVelX = Utils.getHorizontalSpeed(vel.getSpeed(),
            vel.getAngle());
        float startVelY = Utils.getVerticalSpeed(vel.getSpeed(),
            vel.getAngle());
        float newVelX = startVelX;
        float newVelY = startVelY;

        newVelX += world.delta * accelX;
        newVelY += world.delta * accelY;
        float newSpeed = (float) Math.sqrt(newVelX * newVelX + newVelY
            * newVelY);

        // Apply friction
        newSpeed *= Math.pow(frictionMapper.get(enemy).getFriction(),
            world.delta);

        // Adjust the speed so it's not higher than the max speed
        if (newSpeed > MAX_SPEED) {
          newSpeed = MAX_SPEED;
        }

        vel.setAngle((float) Math.atan2(newVelY, newVelX));
        vel.setSpeed(newSpeed);

        // Update the position
        Transform trans = transformMapper.get(enemy);
        trans.setDirection(accelerationAngle);
        float speed = vel.getSpeed();
        float angle = vel.getAngle();
        float dx = world.delta
            * (startVelX + Utils.getHorizontalSpeed(speed, angle))
            / 2;
        float dy = world.delta
            * (startVelY + Utils.getVerticalSpeed(speed, angle))
            / 2;
        trans.setX(trans.getX() + dx);
        trans.setY(trans.getY() + dy);

      }
    }
  }
}




Java Source Code List

se.chalmers.avoidance.MainActivity.java
se.chalmers.avoidance.constants.EventMessageConstants.java
se.chalmers.avoidance.constants.FileConstants.java
se.chalmers.avoidance.constants.FontConstants.java
se.chalmers.avoidance.constants.GameConstants.java
se.chalmers.avoidance.core.EntityFactory.java
se.chalmers.avoidance.core.collisionhandlers.CollisionHandler.java
se.chalmers.avoidance.core.collisionhandlers.EnemyCollisionHandler.java
se.chalmers.avoidance.core.collisionhandlers.GameOverNotifier.java
se.chalmers.avoidance.core.collisionhandlers.KillplayerobstacleCollisionHandler.java
se.chalmers.avoidance.core.collisionhandlers.PitobstacleCollisionHandler.java
se.chalmers.avoidance.core.collisionhandlers.PowerUpCollisionHandler.java
se.chalmers.avoidance.core.collisionhandlers.WallCollisionHandler.java
se.chalmers.avoidance.core.components.Acceleration.java
se.chalmers.avoidance.core.components.Buff.java
se.chalmers.avoidance.core.components.Friction.java
se.chalmers.avoidance.core.components.Immortal.java
se.chalmers.avoidance.core.components.Jump.java
se.chalmers.avoidance.core.components.Score.java
se.chalmers.avoidance.core.components.Size.java
se.chalmers.avoidance.core.components.Sound.java
se.chalmers.avoidance.core.components.Spatial.java
se.chalmers.avoidance.core.components.Time.java
se.chalmers.avoidance.core.components.Transform.java
se.chalmers.avoidance.core.components.Velocity.java
se.chalmers.avoidance.core.states.GameOverScene.java
se.chalmers.avoidance.core.states.GameState.java
se.chalmers.avoidance.core.states.HighScoreState.java
se.chalmers.avoidance.core.states.IState.java
se.chalmers.avoidance.core.states.MenuState.java
se.chalmers.avoidance.core.states.StateID.java
se.chalmers.avoidance.core.states.StateManager.java
se.chalmers.avoidance.core.systems.CollisionSystem.java
se.chalmers.avoidance.core.systems.EnemyControlSystem.java
se.chalmers.avoidance.core.systems.HudRenderSystem.java
se.chalmers.avoidance.core.systems.PlayerControlSystem.java
se.chalmers.avoidance.core.systems.SoundSystem.java
se.chalmers.avoidance.core.systems.SpatialRenderSystem.java
se.chalmers.avoidance.core.systems.SpawnSystem.java
se.chalmers.avoidance.input.AccelerometerListener.java
se.chalmers.avoidance.input.TouchListener.java
se.chalmers.avoidance.util.AudioManager.java
se.chalmers.avoidance.util.FileUtils.java
se.chalmers.avoidance.util.ScreenResolution.java
se.chalmers.avoidance.util.Utils.java