Duck.java :  » UnTagged » dsandr » ru » jecklandin » duckshot » units » Android Open Source

Android Open Source » UnTagged » dsandr 
dsandr » ru » jecklandin » duckshot » units » Duck.java
package ru.jecklandin.duckshot.units;

import ru.jecklandin.duckshot.Desk;
import ru.jecklandin.duckshot.DuckApplication;
import ru.jecklandin.duckshot.DuckGame;
import ru.jecklandin.duckshot.ImgManager;
import ru.jecklandin.duckshot.Match;
import ru.jecklandin.duckshot.ScrProps;
import ru.jecklandin.duckshot.SoundManager;
import ru.jecklandin.duckshot.Stone;
import ru.jecklandin.duckshot.Desk.DigitType;
import ru.jecklandin.duckshot.Match.Bonus;
import ru.jecklandin.duckshot.model.DuckShotModel;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.util.Log;
   
public class Duck extends CreatureObject {

  private static final String TAG = "ru.jecklandin.duckshot.Duck";
  
  private static Bitmap deadDuckBm;
  private static Bitmap[] mAniDiving;
  private static Bitmap[] mAniEmerging;
  
  // ===============   state
  private boolean mIsArmored = false;


  private int dead_degree = 0;
  private int dead_sink = 0;
  private boolean has_sink = false;
  
  
  public Duck(int x) {
    super(); 
    this.offset = x; 
    speed = 2;
    addit_m = new Matrix();
  }
  
  

  public static void initBitmaps() {
    CreatureObject.commonBm = ImgManager.getBitmap("creature");
    CreatureObject.secondCommonBm = ImgManager.getBitmap("duck_armored");
    Duck.deadDuckBm = ImgManager.getBitmap("deadduck");
    Duck.mAniDiving = ImgManager.getAnimation("duckdive");
    Duck.mAniEmerging = ImgManager.getAnimation("duckemerge");
  } 
  
  @Override
  public float getNextOffset(float curOffset) {
    if (isDead) {
      return offset;
    }
    
    overallTicks++;
    if (Desk.getInstance().getSightVisibility() 
        && overallTicks % (DuckApplication.FPS) == 0 && !isHidden) {
      if (isDanger()) {  //the sight is nearby!
        if (isArmored()) {
          rotate(); 
          speed = 5;
        } else {
          hide();
        }
      }
    }
    
    if (mMovingRight) {
      offset += speed;
    } else {
      offset -= speed;
    }
    
    if (--ticksBeforeNextDive < 0 && !isArmored()) {
      hide();
    } else if (--ticksBeforeNextRotate < 0) {
      rotate();
    }
    
    if (offset < MIN_OFFSET) {
      mMovingRight = true;
    } else if (offset > MAX_OFFSET) {
      mMovingRight = false;
    }
    return offset;
  }
  
  @Override 
  public void draw(Canvas c, Paint p) {
    if (end_animation) {
      toRecycle = true;
      return;
    }
    
    if (delay > 0) {
      delay--;
      return;
    }
    
    if (timeout > 0) {
      timeout--;
      return;
    } 
    
    matrix.reset();
    
    float next_offset = getNextOffset(offset);
    if (mMovingRight) {
      matrix.setScale(-1, 1);
      matrix.postTranslate(commonBm.getWidth(), 0);
    }
    matrix.postTranslate(next_offset, y - commonBm.getHeight() / 4);

    
    if (!isDead && mStone != null && mStone.mVector.y <= this.y) {
      if (isIntersects((int) mStone.mVector.x)) {
        handleHit(mStone.HPS);
      }
      mStone = null;
    }
    
    if (isDead) {
      drawDeadAnimation(c, p);
    } else {
      if (isHidden) {
        if (isAppearing) {
          drawEmerging(c, p);
        } else {
          drawDiving(c, p);   
        }
      } else {
        drawNormal(c, p);
      }
    }
  }
  
