Android Open Source - LucyTheMoocher Camera






From Project

Back to project page LucyTheMoocher.

License

The source code is released under:

MIT License

If you think the Android project LucyTheMoocher 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

package com.lucythemoocher.graphics;
/*  www.j a v  a 2  s.  c o m*/
import com.lucythemoocher.Globals.Globals;
import com.lucythemoocher.actors.PlayerCharacter;
import com.lucythemoocher.controls.GlobalController;
import com.lucythemoocher.physics.Box;
import com.lucythemoocher.util.Direction;
import com.lucythemoocher.util.Resources;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.util.SparseArray;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

/**
 * Render Drawables and Background
 * Handle scrolling
 * Camera's system is used in MasterLoop
 * Camera is not the physical screen, but a representation of the screen, so w() et h() are independent from the
 * hardware screen's size.
 * @see MasterLoop
 */
public class Camera extends SurfaceView implements SurfaceHolder.Callback {

  private static final float CAMERASPEED = 2f;
  static final float BACKGROUNDSPEED = 0.5f;

  private static float DT_ = 1;

  private Box screen_; // hardware screen's size
  private Canvas canvas_;
  private float currX_;
  private float currY_;
  private float scale_; // coefficient depending on hardware screen's size
  private boolean canDraw_ = false;
  
  private SparseArray<Paint> hudPaints_;
  private RectF hudOval_;
  
  /**
   * Constructor
   */
  public Camera(Context c) {
    super(c);
    float h = Resources.getActivity().getWindowManager().getDefaultDisplay().getHeight();
    float w = Resources.getActivity().getWindowManager().getDefaultDisplay().getWidth();
    currX_ = 1;
    currY_ = 1;
    screen_ = new Box(currX_,currY_,h,w);
    
    getHolder().addCallback(this);
    setFocusable(true);
    scale_ = screen_.getW() / 1200f;
    
    hudPaints_ = new SparseArray<Paint>();
    initHudColors(new int[] {Color.GRAY, Color.BLACK}, h);
    hudOval_ = new RectF(-w/10, -w/10, w+w/10, h+w/10);
    
    setSpeed(1.0f / 30.0f);
    this.requestFocus();
    this.setFocusableInTouchMode(true);
  }
  
  /**
   * Target a position at the middle of the screen
   * @param x coor
   * @param y coor
   */
  public void moveTo(float x, float y) {
    currX_ = x;
    currY_ = y;
    screen_.setX((currX_ - w() / 2));
    screen_.setY((currY_ - h() / 2));
  }
  
  /**
   * Initialize the HUD colors
   * @param colorArray colors to initialize
   */
  private void initHudColors(int colorArray[], float h) {
    for (int color : colorArray) {
      Paint currPaint = new Paint();
      currPaint.setStrokeWidth(h*0.40f);
      currPaint.setStyle(Paint.Style.STROKE);
      currPaint.setColor(color);
      currPaint.setAlpha(50);
      hudPaints_.put(color, currPaint);
    }
  }

  /**
   * Update position of the camera
   */
  public void update() {
    PlayerCharacter pc = Globals.getInstance().getGame().getCharacter();
    // follow player if exists
    if (pc != null) {
      followPoint( pc.getCinematic().getTargetX(), pc.getCinematic().getTargetY());
    }
  }
  
  /**
   * Getter
   */
  public Box getScreen() {
    Box scaledScreen = new Box(screen_);
    scaledScreen.setH(scaledScreen.getH() / scale_);
    scaledScreen.setW(scaledScreen.getW() / scale_);
    return scaledScreen;
  }
  
  /**
   * Follow the point (x, y) without exceeding camera's speed
   * @param x
   * @param y
   */
  public void followPoint(float x, float y) {
    float coeff = camSpeed() * Globals.getInstance().getGame().getDt();
    float diffX = x - currX_;
    float diffY = y - currY_;
    if (diffX == 0 && diffY == 0) {
      return;
    }
    float ratio = (float) Math.sqrt(Math.abs(diffX) + Math.abs(diffY));
    if (coeff / ratio < 1) {
      currX_ += diffX / ratio * coeff;
      currY_ += diffY / ratio * coeff;
    } else {
      currX_ += diffX;
      currY_ += diffY;
    }
    screen_.setX((currX_ - w() / 2));
    screen_.setY((currY_ - h() / 2));
  }

  /**
   * Must be called before renderings
   * This locking is currently handled in the MasterLoop
   * @return true if managed to create the canvas
   * @see unlockScreen
   * @see MasterLoop
   */
  public boolean lockScreen() {
    canvas_ = getHolder().lockCanvas();
    return canvas_ != null;
  }
  
  /**
   * Graphical operation to perform before drawing things
   * Assume the canvas is not null
   */
  public void prepare() {
    canvas_.scale(scale_, scale_);
  }
  
  /**
   * Must be called after renderings, to unlock canvas
   * Assumes the canvas is not null
   * @see lockScreen
   */
  public void unlockScreen() {
    getHolder().unlockCanvasAndPost(canvas_);
  }
  
