'use strict'; /* * 小型游戏引擎 */ function Game(id,options){ var _ = this; options = options||{}; var settings = { width:960, //画布宽度 height:640 //画布高度 }; for(var i in settings){ this[i] = options[i]||settings[i]; } var $canvas = document.getElementById(id); $canvas.width = _.width; $canvas.height = _.height; var _context = $canvas.getContext('2d'); //画布上下文环境 var _stages = []; //布景对象队列 var _events = {}; //事件集合 var _index, //当前布景索引 _hander; //帧动画控制 //活动对象构造 var Item = function(options){ options = options||{}; var settings = { x:0, //横坐标 y:0, //纵坐标 width:20, //宽 height:20, //高 type:0, //对象类型,0表示普通对象(不与地图绑定),1表示玩家控制对象,2表示程序控制对象 color:'#F00', //标识颜色 status:1, //对象状态,1表示正常,0表示隐藏,2表示暂停 orientation:0, //当前定位方向,0表示右,1表示下,2表示左,3表示上 vector:{}, //目标坐标 coord:{}, //如果对象与地图绑定,获得坐标值 speed:0, //移动速度 frames:1, //速度等级,内部计算器times多少帧变化一次 times:0, //计数 control:{}, //控制缓存,到达定位点时处理 path:[], //NPC自动行走的路径 index:0, //对象索引 stage:null, //绑定对象与所属布景绑定 update:function(){}, //更新参数信息 draw:function(){} //绘制 }; for(var i in settings){ this[i] = options[i]||settings[i]; } }; Item.prototype.bind = function(eventType,callback){ if(!_events[eventType]){ _events[eventType] = {}; $canvas.addEventListener(eventType,function(e){ var position = _.getPosition(e); _stages[_index].items.forEach(function(item){ if(Math.abs(position.x-item.x)-1){ return item; } }); return items; }; //添加地图 Stage.prototype.createMap = function(options){ var map = new Map(options); //动态属性 this.map = map; map.stage = this; map.y_length = map.data.length; map.x_length = map.data[0].length; return map; }; //绑定事件 Stage.prototype.bind = function(eventType,callback){ if(!_events[eventType]){ _events[eventType] = {}; window.addEventListener(eventType,function(e){ var key = 's' + _index; if(_events[eventType][key]){ _events[eventType][key](e); } e.preventDefault(); }); } _events[eventType]['s'+this.index] = callback.bind(this); //绑定事件作用域 }; //事件坐标 this.getPosition = function(e){ var box = $canvas.getBoundingClientRect(); return { x:e.clientX-box.left*(_.width/box.width), y:e.clientY-box.top*(_.height/box.height) }; } //创建布景 this.createStage = function(options){ var stage = new Stage(options); stage.index = _stages.length; _stages.push(stage); return stage; }; //下个布景 this.nextStage = function(){ if(_index<_stages.length-1){ _stages[_index] = 0; _index++; _stages[_index].start(); }else{ throw new Error('unfound new stage.'); } }; //初始化游戏引擎 this.init = function(){ _index = 0; if(_stages[_index]){ _stages[_index].start(); } }; }