6. 判斷PC或手機dom
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); }
//定時器添加紅包 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; } }
//大地 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. 開啓物理引擎ide
//全局開啓物理引擎 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. 添加按鈕註冊點擊事件oop
//圖片按鈕可使用精靈來作,精靈能夠添加點擊事件 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);
setPreloadSprite(sprite, direction)動畫
sprite:在加載過程當中會出現的精靈或圖像。
direction:等於0精靈將被水平裁剪,等於1精靈將被垂直裁剪ui
Loader對象提供了一個 setPreloadSprite 方法,只要把一個sprite對象指定給這個方法,那麼這個sprite對象的寬度或高度就會根據當前加載的百分比自動調整,達到一個動態的進度條的效果。this
示例代碼以下:spa
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. 執行補間動畫debug
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動畫,讓它不停的上下移動
ground.body.allowGravity = false; //沒有重力,不會下沉 // ground.body.immovable = true; //不可移動 // ground.body.collideWorldBounds = true; //若是設置爲true,那麼這個對象在撞到世界的邊界時會被反彈回這個世界。設置爲false的話,對象在撞到世界邊界時會離開這個世界
//在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;