之前写的小游戏,要么就比较简单,要么就是比较难看,或者人物本身是不会动的。
结合了其它人的经验,研究了一下精灵运动,就写一个简单的小游戏来试一下。
介绍一下几个主要的类:
- Frame:帧的定义,主要描述动画的一帧
- Animation:动画的定义,主要描述一个连贯的动画,由多个帧组成
- Sprite:精灵的定义,主要描述一个完整的实体,由多个动画组成
- TimeProcess:时间管理,由
requestAnimationFrame完成 - Person:一个完整人定义,就是主人公--
男人 - BlockBase:块的基类,下降中的障碍物基类,包含一些基本的参数与方法
- NormalBlock:普通块,继承于
BlockBase,最基础的块 - MissBlock,LeftBlock...等:其它特殊功能的块
- BlockFactory:块工厂,生产块的类
- Main:游戏主入口
游戏的文件结构:
- wfn.js:基础文件,包含动画定义,公共方法(都是比较简单的)
- person.js:人物的定义
- block.js:各种障碍物块的定义
- main.js:游戏主逻辑入口文件,处理主要逻辑
游戏的文件结构:
TimeProcess:主要用于统一处理定时器的事件,确保全局只有一个计时器
1 //定义贞管理类,兼容 2 var requestAnimationFrame = window.requestAnimationFrame 3 || window.mozRequestAnimationFrame 4 || window.webkitRequestAnimationFrame 5 || function(cb){setTimeout(cb,1000/60)}; 6 7 var TimeProcess = function(){ 8 9 this.list = []; 10 this.isStart = false; 11 } 12 TimeProcess.prototype = { 13 14 add : function(cb,param,context){ 15 16 this.list.push({cb:cb,param:param,context:context}); 17 }, 18 start : function(){ 19 20 this.isStart = true; 21 22 var self = this; 23 24 requestAnimationFrame(function(){ 25 26 var item = null, 27 p = []; 28 29 for(var i=0;i<self.list.length;i++){ 30 31 item = self.list[i]; 32 33 item.cb.apply(item.context,item.param); 34 } 35 36 if(self.isStart)requestAnimationFrame(arguments.callee); 37 }); 38 }, 39 stop : function(){ 40 41 this.isStart = false; 42 } 43 }