Unit.java :  » UnTagged » towerdefenseplus » com » duckygo » towerdefense » game » sprites » Android Open Source

Android Open Source » UnTagged » towerdefenseplus 
towerdefenseplus » com » duckygo » towerdefense » game » sprites » Unit.java
package com.duckygo.towerdefense.game.sprites;

import java.util.Vector;

import android.util.Log;
import android.view.KeyEvent;

import com.duckygo.towerdefense.game.astar.AStar;
import com.duckygo.towerdefense.game.astar.AStarNode;
import com.duckygo.towerdefense.game.scenes.TowerDefenseScene;

public class Unit extends AnimatedSprite2D {
  
  public static String directions[] = new String[] { "walk_e", "walk_n", "walk_ne", "walk_nw", "walk_s", "walk_se", "walk_sw","walk_w" };

  

  
  private static Vector<AStarNode> parent_path;
  
  private AnimationRunnable animator;
  
  private String direction;

  protected UnitHealth health;

  public UnitHealth getHealth() {
    if (health == null) {
      this.health = new UnitHealth(this, 100);
    }
    
    return health;
  }


  private Vector<AStarNode> path;
  
  
  public Unit() {
    
    anchor = CENTER;
    
    addChild(getHealth());
    
    switchDirection();
    calcPath();
  }
  

  private void calcPath() {
    if (path == null)  {
      if (parent_path == null) parent_path = new AStar(TowerDefenseScene.terrain).solve(new AStarNode(1, 0), new AStarNode(AStar.MAP_WIDTH - 2, AStar.MAP_HEIGHT - 1));
      path = (Vector<AStarNode>) parent_path.clone();
    }
  }
  
  @Override
  public boolean onKeyEvent(KeyEvent event, int keyCode) {
    switch(keyCode) {
    case KeyEvent.KEYCODE_DPAD_UP:
      setDirection("walk_n");
      return true;
      
    case KeyEvent.KEYCODE_DPAD_DOWN:
      setDirection("walk_s");
      return true;

    case KeyEvent.KEYCODE_DPAD_RIGHT:
      setDirection("walk_e");
      return true;

    case KeyEvent.KEYCODE_DPAD_LEFT:
      setDirection("walk_w");
      return true;

    }
    return false;
  }
  
  
  private void setDirection(String direction) {
    if (direction == this.direction) {
      return;
    }
    
    if (animator != null) {
      animator.stop();
    }
    
    //Log.w("Viking", "Direction [" + direction + "]");
    
    this.direction = direction;
    animator = play(direction, true);
  }


  private void switchDirection() {
    setDirection(directions[(int) Math.floor(Math.random() * directions.length)]);
  }
  
  private void updateDirection() {
    if (direction.equals("walk_s")) {
      setY(y + 1);
    }
    if (direction.equals("walk_n")) {
      setY(y - 1);
    }
    if (direction.equals("walk_e")) {
      setX(x + 1);
    }
    if (direction.equals("walk_w")) {
      setX(x - 1);
    }
    if (direction.equals("walk_se")) {
      setY(y + 1);
      setX(x + 1);
    }
    if (direction.equals("walk_ne")) {
      setY(y - 1);
      setX(x + 1);
    }
    if (direction.equals("walk_sw")) {
      setY(y + 1);
      setX(x - 1);
    }
    if (direction.equals("walk_nw")) {
      setY(y - 1);
      setX(x - 1);
    }
  }
  
  
  @Override
  public void update(long time) {
    
    if (health.health <= 0) {
      if (parent != null) parent.removeChild(this);
      return;
    }
    
    
    followPath();
    updateDirection();
    
//    if (Math.random() > 0.99) {
//      switchDirection();
//    }
  }


  private void followPath() {
    if (path == null) {
      return;
    }
    
    AStarNode node = null;
    if (path.size() > 0) 
      node = path.firstElement();
    
    if (node == null) {
      setDirection("stop");
      return;
    }
    
    int pointX = node.x * (((Sprite2D)parent).width /  AStar.MAP_WIDTH);
    int pointY = node.y * (((Sprite2D)parent).height /  AStar.MAP_HEIGHT);
    
    int distX = (int) (pointX - this.x);
    int distY = (int) (pointY - this.y);
    
    if (Math.abs(distX) < 10 && Math.abs(distY) < 10) {
      //Log.w("Viking", "Point [" + node.x + "," + node.y + "]");
      path.remove(0);
    }
    
    if (Math.abs(distX) > Math.abs(distY) + 10) {
      if (distX > 0) {
        setDirection("walk_e");
      } else {
        setDirection("walk_w");
      }
    } else if (Math.abs(distY) > Math.abs(distX) + 10) {
      if (distY > 0) {
        setDirection("walk_s");
      } else {
        setDirection("walk_n");
      }
    } else {
      if (distX > 0 && distY > 0) {
        setDirection("walk_se");
      }
      if (distX > 0 && distY < 0) {
        setDirection("walk_ne");
      }
      if (distX < 0 && distY > 0) {
        setDirection("walk_sw");
      }
      if (distX < 0 && distY < 0) {
        setDirection("walk_nw");
      }
    }

    
  }
  
  
  
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.