  @Override
  public void handleHit(int hps) {
    SoundManager.getInstance().vibrate(30);
    mStone.makeFountain = false;
    mHealth -= hps;
    
    addValue(mScoreValue);
    if (mHealth <=0) {
      isDead = true;
      SoundManager.getInstance().playHit();
      DuckGame.getCurrentMatch().requestNextCreatureIfNeed();
      Bonus bonus = DuckGame.getCurrentMatch().addKilledCreature(this);
      if (bonus != Bonus.NO) {
        Desk.getInstance().playBonus(bonus);
      }
      DuckGame.getCurrentMatch().addScore((int) (mSumValues *= bonus.getMultiplier()));
    } else if (isArmored()) {
      setArmored(false);
      speed = 5;
      SoundManager.getInstance().playArmorHit();
    } else {
      SoundManager.getInstance().playScream();
      hide();
    }
  }

  private void drawEmerging(Canvas c, Paint p) {
    if (emerging_frame < 8) {
      c.drawBitmap(mAniEmerging[emerging_frame], matrix, p); 
      emerging_frame++;
    } else {
      isAppearing = false;
      isHidden = false;
      drawNormal(c, p);
    }
  }

  private void drawDiving(Canvas c, Paint p) {
    matrix.postTranslate(0, ScrProps.scale(-10));
    if (diving_frame < 16) {
      c.drawBitmap(mAniDiving[diving_frame], matrix, p); 
      diving_frame++;
    }  else {
      appear();
      mMoveFlag  = true;
    }
  }
 
  @Override
  protected void drawNormal(Canvas c, Paint p) {
    if (isArmored()) {
      matrix.postTranslate(0, -ScrProps.scale(9));
      c.drawBitmap(secondCommonBm, matrix, p);
    } else {
      c.drawBitmap(commonBm, matrix, p);
    }
    
    float[] point = new float[] {0, 0};   
    matrix.mapPoints(point);
    drawHealth(point, c, p);
  }
  
  private void drawDeadAnimation(Canvas c, Paint p) {
    
    if (has_sink) {
      drawScore(c, p);
      return;
    }
    
    if (dead_sink == 0) {
      dead_degree += 15;
      matrix.postRotate(dead_degree, offset + deadDuckBm.getWidth() / 2,
          y + deadDuckBm.getHeight() / 3 - ScrProps.scale(10));
      if (dead_degree > 160) {
        dead_sink++;
      }
    } else {
      matrix.postRotate(180, offset + deadDuckBm.getWidth() / 2, y
          + deadDuckBm.getHeight() / 3 - ScrProps.scale(10));
      dead_sink += 1;
      matrix.postTranslate(0, dead_sink);
    }
 
    if (dead_sink > ScrProps.scale(15)) { //have sink
      has_sink = true;
    } 
    
    matrix.postTranslate(0, ScrProps.scale(10));
    c.drawBitmap(deadDuckBm, matrix, p);
  }

  private void drawScore(Canvas c, Paint p) {
    int alpha = ScrProps.scale(100)+dead_sink;
    if (alpha < ScrProps.scale(40)) {
      end_animation = true;
    }
    dead_sink-=ScrProps.scale(4);
    
    addit_m.reset();
    addit_m.setScale(0.6f, 0.6f);
    addit_m.postTranslate(this.offset, ownedGround.y + ScrProps.scale(dead_sink));
    Desk.drawScoreDigits(c, p, addit_m, mSumValues);
  }

  @Override
  protected boolean isIntersects(int ix) {
    return !isHidden && super.isIntersects(ix);
  }
  

  public void hide() {
    isHidden = true;
    isAppearing = false;
    emerging_frame = 0;
  }
  
  public void appear() {
    isAppearing = true;
    diving_frame = 0;
  }

  @Override
  public boolean equals(Object o) {
    return this.id == ((Duck)o).id;
  }

  @Override
  public int hashCode() {
    return id;
  }
  
  public void setOwnedWave(GroundObject ground, int xa) {
    mScoreValue = 50 + 10*(DuckShotModel.getInstance().mGrounds.size() - 1 - ground.wave_num);
    if (isArmored()) {
      mScoreValue *= 2.5;
    }
    isHidden = true;
    appear();
    super.setOwnedWave(ground, xa);
    setRandomDelay();
  }


  public void setArmored(boolean mIsArmored) {
    this.mIsArmored = mIsArmored;
    if (mIsArmored) {
      mHealth = 120;
    }
  }

  public boolean isArmored() {
    return mIsArmored;
  }

}
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.