canvas教程

Phaser实现飞机大战

字号+ 作者:H5之家 来源:H5之家 2017-11-21 13:00 我要评论( )

作者:channingbreeze 日期:2016-10-04 相信微信的飞机大战游戏,大家还记忆犹新。是的,H5的小游戏就是这样,拥有病毒性传播能力。今天,我就带着大家用phaser

Phaser实现飞机大战

来源:未知 时间:2017-11-15 14:13 阅读数: 作者:xxadmin

[导读] 作者:channingbreeze 日期:2016-10-04 相信微信的飞机大战游戏,大家还记忆犹新。是的,H5的小游戏就是这样,拥有病毒性传播能力。今天,我就带着大家用phaser来实现一款简版的飞机大战...







作者:channingbreeze

日期:2016-10-04

相信微信的飞机大战游戏,大家还记忆犹新。是的,H5的小游戏就是这样,拥有病毒性传播能力。今天,我就带着大家用phaser来实现一款简版的飞机大战游戏,除了简单的飞机大战功能,还能自定义微信的分享,一起来吧。

先给一个线上地址,大家体验一下,鼠标拖动飞机可以进行移动。。

进行简单分析之后,我们发现飞机大战主要有三个场景,开始场景,游戏中场景和结束场景。


开始场景

开始场景其实很简单,一个背景,一个飞机,一个开始按钮和一个版权说明。背景,我们使用tileSprite,因为背景移动的时候,我们要使用它的autoScroll方法。版权说明,我们直接使用image,因为它没有任何动作。飞机我们使用sprite,它有一个帧动画要播放,而按钮,我们使用button,点击的时候,跳转到游戏中场景。

game.States.main = function() {   this.create = function() {     // 背景     var bg = game.add.tileSprite(0, 0, game.width, game.height, 'background');     // 版权     this.copyright = game.add.image(12, game.height - 16, 'copyright');     // 我的飞机     this.myplane = game.add.sprite(100, 100, 'myplane');     this.myplane.animations.add('fly');     this.myplane.animations.play('fly', 12, true);     // 开始按钮     this.startbutton = game.add.button(70, 200, 'startbutton', this.onStartClick, this, 1, 1, 0);   };   this.onStartClick = function() {     game.state.start('start');   }; };

游戏中场景

游戏中场景是最复杂的一个场景,我们同样需要添加背景,添加飞机,这些和上面是一样的。然后,我们让背景开始滚动,给飞机加上一个tween动画,当动画结束的时候,开始发射子弹,显示分数,敌机也开始进入。同时,还要处理敌机被子弹打中时的逻辑,敌机爆炸的效果,以及我方被子弹打中的逻辑和我方的爆炸效果等等。所以我们一点一点来分析。

首先打开物理引擎,然后把背景加进来,让它自动滚动。然后把我们的飞机加进来,让它执行帧动画,同时设置它的碰撞规则,让它不能够超出游戏区域的边界。

在进入该场景的时候,我们让飞机直接进行一个tween动画,从中间到达底部,然后开始调用onStart。

this.create = function() {   // 物理系统   game.physics.startSystem(Phaser.Physics.ARCADE);   // 背景   var bg = game.add.tileSprite(0, 0, game.width, game.height, 'background');   bg.autoScroll(0, 20);   // 我的飞机   this.myplane = game.add.sprite(100, 100, 'myplane');   this.myplane.animations.add('fly');   this.myplane.animations.play('fly', 12, true);   game.physics.arcade.enable(this.myplane);   this.myplane.body.collideWorldBounds = true;   this.myplane.level = 2;   // 动画   var tween = game.add.tween(this.myplane).to({y: game.height - 40}, 1000, Phaser.Easing.Sinusoidal.InOut, true);   tween.onComplete.add(this.onStart, this); };


首先需要处理的就是发射子弹和鼠标拖拽。鼠标拖拽在phaser中十分简单,只要设置inputEnabled为true,然后enableDrag就行了。飞机不能拖拽出屏幕,当然,这一点我们已经在之前确保过了。

子弹的处理倒是有一定的技巧。首先要考虑的是,子弹要从飞机的首部发射出来,还得连续发射,超出边界的时候需要释放,如果一直进行子弹对象的创建和销毁,会一直进行内存的创建与回收,这样会浪费很多资源。

对于这种情况,一个比较通用的解决办法是对象池。它的原理是,先初始化一批对象,放到一个池子里,然后需要使用的时候,从池子里拿一个出来,再使用完成后,又放回池子里。这样就减少了不必要的内存创建与回收。this.mybullets.createMultiple(50, 'mybullet');就是一次性创建50个子弹,相当于一个对象池。然后我们设置该组的对象,在超过游戏边界的时候,进行回收。

this.onStart = function() {   // 我的子弹   this.mybullets = game.add.group();   this.mybullets.enableBody = true;   this.mybullets.createMultiple(50, 'mybullet');   this.mybullets.setAll('outOfBoundsKill', true);   this.mybullets.setAll('checkWorldBounds', true);   this.myStartFire = true;   this.bulletTime = 0;   // 我的飞机允许拖拽   this.myplane.inputEnabled = true;   this.myplane.input.enableDrag(false); };


敌机的逻辑和子弹其实很像,每种敌机,也都是从一个池子里拿出来,然后,当超过边界或者被子弹消灭之后,会被kill,就相当于放回池子里了。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Canvas的画图板设计与实现.doc文档

    Canvas的画图板设计与实现.doc文档

    2017-11-19 18:05

  • 如何通过HTMl5 Canvas实现圆形进度条并显示数字百分比效果?

    如何通过HTMl5 Canvas实现圆形进度条并显示数字百分比效果?

    2017-11-11 14:01

  • two.js实现动画效果

    two.js实现动画效果

    2017-11-10 16:04

  • 从零开始实现书籍翻页效果(四)

    从零开始实现书籍翻页效果(四)

    2017-11-09 15:08

网友点评