1 /** 2 * Hilo 3 * Copyright 2015 alibaba.com 4 * Licensed under the MIT License 5 */ 6 7 /** 8 * @class Camera类表示摄像机。 9 * @param {Object} properties 创建对象的属性参数。可包含此类所有可写属性。 10 * @module hilo/game/Camera 11 * @requires hilo/core/Class 12 * @requires hilo/util/util 13 * @property {Number} width 镜头宽 14 * @property {Number} height 镜头高 15 * @property {Object} scroll 滚动值 {x:0, y:0} 16 * @property {View} target 摄像机跟随的目标 17 * @property {Array} bounds 摄像机移动边界的矩形区域 [x, y, width, height] 18 * @property {Array} deadzone 摄像机不移动的矩形区域 [ x, y, width, height] 19 */ 20 var Camera = Class.create(/** @lends Camera.prototype */{ 21 constructor:function(properties){ 22 this.width = 0; 23 this.height = 0; 24 25 this.target = null; 26 this.deadzone = null; 27 this.bounds = null; 28 29 this.scroll = { 30 x:0, 31 y:0 32 }; 33 34 util.copy(this, properties); 35 }, 36 /** 37 * 更新 38 * @param {Number} deltaTime 39 */ 40 tick:function(deltaTime){ 41 var target = this.target; 42 var scroll = this.scroll; 43 var bounds = this.bounds; 44 var deadzone = this.deadzone; 45 46 if(target){ 47 var viewX, viewY; 48 if(deadzone){ 49 viewX = Math.min(Math.max(target.x - scroll.x, deadzone[0]), deadzone[0] + deadzone[2]); 50 viewY = Math.min(Math.max(target.y - scroll.y, deadzone[1]), deadzone[1] + deadzone[3]); 51 } 52 else{ 53 viewX = this.width * .5; 54 viewY = this.height * .5; 55 } 56 57 scroll.x = target.x - viewX; 58 scroll.y = target.y - viewY; 59 60 if(bounds){ 61 scroll.x = Math.min(Math.max(scroll.x, bounds[0]), bounds[0] + bounds[2]); 62 scroll.y = Math.min(Math.max(scroll.y, bounds[1]), bounds[1] + bounds[3]); 63 } 64 } 65 else{ 66 scroll.x = 0; 67 scroll.y = 0; 68 } 69 }, 70 /** 71 * 跟随目标 72 * @param {Object} target 跟随的目标,必须是有x,y属性的对象 73 * @param {Array} deadzone 摄像机不移动的矩形区域 [ x, y, width, height] 74 */ 75 follow:function(target, deadzone){ 76 this.target = target; 77 if(deadzone !== undefined){ 78 this.deadzone = deadzone; 79 } 80 this.tick(); 81 } 82 }); 83