最近不务正业地研究了一下JavaScript游戏,选择了其中一款游戏引擎quintus。
quintus简介
quintus是一款开源的HTML5游戏引擎,其核心模块包括:
Sprites:通过继承Sprites类,你可以创建你的游戏角色。
Scenes:场景类,是一个可以重复利用的元素,通过继承Scene,你可以设置游戏的关卡等。
Input and Touch: 该模块用来监听键盘、鼠标、触摸事件。
Animation: 动画类,为Sprite定制动画。
Audio: 处理声音。
2D:2D模块主要是描述一个简单的动力学模型,如你的Sprite加入了2D模块,那么你的Sprite就会按照重力效应自动往下掉。
UI:用来创建按钮等元素。
一个例子
这是官网给出的一个例子,通过研究这个例子的源码可以对quintus有个初步的了解。
分析
奔跑的小精灵
1 | Q.Sprite.extend("Player",{ |
Player
继承了Sprite
类,覆盖了init
方法和step
方法,init方法中有很多默认的属性,如x,y,cx,cy
等等,值得注意的是sheet,sprite,collisionMask,standingPoints,duckingPoints
这几个属性。
sheet相当于图片类,是一种特殊的图片加载器,定义了精灵的外形,此处用到的sheet是player,后面会有介绍。
sprite是动作结合,定义的几个基础的动作,此处用到的sprite是player,后面介绍。
collisionMask是碰撞检测的标识,此处表示与type为SPRITE_BOX的对象的碰撞会被检测到,而后面的箱子的type就是SPRITE_BOX。
standingPoints和duckingPoints是碰撞检测区域,是一个多边形,数组里面的二位坐标分别表示多边形的顶点,顺时针表示,一个是站着时候的多边形,一个是蹲着时候的多边形。
step方法是表示精灵随时间的变化,把dt看做一个不停自增的变量就可以了。
砸人的盒子
1 | Q.Sprite.extend("Box",{ |
盒子同样是由init和step方法,同时多了一个hit方法,hit是一种碰撞事件,通过this.add("hit")
与box绑定了。
盒子投掷器
1 | Q.GameObject.extend("BoxThrower",{ |
盒子投掷器是控制盒子出现的一个类,继承的是GameObject
,有init
方法和update
方法,update方法与step方法类似,是与时间变化有关的方法,不过update做的事情是随时间(dt)变化不停地重绘画面,这里this.stage.insert(new Q.Box())
,随着dt的自增,向画布里面插入新的box对象。
游戏场景
1 | Q.scene("level1",function(stage) { |
游戏场景相当于一个关卡,一个舞台,就是游戏的主画面,这里向这个scene(level1)中插入了背景,地板,盒子投掷器,精灵。
游戏加载
1 | Q.load("player.png, background-wall.png, background-floor.png, crates.png", function() { |
最后一步就是游戏加载,加载图片,并通过Q.stageScene("level1")
将第一关加入到游戏中。
定义两个sheet,一个是player,使用的图片是”player.png”,是一种元素集,总共有18个分解图形,依次取72*97大小作为一帧图形。
Q.animations("player",{})
定义的前面提到的player对应的sprite,有四个动作,以walk_right为例,使用的是player(sheet)里面的0-10帧图形,帧切换速率是1/15,即1/15s切换一次,翻转为false,循环为true。