用phaser开发2D平台游戏

前言

phaser是一个非常好用的html5游戏开发框架,官网上是这样介绍的:“一个快速、免费并且完全开源的框架,提供Canvas和WebGL两种渲染方式,致力于增强桌面端与移动端浏览器游戏的体验”。使用的过程中,个人确实感觉它的方便与易用性,能够快速实现自己的游戏想法。

phaser.png

目标

为了学习phaser框架,开发了一款简单的平台跳跃游戏。学习了如何在phaser中使用场景(State),精灵(Sprite),游戏输入(Input)以及碰撞检测,算是简单的入门而已。这个框架还有更多精彩出众的地方,等着我去发掘。主要的学习手段是参阅框架API文档,不得不说phaser的API文档写得很赞,结构清晰,内容完整准确,让初学者能够快速上手。

platformer.png

开始

一切的一切,从一个platformer目录开始。platformer目录包含一个index.html入口文件以及img和js文件夹。html文件很简单,只是标准的html5文件结构,里面引用了js文件夹中phaser.min.js游戏框架文件和main.js游戏逻辑文件。需要注意的是在html文件中要注意js的引用的顺序,main.js会使用phaser.min.js提供的Phaser全局变量,所以要先引用phaser.min.js文件,接着引用main.js文件,否则会报错。img文件中是游戏的资源文件,一张白色的方块图片,在游戏中会被渲染成不同的颜色,表示不同的游戏对象。

构建游戏世界

html5游戏,世界都构建在<canvas>标签上面。首先来构建当前的游戏世界,并直接进入主要场景(Main State)。游戏很简单,所以只有一个主场景,如果开发复杂一些的游戏,就要考虑到场景的管理与切换了(从开始场景到游戏场景再到结束场景等等)。

var game = new Phaser.Game(600, 250 , Phaser.AUTO,"");
var main = new Phaser.State();
game.state.add('Main', main);
game.state.start('Main');

Phaser.Game用来构建游戏世界,接受的参数依次是游戏世界的宽、高、渲染模式和<canvas>标签的id属性,本游戏渲染模式使用Phaser.AUTO,也就是自动检测,在浏览器支持WebGL的时候使用WebGL渲染,不支持的时候回退到Canvas渲染。id参数传入""是让框架在<body>中生成<canvas>标签。如果需要在特定的<div>标签内生成,首先应该在html文件中添加带id属性的<div>标签,然后传入id属性即可。Phaser.Game返回一个游戏对象,这是整个游戏的核心,通过这个游戏对象(用全局变量game引用),就可以快速使用phaser提供的各种方法来开发html5游戏了。
Phaser.State用来创建游戏场景。从名称上来说state应该译为状态,但我觉得称为场景更加妥当。因为Phaser.State中提供的各个方法搭起了一个脚手架,用来展现当前游戏画面。本游戏用到了init方法,preload方法,create方法和update方法,分别管理当前场景的初始化、预加载、生成游戏对象以及更新游戏循环。通过扩展这些方法,就可以实现精彩纷呈的各种游戏了。

mainstate.png

扩展游戏场景

  • 初始化方法:启动物理引擎(ARCADE),这是Phaser框架自带的最简单的物理引擎,用于矩形盒的碰撞检测,适于本游戏,设定游戏的背景颜色。
main.init = function(){
    game.physics.startSystem(Phaser.Physics.ARCADE);
    game.world.enableBody = true;
    game.stage.backgroundColor = "#489ad8";
}
  • 预加载方法:加载本游戏唯一的一张图片资源,关键在于设定每张图片的唯一id,便于在整个游戏中引用。主要用到game.load加载器,用来加载游戏中需要的各种资源,用音乐,图片,精灵图,JSON配置文件等等。
game.load.image('box', 'img/box.png');
  • 生成游戏对象方法:添加左右墙壁,地面以及主角、奖励以及障碍物。代码展示如何生成地面,里面用到了phaser中组(Group)的概念。用于管理相同的、游戏中大量出现的游戏对象(比如子弹、道具等,比起用循环来增删对象,使用组更加有效率,性能更高,实现了缓冲池的功能)。向游戏中添加游戏对象主要用到game.add方法,用来快速将对象加入到游戏舞台上,如精灵,文字,声音等。然后开启地面图片的碰撞属性,设置body.immovable=true,防止主角从上方掉下时,将地面也砸下去。主角、奖励和障碍物生成代码类似,不再赘述。最后生成游戏控制按键(键盘中的上、下、左、右方向键)。
main.create = function(){
    this.walls = game.add.group();
    ...
    //ground
    for(var i=1; i<13; i++){
        var wall = game.add.sprite(30*i, 90, 'box','', this.walls);
        wall.scale.setTo(0.6, 0.6);
    }
    ...
    this.walls.x = 90;
    this.walls.y = game.world.centerY-60;
    this.walls.setAll('tint', 0x1a5882);
    this.walls.forEach(game.physics.enable, game.physics);
    this.walls.setAll('body.immovable', true);
    ...
     this.cursor = game.input.keyboard.createCursorKeys();
     }
  • 更新循环方法:通过方向键控制主角左右移动和跳跃,当主角撞到障碍时,游戏重新开始,撞到奖励时,销毁奖励物品。
main.update = function(){
    ...
    game.physics.arcade.overlap(this.player, this.lava, this.restart, null, this);
    ...
    if (this.cursor.left.isDown) 
        this.player.body.velocity.x = -200;
    ...
    if (this.cursor.up.isDown && this.player.body.touching.down) 
        this.player.body.velocity.y = -250;
}
  • 其余方法:重新开始以及销毁奖励物品。奖励物品同地面类似,是用组来管理的,因此默认拥有kill方法来销毁自身。
main.restart = function(){      game.state.start('Main');       }
main.getCoin = function(player, coin){     coin.kill();     }

链接

GitHub

后记

这个游戏虽然简单,但是涉及到了开发一个html5小游戏的各个方面。游戏开发是一条很长远的路,其中每一点都可以进行深入地研究和扩展。就此游戏而言,可以加入记分系统,更改地面及墙壁障碍的位置来生成关卡,还可以给主角添加动画效果,加入音效提升游戏体验等等。这些都是要慢慢扩展出来的。想法是要实现出来的。在实现的过程中,有时会触发更多灵感,但更多的是向现实妥协,舍弃掉一些东西,然而这样才是真正的成长。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容