  /**
   * Getter
   * @return True when Camera is ready for rendering
   */
  public boolean canDraw() {
    return canDraw_;
  }

  /**
   * Getter
   * @return Camera's speed
   * 
   * This is just a coeff used, the speed also depends on the distance with 
   * the target point
   */
  private float camSpeed() {
    return CAMERASPEED*DT_;
  }

  /**
   * Getter
   * @return Camera's height in dp pixels
   * 
   * Doesn't depend on the hardware screen's size
   * @see #physicalH()
   */
  public float h() {
    return screen_.getH() / scale_;
  }
  
  /**
   * Getter
   * @return Camera's width in dp pixels
   * 
   * Doesn't depend on the hardware screen's size
   * @see #physicalW()
   */
  public float w() {
    return screen_.getW() / scale_;
  }
  
  /**
   * Getter
   * @return height of the physical screen (real resolution)
   */
  public float physicalH() {
    return screen_.getH();
  }
  
  /**
   * Getter
   * @return width of the physical screen (real resolution)
   */
  public float physicalW() {
    return screen_.getW();
  }
  
  /**
   * Draw the full screen with color
   * @param color
   */
  public void drawFullColor(int color) {
    canvas_.drawColor(color);
  }
  
  /**
   * Draw text in the middle of the screen
   * @param text
   * @param color
   */
  public void drawCenterText(String text, int color) {
    Paint textPaint = new Paint();
    textPaint.setColor(color);
    textPaint.setTextAlign(Align.CENTER);
    textPaint.setTextSize(0.08f*physicalH());
    textPaint.setTypeface(Typeface.create("Arial",Typeface.BOLD));
    canvas_.scale(1/scale_, 1/scale_);
    canvas_.drawText(text, physicalW()/5, physicalH()/2, textPaint);
    canvas_.scale(scale_, scale_);
  }
  
  /**
   * Draw text
   * @param text
   * @param color
   * @param pos where to print text
   */
  public void drawText(String text, int color, float pos) {
    Paint textPaint = new Paint();
    textPaint.setColor(color);
    textPaint.setTextAlign(Align.LEFT);
    textPaint.setTextSize(0.08f*physicalH());
    textPaint.setTypeface(Typeface.create("Arial",Typeface.BOLD));
    canvas_.scale(1/scale_, 1/scale_);
    canvas_.drawText(text, physicalW()/5, pos, textPaint);
    canvas_.scale(scale_, scale_);
  }

  /**
   * Draw the image at the position x y
   * Screen must be locked
   * @param x x position in dp pixels
   * @param y y position in dp pixels
   * @param image
   * @see #lockScreen()
   */
  public void drawImage(float x, float y, Image image) {
    float xx = x  - offsetx() ;
    float yy = y  - offsety() ;
    canvas_.drawBitmap(image.getBitmap().getBitmap(), xx, yy, image.getBitmap().getPaint());
  }
  
  /**
   * Draw the image without using the scrolling
   * @param  x position in dp pixels
   * @param y y position in dp pixels
   * @param image
   * @see #lockScreen()
   */
  public void drawImageOnHud(float x, float y, Image image) {
    canvas_.drawBitmap(image.getBitmap().getBitmap(), x, y, image.getBitmap().getPaint());
  }
  
  /**
   * Draw the HUD ellipsis, insensitive to scale
   * @param dir
   * @param c
   */
  public void drawControlOnHud(int dir, int c) {
    int start_radix = 0;
    int radix_range = 90;
    int big_radix = 90;
    int small_radix = 180 - big_radix;
    if (dir == Direction.UP) {
      start_radix = -90 - big_radix / 2;
      radix_range = big_radix;
    } else if (dir == Direction.RIGHT) {
      start_radix = 0 - small_radix / 2;
      radix_range = small_radix;
    } else if (dir == Direction.DOWN) {
      start_radix = 90 - big_radix / 2;
      radix_range = big_radix;
    } else if (dir == Direction.LEFT) {
      start_radix = 180 - small_radix / 2;
      radix_range = small_radix;
    }

    // Insensitive to scale (quite dirty :s)
    canvas_.scale(1/scale_, 1/scale_);
    canvas_.drawArc(hudOval_, start_radix, radix_range, false, hudPaints_.get(c));
    canvas_.scale(scale_, scale_);
  }
  
  /**
   * Draw the background according to the camera position
   * Screen must be locked
   * @param background
   * @see #lockScreen()
   */
  public void drawBackground(Background background)  {
    float x = -(currX_ - screen_.getW() / 2) * BACKGROUNDSPEED;
    float y = -(currY_ - screen_.getH() / 2) * BACKGROUNDSPEED;
    float offsetX = screen_.getW() / 2;
    float offsetY = screen_.getH() / 2;
    background.draw(Math.abs(offsetX-x), Math.abs(offsetY-y));
  }
  
