最近公司作項目的時候正好使用到phaser,在這裏作一下本身整理出來的一些心得,方便你們參考,phaser這一個遊戲引擎一般是作2d遊戲的,入門也很是簡單,只需你會一點的javascript,可是你想作一個比較完美的遊戲的話,那麼光靠一點點的javascript是遠遠不夠的,本篇博客將快速帶你入門phaser。javascript
phaser是一款快速,免費及開源HTML5遊戲框架,它支持WebGL和Canvas兩種渲染模式,能夠在任何web瀏覽器環境下運行,遊戲能夠經過第三方工具轉爲iOS、Android 支持的 Native APP,容許使用 JavaScript 和 TypeScript 進行開發。html
phaser中的一切都是從Game類開始,因此咱們暫時將Game類看成phaser的中心吧!當你new了一個Game以後,game中的不少屬性就有了,phaser的核心能夠用以下這張圖表示。java
這裏咱們常用的對象有load,time,world,input,camera。git
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>快速入門phaser</title> </head> <body> <script src="../../js/phaser.min.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var game=new Phaser.Game(800,600,Phaser.AUTO,'',{preload:preload,create:create,update:update}); function preload(){ console.log('preload'); } function create(){ console.log('create'); } function update(){ console.log('update'); } </script> </body> </html>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>快速入門phaser<</title> </head> <body> <script src="../../js/phaser.min.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var game=new Phaser.Game(800,600,Phaser.AUTO); var main=function(game){ this.init=function(){ //遊戲場景初始化 } this.preload=function(){ //遊戲資源預加載 } this.create=function(){ //遊戲場景建立 } this.update=function(){ //遊戲邏輯實現 } this.render=function(){ //遊戲自定義渲染 } } </script> </body> </html>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>快速入門phaser</title> </head> <body> <script src="../../js/phaser.min.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var game=new Phaser.Game(800,600,Phaser.AUTO); game.state.add('state',state); game.state.start('state'); function state(){ this.init=function(){} this.preload=function(){} this.create=function(){} this.update=function(){} this.render=function(){} } </script> </body> </html>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>快速入門phaser</title> </head> <body> <script src="../../js/phaser.min.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var game=new Phaser.Game(800,600,Phaser.AUTO,state); function state(){ this.init=function(){ } this.preload=function(){ } this.create=function(){ } this.update=function(){ } this.render=function(){ } } </script> </body> </html>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>快速入門phasr</title> </head> <body> <script src="../../js/phaser.min.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var config={ width:800, height:600, renderer:Phaser.AUTO, antialias:true, multiTexture:true, state:{ preload:preload, create:create, update:update } } var game=new Phaser.Game(config); function preload(){ } function create(){ } function update(){ } </script> </body> </html>
在開發中,咱們常用方式五建立phaser對象,固然你也能夠根據本身的喜愛選擇,就看你是喜歡函數建立仍是對象建立。github
Name | Type | Default |
width:遊戲寬度 | number|string | 800 |
height:遊戲高度 | number|string | 600 |
renderer:遊戲渲染方式 | number | Phaser.AUTO |
parent:遊戲容器 | string|HTMLElement | '' |
state:遊戲默認場景 | object | null |
transparent:畫布元素是否透明 | boolean | false |
antialias:是否開啓抗鋸齒 | boolean | true |
physicsConfig:物理引擎配置 | object | null |
畫布寬度,數字或字符串類型可選參數,默認爲800,若是以字符串的形式給出,該值必須在0到100之間,爲百分比,若是沒有指定父容器,則默認爲瀏覽器窗口web
畫布高度canvas
指定渲染機制,值能夠是Phaser.WebGL,Phaser.Canvas,Phaser.AUTO(自動嘗試使用WebGL,若是瀏覽器或設備不支持,使用canvas)或者Phaser.HEADLESS(不進行渲染)瀏覽器
想插入遊戲畫布的DOM元素,畫布的父元素,可選值爲DOM自己或者是id,若是爲空字符串,畫布將被插入到body元素中框架
默認的狀態對象,對象類型,能夠是null,也能夠是Phaser.state函數(初始化,預加載,建立,更新,渲染)dom
畫布背景是否透明,布爾值,默認爲false
是否繪製爲平滑紋理,布爾值,默認爲true
一個物理配置對象,在Physics world建立時傳遞,對象默認爲null
參考文檔:https://photonstorm.github.io/phaser-ce/Phaser.Game.html
中文網:http://www.phaserengine.com/
phaser小站:https://www.phaser-china.com/example-detail-422.html
社區:http://club.phaser-china.com/
接下來咱們經過phaser實現一個小遊戲以及快速入門,見識下phaser開發遊戲的功能有多麼的強大,須要說明的是,這個就是phaser官方入門的案例,廢話很少說,直接上源碼。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>phaser入門小遊戲</title> </head> <body> <script src="../../js/phaser.min.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var config={ width:800, height:600, renderer:Phaser.AUTO, antialias:true, multiTexture:true, state:{ preload:preload, create:create, update:update, } } var game=new Phaser.Game(config); function preload(){ //加載資源 } function create(){ //對象的建立及初始化 } function update(){ //遊戲主循環 } </script> </body> </html>
在這裏,咱們已經建立了遊戲場景和加載了遊戲場景,可是咱們看到一片黑的,接下來咱們加點東西。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>phaser入門小遊戲</title> </head> <body> <script src="../../js/phaser.min.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var config={ width:800, height:600, renderer:Phaser.AUTO, antialias:true, multiTexture:true, state:{ preload:preload, create:create, update:update, } } var game=new Phaser.Game(config); function preload(){ //加載資源 game.load.image('sky','../../assets/sky.png'); game.load.image('ground','../../assets/star.png'); game.load.image('star','../../assets/star.png'); game.load.spritesheet('dude','../../assets/dude.png',32,48); } function create(){ //對象的建立及初始化 game.add.sprite(0,0,'star'); } function update(){ //遊戲主循環 } </script> </body> </html>
咱們看到屏幕的左上角出現了一顆星星,可是仍是缺點什麼,這種效果依然不是咱們想要的效果,接下來咱們讓它更具體化。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>phaser入門小遊戲</title> </head> <body> <script src="../../js/phaser.min.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var config={ width:800, height:600, renderer:Phaser.AUTO, antialias:true, multiTexture:true, state:{ preload:preload, create:create, update:update, } } var game=new Phaser.Game(config); var platforms;//場地 function preload(){ //加載資源 game.load.image('sky','../../assets/sky.png'); game.load.image('ground','../../assets/platform.png'); game.load.image('star','../../assets/star.png'); game.load.spritesheet('dude','../../assets/dude.png',32,48); } function create(){ //對象的建立及初始化 game.physics.startSystem(Phaser.Physics.ARCADE); game.add.sprite(0,0,'sky'); //將圖片添加到遊戲場景中 platforms=game.add.group(); platforms.enableBody=true; var ground=platforms.create(0,game.world.height-64,'ground'); ground.scale.setTo(2,2); ground.body.immovable=true; var ledge=platforms.create(400,400,'ground'); ledge.body.immovable=true; ledge=platforms.create(-150,250,'ground'); ledge.body.immovable=true; } function update(){ //遊戲主循環 } </script> </body> </html>
在這裏咱們已經將場景加入進來了以及開啓了物理引擎,固然這只是爲後面作準備,而後咱們建立了天空,大地和兩個平板。大地和平板的位置定位,咱們是經過座標來進行的,
其中,大地和兩個平板都被加到了platforms這個組中,這個組咱們爲它啓動了物理屬性,而後咱們設置了大地和兩個平板是不能動的,這樣他們就不會因爲撞擊被改變位置。接下來,咱們來加入一個小人,這個小人也是咱們遊戲的主角。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>phaser入門小遊戲</title> </head> <body> <script src="../../js/phaser.min.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var config={ width:800, height:600, renderer:Phaser.AUTO, antialias:true, multiTexture:true, state:{ preload:preload, create:create, update:update, } } var game=new Phaser.Game(config); var platforms;//場地 var player;//遊戲主角 function preload(){ //加載資源 game.load.image('sky','../../assets/sky.png'); game.load.image('ground','../../assets/platform.png'); game.load.image('star','../../assets/star.png'); game.load.spritesheet('dude','../../assets/dude.png',32,48); } function create(){ //對象的建立及初始化 game.physics.startSystem(Phaser.Physics.ARCADE); game.add.sprite(0,0,'sky'); //夾圖片添加到遊戲場景中 platforms=game.add.group(); platforms.enableBody=true; var ground=platforms.create(0,game.world.height-64,'ground'); ground.scale.setTo(2,2); ground.body.immovable=true; var ledge=platforms.create(400,400,'ground'); ledge.body.immovable=true; ledge=platforms.create(-150,250,'ground'); ledge.body.immovable=true; //加載主角 player=game.add.sprite(32,game.world.height-150,'dude'); game.physics.arcade.enable(player); player.body.bounce.y=0.2; //設置主角的彈性 player.body.gravity.y=300; //設置主角的重力 player.body.collideWorldBounds=true; player.animations.add('left',[0,1,2,3],10,true); //設置主角向左方向的序列幀 player.animations.add('right',[5,6,7,8],10,true); //設置主角向右方向的序列幀 } function update(){ //遊戲主循環 } </script> </body> </html>
dude.png圖片
一樣是經過game.add.sprite將精靈加入進來,可是你們仔細看看dude.png這張資源圖片,這是一個幀動畫序列,裏面包含了主角左移和右移的動畫幀。咱們一樣給它開啓了物理屬性,而後設置了它的彈性和重力。player.body.collideWorldBounds = true;這句話設置了它會與邊界進行碰撞,這就是爲何主角落下的時候,到遊戲區域邊界就不會掉下去,你們能夠把這句話註釋掉再運行,看看會是什麼狀況。在這裏,咱們還爲小人添加了兩個動畫,一個是向左移動,一個是向右移動,分別指定了響應的動畫幀,這也是爲後續的動畫作準備。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>phaser入門小遊戲</title> </head> <body> <script src="../../js/phaser.min.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var config={ width:800, height:600, renderer:Phaser.AUTO, antialias:true, multiTexture:true, state:{ preload:preload, create:create, update:update, } } var game=new Phaser.Game(config); var platforms;//場地 var player;//遊戲主角 function preload(){ //加載資源 game.load.image('sky','../../assets/sky.png'); game.load.image('ground','../../assets/platform.png'); game.load.image('star','../../assets/star.png'); game.load.spritesheet('dude','../../assets/dude.png',32,48); } function create(){ //對象的建立及初始化 game.physics.startSystem(Phaser.Physics.ARCADE); game.add.sprite(0,0,'sky'); //夾圖片添加到遊戲場景中 platforms=game.add.group(); platforms.enableBody=true; var ground=platforms.create(0,game.world.height-64,'ground'); ground.scale.setTo(2,2); ground.body.immovable=true; var ledge=platforms.create(400,400,'ground'); ledge.body.immovable=true; ledge=platforms.create(-150,250,'ground'); ledge.body.immovable=true; //加載主角 player=game.add.sprite(32,game.world.height-150,'dude'); game.physics.arcade.enable(player); player.body.bounce.y=0.2; //設置主角的彈性 player.body.gravity.y=300; //設置主角的重力 player.body.collideWorldBounds=true; player.animations.add('left',[0,1,2,3],10,true); //設置主角向左方向的序列幀 player.animations.add('right',[5,6,7,8],10,true); //設置主角向右方向的序列幀 } function update(){ //遊戲主循環 game.physics.arcade.collide(player,platforms); } </script> </body> </html>
是否是很驚訝?要讓主角站在地上,只要在update中加上一句,game.physics.arcade.collide(player, platforms);就能夠了,這句話表示,檢測主角與platforms組的碰撞,而大地正是在platforms組中,這樣,主角就不會穿過大地了。一樣地,當主角與兩個平板碰撞時,也不會穿過了。接下來咱們讓主角運動。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>phaser入門小遊戲</title> </head> <body> <script src="../../js/phaser.min.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var config={ width:800, height:600, renderer:Phaser.AUTO, antialias:true, multiTexture:true, state:{ preload:preload, create:create, update:update, } } var game=new Phaser.Game(config); var platforms;//場地 var player;//遊戲主角 var cursors;//控制鍵 function preload(){ //加載資源 game.load.image('sky','../../assets/sky.png'); game.load.image('ground','../../assets/platform.png'); game.load.image('star','../../assets/star.png'); game.load.spritesheet('dude','../../assets/dude.png',32,48); } function create(){ //對象的建立及初始化 game.physics.startSystem(Phaser.Physics.ARCADE); game.add.sprite(0,0,'sky'); //夾圖片添加到遊戲場景中 platforms=game.add.group(); platforms.enableBody=true; var ground=platforms.create(0,game.world.height-64,'ground'); ground.scale.setTo(2,2); ground.body.immovable=true; var ledge=platforms.create(400,400,'ground'); ledge.body.immovable=true; ledge=platforms.create(-150,250,'ground'); ledge.body.immovable=true; //加載主角 player=game.add.sprite(32,game.world.height-150,'dude'); game.physics.arcade.enable(player); player.body.bounce.y=0.2; //設置主角的彈性 player.body.gravity.y=300; //設置主角的重力 player.body.collideWorldBounds=true; player.animations.add('left',[0,1,2,3],10,true); //設置主角向左方向的序列幀 player.animations.add('right',[5,6,7,8],10,true); //設置主角向右方向的序列幀 //建立控制鍵對象 cursors=game.input.keyboard.createCursorKeys(); } function update(){ //遊戲主循環 game.physics.arcade.collide(player,platforms); //控制主角開始 player.body.velocity.x=0; if(cursors.left.isDown){ player.body.velocity.x=-150; player.animations.play('left');//播放主角向左運動的序列幀動畫 }else if(cursors.right.isDown){ player.body.velocity.x=150; player.animations.play('right');//播放主角向右的序列幀動畫 }else{ player.animations.stop();//中止動畫 player.frame=4; //小球靜止時顯示第四幀動畫 } if(cursors.up.isDown&&player.body.touching.down){ player.body.velocity.y=-350; } } </script> </body> </html>
咱們但願讓主角在按下方向左鍵的時候,向左移動,按下方向右鍵的時候,向右移動,爲了實現這一功能,咱們又定義了一個cursors,咱們經過cursors = game.input.keyboard.createCursorKeys();來獲取系統的鍵盤輸入對象。而後,咱們在update中,經過cursors.left.isDown來判斷用戶是否按下了鍵盤左鍵,若是按下了,咱們給主角設置一個速度,而後播放左移的動畫,方向右鍵的邏輯是同樣的。若是方向左鍵和右鍵都沒有按下,那麼咱們就經過player.frame來設置小人停在第4幀。小人的跳躍是經過方向上鍵來實現的,可是這裏有一個條件,就是小人在空中的時候,不容許跳躍,因此,加上了一個player.body.touching.down的判斷條件。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>phaser入門小遊戲</title> </head> <body> <script src="../../js/phaser.min.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var config={ width:800, height:600, renderer:Phaser.AUTO, antialias:true, multiTexture:true, state:{ preload:preload, create:create, update:update, } } var game=new Phaser.Game(config); var platforms;//場地 var player;//遊戲主角 var cursors;//控制鍵 var stars;//星星 function preload(){ //加載資源 game.load.image('sky','../../assets/sky.png'); game.load.image('ground','../../assets/platform.png'); game.load.image('star','../../assets/star.png'); game.load.spritesheet('dude','../../assets/dude.png',32,48); } function create(){ //對象的建立及初始化 game.physics.startSystem(Phaser.Physics.ARCADE); game.add.sprite(0,0,'sky'); //夾圖片添加到遊戲場景中 platforms=game.add.group(); platforms.enableBody=true; var ground=platforms.create(0,game.world.height-64,'ground'); ground.scale.setTo(2,2); ground.body.immovable=true; var ledge=platforms.create(400,400,'ground'); ledge.body.immovable=true; ledge=platforms.create(-150,250,'ground'); ledge.body.immovable=true; //加載主角 player=game.add.sprite(32,game.world.height-150,'dude'); game.physics.arcade.enable(player); player.body.bounce.y=0.2; //設置主角的彈性 player.body.gravity.y=300; //設置主角的重力 player.body.collideWorldBounds=true; player.animations.add('left',[0,1,2,3],10,true); //設置主角向左方向的序列幀 player.animations.add('right',[5,6,7,8],10,true); //設置主角向右方向的序列幀 //建立控制鍵對象 cursors=game.input.keyboard.createCursorKeys(); //加載星星 stars=game.add.group(); //把星星先添加到組中 stars.enableBody = true; for(var i=0;i<20;i++){ var star=stars.create(i*70,0,'star'); star.body.gravity.y=300; //設置星星的重力 star.body.bounce.y=0.7+Math.random()*0.2; //設置星星的彈性 } } function update(){ //遊戲主循環 game.physics.arcade.collide(player,platforms); //星星加載相關 game.physics.arcade.collide(stars,platforms); game.physics.arcade.overlap(player,stars,collectStar,null,this); //控制主角開始 player.body.velocity.x=0; if(cursors.left.isDown){ player.body.velocity.x=-150; player.animations.play('left');//播放主角向左運動的序列幀動畫 }else if(cursors.right.isDown){ player.body.velocity.x=150; player.animations.play('right');//播放主角向右的序列幀動畫 }else{ player.animations.stop();//中止動畫 player.frame=4; //小球靜止時顯示第四幀動畫 } if(cursors.up.isDown&&player.body.touching.down){ player.body.velocity.y=-350; } } function collectStar(player,stars){ stars.kill();//銷燬星星 } </script> </body> </html>
在create中,咱們又建立了一個stars的組,在這個組中,添加了星星,而後設置了它們的重力,隨機設置了彈性,因此它們掉落的時候,碰到平板或者地面,會彈起不一樣的高度。一樣,星星也不能穿過地面,因此在update中,添加了碰撞檢測。
還有一層碰撞檢測就是小人和星星的碰撞,當主角和星星發生碰撞的時候,須要讓星星消失,這時候,再添加碰撞檢測的時候,咱們還添加了一個回調函數collectStar,在這裏面,咱們的player和star都會做爲參數傳遞進來,經過調用star.kill();將星星銷燬。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>phaser入門小遊戲</title> </head> <body> <script src="../../js/phaser.min.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var config={ width:800, height:600, renderer:Phaser.AUTO, antialias:true, multiTexture:true, state:{ preload:preload, create:create, update:update, } } var game=new Phaser.Game(config); var platforms;//場地 var player;//遊戲主角 var cursors;//控制鍵 var stars;//星星 var score=0;//初始分數爲0 var scoreText;//展現分數的文本 function preload(){ //加載資源 game.load.image('sky','../../assets/sky.png'); game.load.image('ground','../../assets/platform.png'); game.load.image('star','../../assets/star.png'); game.load.spritesheet('dude','../../assets/dude.png',32,48); } function create(){ //對象的建立及初始化 game.physics.startSystem(Phaser.Physics.ARCADE); game.add.sprite(0,0,'sky'); //夾圖片添加到遊戲場景中 platforms=game.add.group(); platforms.enableBody=true; var ground=platforms.create(0,game.world.height-64,'ground'); ground.scale.setTo(2,2); ground.body.immovable=true; var ledge=platforms.create(400,400,'ground'); ledge.body.immovable=true; ledge=platforms.create(-150,250,'ground'); ledge.body.immovable=true; //加載主角 player=game.add.sprite(32,game.world.height-150,'dude'); game.physics.arcade.enable(player); player.body.bounce.y=0.2; //設置主角的彈性 player.body.gravity.y=300; //設置主角的重力 player.body.collideWorldBounds=true; player.animations.add('left',[0,1,2,3],10,true); //設置主角向左方向的序列幀 player.animations.add('right',[5,6,7,8],10,true); //設置主角向右方向的序列幀 //建立控制鍵對象 cursors=game.input.keyboard.createCursorKeys(); //加載星星 stars=game.add.group(); //把星星先添加到組中 stars.enableBody = true; for(var i=0;i<20;i++){ var star=stars.create(i*70,0,'star'); star.body.gravity.y=300; //設置星星的重力 star.body.bounce.y=0.7+Math.random()*0.2; //設置星星的彈性 } //分數相關 scoreText=game.add.text(16,16,'分數:0',{fontSize:'32px',fill:'#000'}); } function update(){ //遊戲主循環 game.physics.arcade.collide(player,platforms); //星星加載相關 game.physics.arcade.collide(stars,platforms); game.physics.arcade.overlap(player,stars,collectStar,null,this); //控制主角開始 player.body.velocity.x=0; if(cursors.left.isDown){ player.body.velocity.x=-150; player.animations.play('left');//播放主角向左運動的序列幀動畫 }else if(cursors.right.isDown){ player.body.velocity.x=150; player.animations.play('right');//播放主角向右的序列幀動畫 }else{ player.animations.stop();//中止動畫 player.frame=4; //小球靜止時顯示第四幀動畫 } if(cursors.up.isDown&&player.body.touching.down){ player.body.velocity.y=-350; } } function collectStar(player,stars){ stars.kill();//銷燬星星 score+=10; scoreText.text='分數:'+score; } </script> </body> </html>
咱們經過game.add.text爲場景加上一個文本,顯示在左上角,在collectStar的時候,將分數進行累加,而後更新顯示,這樣就結束啦。到這裏,一個簡單的小遊戲就實現了,是否是比想象中的簡單呢?