用Phaser来制作一个html5游戏——flappy bird (一)
2014-06-16 07:41
295 查看
phaser.js的源码可以到它在
<!DOCTYPEhtml> <html> <head> <metacharset="utf-8"/> <title>game</title> <scriptsrc="js/phaser.js"></script> </head> <body> <divid="game"></div> <script> vargame=newPhaser.Game(288,505,Phaser.AUTO,'game');//实例化一个Phaser的游戏实例 </script> </body> </html>
我们来看看Phaser.Game这个函数都有哪些参数:
Phaser.Game(width,height,renderer,parent,state,transparent,antialias,physicsConfig)
width:游戏的宽度,也就是用来渲染游戏的canvas的宽度,单位为px
height:游戏的高度,也就是用来渲染游戏的canvas的高度,单位为px
renderer:使用哪种渲染方式,Phaser.CANVAS为使用html5画布,Phaser.WEBGL为使用性能更加好的WebGL来渲染,Phaser.AUTO为自动侦测,如果浏览器支持WebGL则使用WebGL,否则使用Canvas
parent:用来放置canvas元素的父元素,可以是一个元素id,也可以是dom元素本身,phaser会自动创建一个canvas并插入到这个元素中。
state:state可以理解为场景,在这里指定state表示让游戏首先加载这个场景,但也可以不在这里指定state,而在之后的代码中决定首先加载哪个state。关于state我后面还会有详细的说明。
transparent:是否使用透明的canvas背景
antialias:是否启用抗锯齿
physicsConfig:游戏物理系统配置参数
以上所有参数都是可选的,它们的默认值以及更详细的信息可以
实例化Game对象后,接下来要做的就是创建游戏会用到的各种场景了,也就是上面说的state,那么怎么才能创建一个state呢?state可以是一个js自定义对象,也可以是一个函数,只要它们存在preload、create、update这三个方法中的任意一个,就是一个合法的state。
//state可以是一个自定义对象 varstate1={ preload:function(){}, create:function(){}, update:function(){} } //state也可以是一个构造函数 varstate2=function(){ this.preload=function(){}; this.create=function(){}; this.update=function(){}; } //只要存在preload、create、update三个方法中的一个就可以了 varstate3=function(){ this.update=function(){}; } //当然state里也可以存在其他属性或方法 varstate4=function(){ this.create=function(){}; this.aaa=function(){};//其他方法 this.bbb='hello';//其他属性 }
其中的preload方法,是用来加载资源的,它会最先执行。create方法是用来初始化以及构建场景的,它要等到在preload里加载的资源全部加载完成后才执行。最后update方法是更新函数,它会在游戏的每一帧都执行,以此来创造一个动态的游戏。
在这个游戏中,我们会用到4个state,我们可以通过game.state.add()方法来给游戏添加state,然后用game.state.start()方法来调用state,详细信息请看
vargame=newPhaser.Game(288,505,Phaser.AUTO,'game'); game.States={};//创建一个对象来存放要用到的state game.State.boot=function(){...}//boot场景,用来做一些游戏启动前的准备 game.State.prelaod=function(){...}//prelaod场景,用来显示资源加载进度 game.State.menu=function(){...}//menu场景,游戏菜单 game.State.play=function(){...}//play场景,正式的游戏部分 //把定义好的场景添加到游戏中 game.state.add('boot',game.States.boot); game.state.add('preload',game.States.preload); game.state.add('menu',game.States.menu); game.state.add('play',game.States.play); //调用boot场景来启动游戏 game.state.start('boot');
制作资源加载进度条
游戏要用到的一些图片、声音等资源都需要提前加载,有时候如果资源很多,就有必要做一个资源加载进度的页面,提高用户等待的耐心。这里我们用一个state来实现它,命名为preload。
因为资源加载进度条需要一个进度条的背景图片,所以在制作这个state前,我们还需要另一个最基础的state,用来加载那张进度条图片,我们命名为boot。
game.States.boot=function(){
this.preload=function(){
game.load.image('loading','assets/preloader.gif');//加载进度条图片资源
};
this.create=function(){
game.state.start('preload');//加载完成后,调用preload场景
};
}
Phaser中资源的加载都是通过
在preload这个场景中,我们需要把游戏后面会用到的所有资源都进行加载,然后还要展示一个加载进度条给用户看。Loader对象提供了一个
game.States.preload=function(){
this.preload=function(){
varpreloadSprite=game.add.sprite(50,game.height/2,'loading');//创建显示loading进度的sprite
game.load.setPreloadSprite(preloadSprite);//用setPreloadSprite方法来实现动态进度条的效果
//以下为要加载的资源
game.load.image('background','assets/background.png');//游戏背景图
game.load.image('ground','assets/ground.png');//地面
game.load.image('title','assets/title.png');//游戏标题
game.load.spritesheet('bird','assets/bird.png',34,24,3);//鸟
game.load.image('btn','assets/start-button.png');//按钮
game.load.spritesheet('pipe','assets/pipes.png',54,320,2);//管道
game.load.bitmapFont('flappy_font','assets/fonts/flappyfont/flappyfont.png','assets/fonts/flappyfont/flappyfont.fnt');//显示分数的字体
game.load.audio('fly_sound','assets/flap.wav');//飞翔的音效
game.load.audio('score_sound','assets/score.wav');//得分的音效
game.load.audio('hit_pipe_sound','assets/pipe-hit.wav');//撞击管道的音效
game.load.audio('hit_ground_sound','assets/ouch.wav');//撞击地面的音效
game.load.image('ready_text','assets/get-ready.png');//getready图片
game.load.image('play_tip','assets/instructions.png');//玩法提示图片
game.load.image('game_over','assets/gameover.png');//gameover图片
game.load.image('score_board','assets/scoreboard.png');//得分板
}
this.create=function(){
game.state.start('menu');//当以上所有资源都加载完成后就可以进入menu游戏菜单场景了
}
}
上面我们提到了
制作游戏菜单页面
资源加载完成后就该进入到游戏菜单页面了,说是菜单页,但我们这里只是提供一个开始游戏的按钮而已,作为教程就别搞那么复杂啦。做好后的效果如下:
下面我们就来实现这个页面。
首先是背景图与地面,我们看到这两个东西是会动的,地面移动动的速度快一些,背景图慢一些,在Phaser中有专门的东西来处理这种效果,叫做
game.States.menu=function(){
this.create=function(){
varbg=game.add.tileSprite(0,0,game.width,game.height,'background');//当作背景的tileSprite
varground=game.add.tileSprite(0,game.height-112,game.width,112,'ground').autoScroll(-100,0);//当作地面的tileSprite
bg.autoScroll(-10,0);//让背景动起来
ground.autoScroll(-100,0);//让地面动起来
}
}
然后来制作游戏标题,游戏标题flappybird这几个字是一张图片,然后那个鸟是一个sprite,并且我们在sprite上执行了动画,使它的翅膀看起来是在动的。我要说的是怎么在sprite对象上实现动画。首先在加载鸟的图片时,我们加载的不当当就是一张鸟的图片,我们加载的是一个这样的图片:
我们看到这张图片有三只鸟,更确切的说是一只鸟的三个状态,或者说是动画中的三个帧。那我们怎样让他变成动画呢?在
spritesheet(key,url,frameWidth,frameHeight,frameMax,margin,spacing)
key:给这张图片指定的名称,以后在创建sprite等对象时会要用到的
url:图片的地址
frameWidth:图片中每帧的宽度
frameHeight:图片中每帧的高度
frameMax:最多有几帧
margin:每帧的外边距
spacing:每帧之间的间隔
我们上面那张鸟的图片,每一个鸟的宽高分别是34px和24px,所以frameWidth应该是34,frameHeight是24,然后我们这个动画有三帧,frameMax为3,帧与帧之间没有间隙,margin与spacing都为0。实际上spritesheet方法就是能让我们加载一个图片,并在这个图片上划分出帧来,以后使用这个图片的sprite就可以用这些帧来播放动画啦。要在sprite上实现动画,我们首先还得先定义一个动画,就是定义这个动画是由哪些帧组成的。sprite对象有个
下面再说一个非常重要的对象:
game.States.menu=function(){
this.create=function(){
......
vartitleGroup=game.add.group();//创建存放标题的组
titleGroup.create(0,0,'title');//通过组的create方法创建标题图片并添加到组里
varbird=titleGroup.create(190,10,'bird');//创建bird对象并添加到组里
bird.animations.add('fly');//给鸟添加动画
bird.animations.play('fly',12,true);//播放动画
titleGroup.x=35;//调整组的水平位置
titleGroup.y=100;//调整组的垂直位置
game.add.tween(titleGroup).to({y:120},1000,null,true,0,Number.MAX_VALUE,true);//对这个组添加一个tween动画,让它不停的上下移动
}
}
上面代码中的Tween对象,是专门用来实现补间动画的。通过game.add的tween方法得到一个Tween对象,这个方法的参数是需要进行补间动画的物体。然后我们可以使用Tween对象的to方法来实现补间动画。
to(properties,duration,ease,autoStart,delay,repeat,yoyo)
properties:一个js对象,里面包含着需要进行动画的属性,如上面代码中的{y:120}
duration:补间动画持续的时间,单位为毫秒
ease:缓动函数,默认为匀速动画
autoStart:是否自动开始
delay:动画开始前的延迟时间,单位为毫秒
repeat:动画重复的次数,如果需要动画永远循环,则把该值设为Number.MAX_VALUE
yoyo:如果该值为true,则动画会自动反转
最后是添加一个开始游戏的按钮。Phaser提供了
game.States.menu=function(){
this.create=function(){
......
varbtn=game.add.button(game.width/2,game.height/2,'btn',function(){//添加一个按钮
game.state.start('play');//点击按钮时跳转到play场景
});
btn.anchor.setTo(0.5,0.5);//设置按钮的中心点
}
}
Phaser中很多对象都有一个anchor属性,它表示这个物体的中心点,物体的位置平移、旋转的轴,都是以这个中心点为参照的。所以上面代码中我们要使按钮水平垂直居中,除了要把按钮的x,y属性分别设为游戏的宽高的一半外,还要把按钮的中心点设为按钮的中心。
最后我们把所有代码合起来,得到了menu这个state的最终代码,该state只需要一个create方法就行了:
game.States.menu=function(){
this.create=function(){
game.add.tileSprite(0,0,game.width,game.height,'background').autoScroll(-10,0);//背景图
game.add.tileSprite(0,game.height-112,game.width,112,'ground').autoScroll(-100,0);//地板
vartitleGroup=game.add.group();//创建存放标题的组
titleGroup.create(0,0,'title');//标题
varbird=titleGroup.create(190,10,'bird');//添加bird到组里
bird.animations.add('fly');//添加动画
bird.animations.play('fly',12,true);//播放动画
titleGroup.x=35;
titleGroup.y=100;
game.add.tween(titleGroup).to({y:120},1000,null,true,0,Number.MAX_VALUE,true);//标题的补间动画
varbtn=game.add.button(game.width/2,game.height/2,'btn',function(){//按钮
game.state.start('play');
});
btn.anchor.setTo(0.5,0.5);
}
}
第二部分教程:
相关文章推荐
- 用Phaser来制作一个html5游戏——flappy bird (二)
- 用Phaser来制作一个html5游戏——flappy bird (二)
- 用Phaser来制作一个html5游戏——flappy bird (一)
- 用html5 Canvas制作一个简单的游戏 英雄抓小怪物(中)
- 怎样用HTML5 Canvas制作一个简单的游戏
- 借助HTML5 Canvas API制作一个简单的猜字游戏
- 怎样用HTML5 Canvas制作一个简单的游戏
- [译]怎样用HTML5 Canvas制作一个简单的游戏
- 用html5和js制作一个游戏启动界面(html5游戏开发一)、
- 怎样用HTML5 Canvas制作一个简单的游戏
- 用html5 Canvas制作一个简单的游戏 英雄抓小怪物(上)
- 制作了一个游戏,先放上截图吧。
- (译)如何使用GameCenter制作一个简单的多人游戏教程:第二部分
- (译)如何使用cocos2d制作一个塔防游戏:第二部分
- 我的一个全新html5游戏
- 一个JS的RPG引擎,备忘,准备写个html5的动作游戏
- (译)如何使用cocos2d制作一个滑动图片游戏教程:第二部分(完)
- HTML5游戏制作完全指南
- (译)如何使用cocos2d制作一个塔防游戏:引子
- (译)如何制作一个类似tiny wings的游戏:第二部分(完)