Android Open Source - nadia Camera






From Project

Back to project page nadia.

License

The source code is released under:

GNU Lesser General Public License

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

/*
 * Camera.java/* w ww . j  ava 2 s  .  com*/
 * 
 * Copyright (c) 2013, Emmanuel Arana Corzo. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301  USA
 */

package com.redarctic.nadia.baseengine.tileengine;

import com.redarctic.nadia.ext.MathHelper;
import com.redarctic.nadia.ext.simplesignalslot.ISlotProvider;
import com.redarctic.nadia.baseengine.sprite.AnimatedSprite;
import com.redarctic.nadia.collision.Rectangle;

import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Point;

/**
 * Camera
 * Sets the logic to handle a point of view of the scene.
 * The camera could be set as a Free or Follow mode.
 * @see CameraMode
 */
public class Camera implements ISlotProvider {
  private static final float DEFAULT_ZOOM_INCREMENT = 0.25f;
  public static final float ZOOM_REAL_SIZE = 1.0f;
  private static final float DEFAULT_SPEED = 4.0f;
  public static final float MAX_SPEED = 16.0f;
  public static final float MIN_SPEED = 1.0f;

  /**
   * CameraMode
   * <p>{@link CameraMode#FREE}
   * {@link CameraMode#FOLLOW}</p>
   * @author Emmanuel Arana Corzo <{@link emmanuel.arana@gmail.com}>
   */
  public enum CameraMode {
    /**
     * You can control the camera freely with the game pad
     */
    FREE, 
    /**
     * The camera will follow the character
     */
    FOLLOW
  }
  
  private Point position;
  private float speed;
  private float zoom;
  private Rectangle viewportRectangle;
  private CameraMode mode;
  
  /**
   * getPosition
   * Gets the position of the camera in the current level
   * @return {@link Point}
   */
  public Point getPosition() {
    return this.position;
  }
  /**
   * setPosition
   * Sets the position given a point
   * @param position The new position
   */
  private void setPosition(Point position) {
    this.position = position;
  }
  
  public float getSpeed() {
    return this.speed;
  }
  
  public void setSpeed(float speed) {
    this.speed = MathHelper.clamp(speed, MIN_SPEED, MAX_SPEED);
  }
  
  public float getZoom() {
    return this.zoom;
  }
  
  public CameraMode getCameraMode() {
    return this.mode;
  }
  
  public Matrix getTransformation() {
    Matrix identity = new Matrix();
    identity.postScale(zoom, zoom);
    identity.postTranslate(position.x, position.y);
    return identity;
  }
  
  public Rectangle getViewportRectangle() {
    return new Rectangle(
        viewportRectangle.left,
        viewportRectangle.top, 
        viewportRectangle.right, 
        viewportRectangle.bottom);
  }
  
  public Camera(Rectangle viewportRect) {
    speed = DEFAULT_SPEED;
    zoom = ZOOM_REAL_SIZE;
    this.viewportRectangle = viewportRect;
    mode = CameraMode.FOLLOW;
    this.position = new Point(
        0, 0
        );
  }
  
  public Camera(Rectangle viewportRect, Point position) {
    speed = DEFAULT_SPEED;
    zoom = ZOOM_REAL_SIZE;
    this.viewportRectangle = viewportRect;
    mode = CameraMode.FOLLOW;
    this.setPosition(position);
  }
  
  public void update(Canvas canvas) {
  }
  
  public void moveLeft() {
    if (CameraMode.FOLLOW != this.mode) {
      Point motion = new Point(0, 0);
      
      motion.x = (int)-speed;
      
      if (!motion.equals(0, 0)) {
        motion = MathHelper.normalize(motion);
        position.x += motion.x * speed;
        position.y += motion.y * speed;
        lockCamera();
      }
    }
  }
  
  public void moveRight() {
    if (CameraMode.FOLLOW != this.mode) {
      Point motion = new Point(0, 0);
      
      motion.x = (int)speed;
      
      if (!motion.equals(0, 0)) {
        motion = MathHelper.normalize(motion);
        position.x += motion.x * speed;
        position.y += motion.y * speed;
        lockCamera();
      }
    }
  }
  
  public void moveUp() {
    if (CameraMode.FOLLOW != this.mode) {
      Point motion = new Point(0, 0);
      
      motion.y = (int)-speed;
      
      if (!motion.equals(0, 0)) {
        motion = MathHelper.normalize(motion);
        position.x += motion.x * speed;
        position.y += motion.y * speed;
        lockCamera();
      }
    }
  }
  
  public void moveDown() {
    if (CameraMode.FOLLOW != this.mode) {
      Point motion = new Point(0, 0);
      
      motion.y = (int)speed;
      
      if (!motion.equals(0, 0)) {
        motion = MathHelper.normalize(motion);
        position.x += motion.x * speed;
        position.y += motion.y * speed;
        lockCamera();
      }
    }
  }
  
  private void lockCamera() {
    if (this.position != null && this.viewportRectangle != null) {
      this.position.x = Math.round( MathHelper.clamp(this.position.x, 0, 
          TileMap.getWidthInPixels() * this.zoom - this.viewportRectangle.width()) );
      this.position.y = Math.round( MathHelper.clamp(this.position.y, 0,
          TileMap.getHeightInPixels() * this.zoom - this.viewportRectangle.height()) );
    }
  }
  
  public void lockToSprite(AnimatedSprite sprite) {
    if (this.position != null && this.viewportRectangle != null) {
      this.position.x = (int) ( (sprite.getPosition().x + sprite.getWidth() >> 1) * 
          this.zoom - 
          ( (this.viewportRectangle.width()) / 2) );
      this.position.y = (int) ( (sprite.getPosition().y + sprite.getHeight() >> 1) * 
          this.zoom - 
          ( (this.viewportRectangle.height()) / 2) );
    }
    this.lockCamera();
  }
  
