Phaser学习之路——飞机星战
一直想尝试html5游戏的制作,闲来无事,发现了phaser这个html5的游戏开发框架,尝试完成一个小游戏,此博文就作为自己的开发和学习的记录。
1 什么是Phaser
Phaser是一个开源的桌面和移动HTML5 2D游戏开发框架,官网地址: http://www.phaser.io/
2 环境搭建
没什么说的,官网下载phaser的js文件,html页面进行引入
3 创建项目
创建一个项目文件StarCrash,文件层级如下:
assets: 存放项目需要用到的图片,声音,字体等资源
js : 存放项目需要用到的js文件,下载的phaser.min.js 可以放在此文件夹下
index.html : 游戏页面html
4 开始搬砖
phaser代码的基本结构
var game = new Phaser.Game(320, 568, Phaser.AUTO, 'StarCrash', { preload: preload, create: create, update: update}); //加载资源 function preload() { } //创建场景 function create(){ } //更新场景 function update(){ }
加载游戏资源
function preload() { //加载资源
game.load.image('bullet', 'assets/bullet.png'); game.load.image('e_bullet', 'assets/enemy-bullet.png'); game.load.spritesheet('s_explode', 'assets/smallexplode.png',64,64); game.load.spritesheet('explode', 'assets/explode.png',128,128); game.load.image('invader', 'assets/invader.png'); game.load.image('m_invader', 'assets/invader32x32x4.png'); game.load.image('player', 'assets/player.png'); game.load.image('background', 'assets/starfield.png');
}
使用的游戏资源都为phaser demo内的图片,声音暂未添加。
创建游戏场景
使用之前加载的游戏资源对游戏对象飞机子弹,敌人子弹,爆炸动画,敌人都是以组(池)的方式进行创建,减少内存的创建和回收。监控键盘输入对飞机对象进行操作。
function create(){ //创建背景 background = game.add.tileSprite(0, 0, 320,568, 'background'); game.physics.enable(background,Phaser.Physics.ARCADE); //创建飞机 player = game.add.sprite(160, 520, 'player'); player.anchor.setTo(0.5, 0.5); game.physics.enable(player, Phaser.Physics.ARCADE); //防止飞机飞出边界 player.body.collideWorldBounds = true; //创建飞机子弹 bullets = game.add.group(); bullets.enableBody = true; bullets.physicsBodyType = Phaser.Physics.ARCADE; bullets.createMultiple(50, 'bullet'); bullets.setAll('anchor.x', 0.5); bullets.setAll('anchor.y', 1); bullets.setAll('outOfBoundsKill', true); bullets.setAll('checkWorldBounds', true); //创建敌人子弹组 ebullets = game.add.group(); ebullets.enableBody = true ; ebullets.physicsBodyType = Phaser.Physics.ARCADE; ebullets.createMultiple(30,'e_bullet'); ebullets.setAll('anchor.x',0.5); ebullets.setAll('anchor.y',1); ebullets.setAll('outOfBoundsKill', true); ebullets.setAll('checkWorldBounds', true); enemy = new Enemy(); enemy.init(); //创建爆炸动画 explosions = game.add.group(); explosions.createMultiple(30, 's_explode'); explosions.forEach(enemyExplosion, this); //得分 scoreStr = "分数:" scoreText = game.add.text(game.world.centerX,16,scoreStr + score, { font: '16px Arial', fill: '#fff' }); scoreText.anchor.setTo(0.5,0.5); //提示信息 infoText = game.add.text(game.world.centerX,game.world.centerY,' ', { font: '24px Arial', fill: '#fff' }); infoText.anchor.setTo(0.5, 0.5); infoText.visible = false; //控制 cursors = game.input.keyboard.createCursorKeys(); fireButton = game.input.keyboard.addKey(Phaser.Keyboard.SPACEBAR); }
创建敌人
创建敌人方法
//敌人 function Enemy(){ this.init = function () { //初始化创建创建敌人池 this.enemies = game.add.group(); this.enemies.enableBody = true; this.enemies.physicsBodyType = Phaser.Physics.ARCADE; this.enemies.createMultiple(50, 'invader'); this.enemies.setAll('anchor.x', 0.5); this.enemies.setAll('anchor.y', 0.5); this.enemies.setAll('outOfBoundsKill', true); this.enemies.setAll('checkWorldBounds', true); this.maxWidth = game.width - game.cache.getImage('invader').width; // 产生敌人的定时器 game.time.events.loop(Phaser.Timer.SECOND * 2, this.create, this); } //创建敌人 this.create =function(){ enemyobj = this.enemies.getFirstExists(false); if(enemyobj){ enemyobj.reset(game.rnd.integerInRange(0, this.maxWidth), game.cache.getImage('invader').height); enemyobj.body.velocity.y = 50; } } // this.crashPlayer = function(player,enemy){ enemy.kill(); playerDead(); } this.shootPlayer = function (player,ebullet) { ebullet.kill(); playerDead(); } this.fire = function () { liveEnemies.length = 0; //存活的敌人 this.enemies.forEachAlive(function (obj) { liveEnemies.push(obj); }); //获取敌人子弹 ebullet = ebullets.getFirstExists(false); if(ebullet && liveEnemies.length > 0){ //随机敌人的索引 var random=game.rnd.integerInRange(0,liveEnemies.length-1); //获取随机敌人 var ranEnemy = liveEnemies[random]; //子弹从敌人位置射出 ebullet.reset(ranEnemy.body.x + 8,ranEnemy.body.y + 16); //子弹射向飞机 game.physics.arcade.moveToObject(ebullet,player,120); EFireTimer = game.time.now + 2000; } } }
更新场景
实现背景页面的滚动,玩家的操作反馈
function update(){ // Scroll the background background.tilePosition.y += 3; player.body.velocity.setTo(0, 0); //左 if(cursors.left.isDown){ player.body.velocity.x = -200; } //右 else if (cursors.right.isDown) { player.body.velocity.x = 200; } //上 else if(cursors.up.isDown){ player.body.velocity.y = -200; } //下 else if(cursors.down.isDown){ player.body.velocity.y = 200; } // 发射子弹 if (fireButton.isDown) { fireBullet(); } //敌人发射子弹 if (game.time.now > EFireTimer) { enemy.fire(); } //飞机碰撞敌人 game.physics.arcade.overlap(enemy.enemies ,player, enemy.crashPlayer, null, this); //子弹碰撞敌人 game.physics.arcade.overlap(bullets,enemy.enemies , hitEnemy, null, this); //敌人子弹碰撞飞机 game.physics.arcade.overlap(ebullets,player,enemy.shootPlayer,null,this); }
玩家发射子弹
function fireBullet(){ if(game.time.now > bullettime){ // 获取子弹组里的第一颗子弹 bullet = bullets.getFirstExists(false); if(bullet){ bullet.reset(player.x, player.y - 8); bullet.body.velocity.y = -300; bullettime = game.time.now + 500; } } }
击中敌人
//击中敌人 function hitEnemy(bullet,enemy){ bullet.kill(); //播放爆炸动画 var explosion = explosions.getFirstExists(false); explosion.reset(enemy.body.x,enemy.body.y); explosion.play('s_explode', 10, false, true); //刷新得分 score += 1; scoreText.text = scoreStr + score; enemy.kill(); }
敌人爆炸
//敌人爆炸 function enemyExplosion(obj) { obj.anchor.x = 0.5; obj.anchor.y = 0.5; obj.animations.add('s_explode'); }
飞机爆炸
//飞机爆炸 function playerDead(){ player.kill(); //播放爆炸动画 var explosion = explosions.getFirstExists(false); explosion.reset(player.body.x,player.body.y); explosion.play('s_explode', 30, false, true); //显示游戏结束文字 infoText.text = " GAME OVER \n Click to restart"; infoText.visible = true; //点击重新开始 game.input.onTap.addOnce(restartGame,this); }
重新开始
//重新开始 function restartGame(){ //清除敌人 enemy.enemies.callAll('kill'); //清除敌人子弹 ebullets.callAll('kill'); //隐藏gameover infoText.visible = false; //刷新分数 score = 0; scoreText.text = scoreStr + score; //复活玩家 player.revive().reset(160,520); }
至此,简单的飞机游戏就完成了,有几点不足之处:
(1)没有加载声音资源
(2)未实现不同类型敌人,后续可以扩展敌人方法,增加不同敌人类型
代码比较丑陋,也是抱着学习phaser的态度,未对代码进行优化,也算是phaser的基本入门吧,游戏比较简单,后期扩展的点还是挺多的,有时间可以继续优化。
相关推荐
Adelais 2019-11-19
adeyi 2019-06-30
谷歌架构师 2019-06-28
韩吉鑫 2019-06-28
wxcmdn 2019-06-26
pengkunstone 2018-02-17
Tristahong 2018-02-24
学习编程 2017-12-12