  /**
   * Draw the background according to the camera position
   * Screen must be locked
   * @param 
   * @param 
   * @param 
   * @see #lockScreen()
   */
  void drawBackground(Image im, float x, float y)  {
    canvas_.drawBitmap(im.getBitmap().getBitmap(), 
        x, 
        y, 
        null);
  }

  /**
   * Mutator 
   * @param dt New dt speed
   */
  public static void setSpeed(float dt) {
    DT_ = dt;
  }


  public boolean onTouchEvent(MotionEvent event) {
    GlobalController.getInstance().process(event);
    return true;
  }
  
  public boolean onKeyDown (int keyCode, KeyEvent event) {
    GlobalController.getInstance().processKey(keyCode, event);
    return true;
  }

  public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {}

  public void surfaceCreated(SurfaceHolder arg0) {
    canDraw_ = true;
  }

  public void surfaceDestroyed(SurfaceHolder arg0) {
    canDraw_ = false;
  }
  
  public float offsetx() {
    return screen_.getX();
  }

  public float offsety() {
    return screen_.getY();
  }
  
  /**
   * Getter
   * @return current scale
   */
  public float getScale() {
    return scale_;
  }
}




Java Source Code List

com.lucythemoocher.LucyTheMoocherActivity.java
com.lucythemoocher.FX.FXManager.java
com.lucythemoocher.FX.FX.java
com.lucythemoocher.Globals.Globals.java
com.lucythemoocher.actors.Actor.java
com.lucythemoocher.actors.ActorsManager.java
com.lucythemoocher.actors.Monster.java
com.lucythemoocher.actors.MonstersManager.java
com.lucythemoocher.actors.PlayerCharacter.java
com.lucythemoocher.actors.Projectile.java
com.lucythemoocher.actors.ProjectilesManager.java
com.lucythemoocher.actors.Tank.java
com.lucythemoocher.actors.TargetCharacter.java
com.lucythemoocher.actors.maincharacter.state.StateAttack.java
com.lucythemoocher.actors.maincharacter.state.StateFalling.java
com.lucythemoocher.actors.maincharacter.state.StateJumping.java
com.lucythemoocher.actors.maincharacter.state.StateNone.java
com.lucythemoocher.actors.maincharacter.state.StateRunning.java
com.lucythemoocher.actors.maincharacter.state.StateWallSliding.java
com.lucythemoocher.actors.maincharacter.state.StateWallWalking.java
com.lucythemoocher.actors.maincharacter.state.State.java
com.lucythemoocher.controls.AIController.java
com.lucythemoocher.controls.ActionController.java
com.lucythemoocher.controls.ButtonListener.java
com.lucythemoocher.controls.Controllable.java
com.lucythemoocher.controls.Controller.java
com.lucythemoocher.controls.GlobalController.java
com.lucythemoocher.controls.KeysListener.java
com.lucythemoocher.controls.TouchListener.java
com.lucythemoocher.events.EventNormal.java
com.lucythemoocher.events.EventSlow.java
com.lucythemoocher.events.Event.java
com.lucythemoocher.game.GameThread.java
com.lucythemoocher.game.Game.java
com.lucythemoocher.game.LevelLoader.java
com.lucythemoocher.graphics.ActorDrawer.java
com.lucythemoocher.graphics.Animation.java
com.lucythemoocher.graphics.Background.java
com.lucythemoocher.graphics.Camera.java
com.lucythemoocher.graphics.Drawable.java
com.lucythemoocher.graphics.Grid.java
com.lucythemoocher.graphics.HUD.java
com.lucythemoocher.graphics.Image.java
com.lucythemoocher.graphics.PersistentEffect.java
com.lucythemoocher.graphics.PersistentPic.java
com.lucythemoocher.graphics.PictureContainer.java
com.lucythemoocher.gui.MenuButtonListener.java
com.lucythemoocher.gui.MenuButtonTouchListener.java
com.lucythemoocher.gui.MenuButton.java
com.lucythemoocher.loops.CreditsLoop.java
com.lucythemoocher.loops.GameOverLoop.java
com.lucythemoocher.loops.InitMenuLoop.java
com.lucythemoocher.loops.LivesMenuLoop.java
com.lucythemoocher.loops.LoopGame.java
com.lucythemoocher.loops.LoopPause.java
com.lucythemoocher.loops.Loop.java
com.lucythemoocher.loops.MasterLoop.java
com.lucythemoocher.physics.Box.java
com.lucythemoocher.physics.Cinematic.java
com.lucythemoocher.physics.Map.java
com.lucythemoocher.sounds.SoundManager.java
com.lucythemoocher.sounds.SoundsState.java
com.lucythemoocher.sounds.StateLevel1.java
com.lucythemoocher.sounds.StateLevel2.java
com.lucythemoocher.sounds.StateLevel3.java
com.lucythemoocher.sounds.StateNormal.java
com.lucythemoocher.util.Direction.java
com.lucythemoocher.util.MathUtil.java
com.lucythemoocher.util.Resources.java
com.lucythemoocher.util.Timer.java