  public void toggleCameraMode() {
    if (this.mode == CameraMode.FOLLOW) {
      this.mode = CameraMode.FREE;
    }
    else if (mode == CameraMode.FREE) {
      this.mode = CameraMode.FOLLOW;
    }
  }
  
  public void zoomIn() {
    this.zoom += DEFAULT_ZOOM_INCREMENT;
    
    if (this.zoom > 2.5f)
      this.zoom = 2.5f;
    
    Point newPosition = MathHelper.pointMulScalar(this.getPosition(), (int)this.zoom);
    snapToPosition(newPosition);
  }
  
  public void zoomOut() {
    this.zoom -= DEFAULT_ZOOM_INCREMENT;
    
    if (this.zoom < 0.5f)
      this.zoom = 0.5f;
    
    Point newPosition = MathHelper.pointMulScalar(this.getPosition(), (int)this.zoom);
    snapToPosition(newPosition);
  }
  
  private void snapToPosition(Point newPosition) {
    this.position.x = (int) (newPosition.x - this.viewportRectangle.width() / 2);
    this.position.y = (int) (newPosition.y - this.viewportRectangle.height() / 2);
    lockCamera();
  }
}




Java Source Code List

com.ashokgelal.samaya.DateTimeFormatter.java
com.ashokgelal.samaya.DateTimeInterval.java
com.ashokgelal.samaya.DateTimeParser.java
com.ashokgelal.samaya.DateTime.java
com.ashokgelal.samaya.ModelUtil.java
com.ashokgelal.samaya.Samaya.java
com.ashokgelal.samaya.TimeSpan.java
com.ashokgelal.samaya.ToStringUtil.java
com.ashokgelal.samaya.Util.java
com.redarctic.nadia.baseengine.BaseGameState.java
com.redarctic.nadia.baseengine.ColorPallete.java
com.redarctic.nadia.baseengine.DrawableGameComponent.java
com.redarctic.nadia.baseengine.DrawableObject.java
com.redarctic.nadia.baseengine.GameComponent.java
com.redarctic.nadia.baseengine.GameStateManager.java
com.redarctic.nadia.baseengine.GameState.java
com.redarctic.nadia.baseengine.GameSurfaceView.java
com.redarctic.nadia.baseengine.GameSurface.java
com.redarctic.nadia.baseengine.SpriteFont.java
com.redarctic.nadia.baseengine.Sprite.java
com.redarctic.nadia.baseengine.character.BaseModifier.java
com.redarctic.nadia.baseengine.character.Classes.java
com.redarctic.nadia.baseengine.character.FormulaModifierException.java
com.redarctic.nadia.baseengine.character.Player.java
com.redarctic.nadia.baseengine.item.ArmorLocation.java
com.redarctic.nadia.baseengine.item.Armor.java
com.redarctic.nadia.baseengine.item.BaseItem.java
com.redarctic.nadia.baseengine.item.ItemManager.java
com.redarctic.nadia.baseengine.item.ItemType.java
com.redarctic.nadia.baseengine.item.Shield.java
com.redarctic.nadia.baseengine.item.Weapon.java
com.redarctic.nadia.baseengine.item.WeaponsType.java
com.redarctic.nadia.baseengine.sprite.AnimatedSprite.java
com.redarctic.nadia.baseengine.sprite.AnimationException.java
com.redarctic.nadia.baseengine.sprite.AnimationKey.java
com.redarctic.nadia.baseengine.sprite.Animation.java
com.redarctic.nadia.baseengine.tileengine.Camera.java
com.redarctic.nadia.baseengine.tileengine.Engine.java
com.redarctic.nadia.baseengine.tileengine.MapLayer.java
com.redarctic.nadia.baseengine.tileengine.TileException.java
com.redarctic.nadia.baseengine.tileengine.TileMap.java
com.redarctic.nadia.baseengine.tileengine.Tile.java
com.redarctic.nadia.baseengine.tileengine.Tileset.java
com.redarctic.nadia.baseengine.world.Level.java
com.redarctic.nadia.baseengine.world.World.java
com.redarctic.nadia.collision.Circle.java
com.redarctic.nadia.collision.CollisionPolygon.java
com.redarctic.nadia.collision.ConvexPolygonException.java
com.redarctic.nadia.collision.Rectangle.java
com.redarctic.nadia.controls.ButtonPad.java
com.redarctic.nadia.controls.DirectionalPad.java
com.redarctic.nadia.controls.menu.CharacterDialog.java
com.redarctic.nadia.controls.menu.ControlBorder.java
com.redarctic.nadia.controls.menu.ControlManager.java
com.redarctic.nadia.controls.menu.Control.java
com.redarctic.nadia.controls.menu.Label.java
com.redarctic.nadia.controls.menu.LeftRightSelector.java
com.redarctic.nadia.controls.menu.LinkLabel.java
com.redarctic.nadia.controls.menu.Menu.java
com.redarctic.nadia.controls.menu.PictureBox.java
com.redarctic.nadia.controls.menu.SimpleConversation.java
com.redarctic.nadia.ext.MathHelper.java
com.redarctic.nadia.ext.StringHelper.java
com.redarctic.nadia.ext.simplesignalslot.ISignalProvider.java
com.redarctic.nadia.ext.simplesignalslot.ISlotProvider.java
com.redarctic.nadia.ext.simplesignalslot.PrimitiveWrapper.java
com.redarctic.nadia.ext.simplesignalslot.SignalSlotMap.java
com.redarctic.nadia.ext.simplesignalslot.SignalSlotPair.java
com.redarctic.nadia.ext.simplesignalslot.SlotProviderMethodPair.java