1. 遊戲畫布的尺寸
var width = game.width,
height = game.height;
2. 中心點座標
var game = new Phaser.Game(...);
var centerX = game.world.centerX,
centerY = game.world.centerY;
3. 隨機座標
var randomX = game.world.randomX,
randomY = game.world.randomY;
4. 精靈物件常用方法
var player = game.add.sprite(...);
//動畫
player.animations.add(...);
player.animations.play('');
//傾斜
player.angle = 45;
5. 基本圖形
var line = new Phaser.Line(0,0,120,120);
var circle = new Phaser.Circle(game.world.centerX,100,64);
var rect = new Phaser.Rectangle(x,y,width,height);
6. 判斷PC或手機
if(game.device.desktop){
//desktop
}
else{
//mobile
}
7. 判斷橫屏還是豎屏
if(game.scale.isLandscape){
//橫屏
game.scale.correct = true;
}
else{
//豎屏
game.scale.correct = false;
}
8. 設定全屏世界
var width = window.innerWidth 或 100%,
height = window.innerHeight 或 100%;
9. 定時器
game.time.events.loop(300,callback,this);
10. 拖曳
方法一
player.inputEnabled = true; //只能水平方向上拖動 player.input.allowVerticalDrag = false; //限制主角只能在世界中移動,不能超出螢幕 var dragRect = new Phaser.Rectangle(0,0,gWidth,gHeight); player.input.enableDrag(false,false,false,255,dragRect);
方法二
var playerW = this.player.width; //是否正在觸控 var touching = false; //監聽按下事件 game.input.onDown.add(function(pointer){ //palyer.x是主角的橫向中心,判斷是指觸控點在主角的最左側到最右側的座標範圍內, //就是點選的是小人本身,未判斷y座標 if(Math.abs(pointer.x - player.x) < player.width/2){ touching = true; } }); //監聽離開事件 game.input.onUp.add(function(){ touching = false; }); //監聽滑動事件 game.input.addMoveCallback(function(pointer,x,y,isTap){ if(!isTap && touching){ x = mid(x, playerW/2, gWidth - playerW/2); player.x = x; } }); function mid(mid,min,max){ if(typeof min === undefined || min == null){ min = Number.NEGATIVE_INFINITY; } if(typeof max == undefined || max == null){ max = Number.POSITIVE_INFINITY; } return Math.min(Math.max(min,mid),max); }
11. 物件池
//定時器新增紅包 var redgroup = this.add.group(); this.redgroup = redgroup; //全組開啟body redgroup.enableBody = true; //預先建立8個精靈物件 redgroup.createMultiple(8,'redpack'); //紅包組全體新增邊界檢測和邊界銷燬 redgroup.setAll('outOfBoundsKill',true); redgroup.setAll('checkWorldBounds',true); //定時新增紅包 game.time.events.loop(300,this.fBuildRedpack,this); //生成紅包的函式 this.fBuildRedpack = function(){ //沒有自動建立,getFirstDead和getFistExists此處等價 // var item = this.redgroup.getFirstDead(true); var item = this.redgroup.getFirstExists(false,true); var left = this.rnd.between(60,gWidth - 60); if(item){ //由於有超出邊界檢測,所以不能設定y為負值 item.reset(left,0); item.scale.set(0.5); item.body.velocity.y = 300; item.checkWorldBounds = true; item.outOfBoundsKill = true; } }
12. 用圖形繪製大地
//大地 var land = game.add.graphics(0,gHeight-127/2); land.beginFill(0xce9424); land.moveTo(0,0); land.lineTo(gWidth, 0); land.lineTo(gWidth, gHeight); land.lineTo(0,gHeight);
13. 開啟物理引擎
//全域性開啟物理引擎 this.physics.startSystem(Phaser.Physics.ARCADE); //單個物件開啟物理引擎 this.physics.arcade.enable(obj);
14. 碰撞檢測
//arcade的兩種碰撞檢測 //碰撞後的物件的消失,一般在update週期中使用overlap方法,碰撞後的回彈效果一般使用collide方法(通常在create週期中),兩種方法可以同時使用,不衝突 //有反彈碰撞 game.physics.arcade.collide(this.bird,Chimney); //無反彈碰撞,碰撞回撥中有參與碰撞的物件,可以在回撥中將物件kill掉 game.physics.arcade.overlap(this.redgroup,this.player,function(player,redpack){ redpack.kill(); },null,null,this);
15. 新增按鈕註冊點選事件
//圖片按鈕可以使用精靈來做,精靈可以新增點選事件 this.startButton = this.add.sprite(0,0,'ui','button.png'); this.startButton.anchor.set(0.5); this.startButton.x = game.world.centerX; this.startButton.y = game.height - 100; this.startButton.inputEnabled = true; this.startButton.input.useHandCursor = true; this.startButton.events.onInputDown.add(this.startGame,this);
16. 顯示載入進度條
setPreloadSprite(sprite, direction)
sprite:在載入過程中會出現的精靈或影象。
direction:等於0精靈將被水平裁剪,等於1精靈將被垂直裁剪
Loader物件提供了一個 setPreloadSprite 方法,只要把一個sprite物件指定給這個方法,那麼這個sprite物件的寬度或高度就會根據當前載入的百分比自動調整,達到一個動態的進度條的效果。
示例程式碼如下:
var game = new Phaser.Game('100%', '100%', Phaser.AUTO, 'game'); game.States = {}; game.States.boot = function() { this.preload = function() { game.load.image('loading', 'img/loading.gif'); } this.create = function() { game.state.start('preload'); } } game.States.preload = function() { this.preload = function() { var preloadSprite = game.add.sprite(game.width / 2, game.height / 2, 'loading'); preloadSprite.anchor.setTo(0.5, 0.5); //用setPreloadSprite方法來實現動態進度條的效果,preloadSprite為load的精靈 game.load.setPreloadSprite(preloadSprite); game.load.image('pipe', 'img/pipe.png'); game.load.image('startBtn', 'img/start.jpg'); game.load.image('helpBtn', 'img/help.jpg'); } this.create = function() { game.state.start('menu'); } }
17. 執行補間動畫
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,則動畫會自動反轉
示例:
game.add.tween(titleGroup).to({ y:120 },1000,null,true,0,Number.MAX_VALUE,true); //對這個組新增一個tween動畫,讓它不停的上下移動
18. 設定物體不出邊界
ground.body.allowGravity = false; //沒有重力,不會下沉 // ground.body.immovable = true; //不可移動 // ground.body.collideWorldBounds = true; //如果設定為true,那麼這個物件在撞到世界的邊界時會被反彈回這個世界。設定為false的話,物件在撞到世界邊界時會離開這個世界
19. 除錯相關
//在render週期中寫除錯程式碼 this.render = function(){ //game.debug.body用來顯示每個物體的物理輪廓,具體顯示為綠色的形狀 //對組中的每個物體開啟物理輪廓 this.redgroup.forEach(function(item){ game.debug.body(item); }); //對單個物體開啟物理輪廓 game.debug.body(this.player); //螢幕上顯示一些除錯文字 game.debug.text('CodeCaptain Shooting Demo', 10, 30); game.debug.text('Click or press space / enter to shoot', 10, 55); }
20. 對組中的元素進行統一操作
var redgroup = this.add.group(); //對組中的物體全部設定屬性 redgroup.setAll('checkWorldBounds',true); //對組中的物體全部呼叫函式 redgroup.callAll('events.onOutOfBounds.add', 'events.onOutOfBounds', this.fRemoveRedpack); //設定組中所有物體的anchor為0.5,1.0 redgroup.callAll('anchor.setTo', 'anchor', 0.5, 1.0);
21. 修改物理輪廓,即碰撞的區域
this.update = function(){ //設定小人的物理體積為高度的一半 var playerW = this.player.width, playerH = this.player.height; //由於scale 0.5的緣故,寬高設定要加倍 this.player.body.setSize(playerW*2,playerH,0,playerH); //設定方形物理輪廓,前面兩個是寬高,後面兩個是偏移 this.dragon.body.setSize(this.dragon.width, this.dragon.height / 2, 0, this.dragon.height / 2); //設定圓形物理輪廓 this.dragon.body.setCircle(this.dragon.width / 2); //恢復一下偏移為0 this.dragon.body.offset.set(0, 0); }
22. 物體超出邊界監測
1. checkWorldBounds 設定超出邊界檢測 sprite.checkWorldBounds = true; //對精靈進入邊界進行處理 sprite.events.onEnterOfBounds.add(callback,this); //對精靈離開邊界進行處理 sprite.events.onOutOfBounds.add(callback,this); 2. outOfBoundsKill //必須開啟checkWorldBound為true //超出邊界後自動kill,包括上下左右任意邊界 sprite.checkWorldBounds = true; sprite.outOfBoundsKill = true;