complete_project 源碼分析 知識點總結


項目鏈接:https://github.com/cocos-creator/tutorial-first-game/tree/master/complete_project



1.this全局變量和let局部變量的使用
在這裏插入圖片描述
修改後的代碼

// 使用let局部變量
let jumpAction = this.setJumpAction();
this.node.runAction(jumpAction);



2.腳本文件裏的屬性和方法應該嚴格地歸類好
在這裏插入圖片描述
如果把Game.js裏面的getNewStarPosition()方法寫到Star.js當中,會更好理解以及便於維護

在這裏插入圖片描述
在Star.js當中,按照常理,是主角去撿星星,而不是星星等待主角過來,所以我覺得pickRadius屬性以及getPlayerDistance和onPicked方法可以寫在Player.js


3.如果不是經常修改的屬性,儘量不要顯式地暴露出來
在這裏插入圖片描述
通常數值系統策劃好了,就不要隨意地更改數值,腳本屬性暴露出來,很容易一不小心就隨意修改數值,但是寫到代碼裏的數據就不容易被隨意修改。


4.預製資源使用場合

什麼時候會用到預製資源?通常在需要通過程序來動態地生成節點資源時會使用到。


5.在星星組件上暫存 Game 對象的引用

newStar.getComponent('Star').game = this;

通過Node對象調用getComponent()方法,返回的是一個Component類型的對象,組件對象也稱腳本對象。巧妙之處,通過腳本對象調用game屬性,從而爲Star腳本文件添加了一個全局變量game,使得Star腳本也可以訪問Game腳本里面所有的屬性和方法


6.停止並且移除所有正在運行的動作列表

//停止 player 節點的跳躍動作
this.player.stopAllActions();



7.通過回調函數來執行音頻播放

// 添加一個回調函數,用於在動作結束時調用我們定義的其他方法
var callback = cc.callFunc(this.playJumpSound, this);

// 不斷重複,而且每次完成落地動作後調用回調來播放聲音
cc.repeatForever(cc.sequence(jumpUp, jumpDown, callback));



8.不同腳本組件調用onload方法時互不影響
在這裏插入圖片描述
在這裏插入圖片描述
Game.js執行生成星星操作與Player.js執行主角跳躍動作互補干擾


9.初始化鍵盤輸入監聽

// 初始化鍵盤輸入監聽
cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this);
cc.systemEvent.on(cc.SystemEvent.EventType.KEY_UP, this.onKeyUp, this);  

onDestroy () {
// 結束遊戲之後,取消鍵盤輸入監聽
cc.systemEvent.off(cc.SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this);
cc.systemEvent.off(cc.SystemEvent.EventType.KEY_UP, this.onKeyUp, this);
},  

cc.systemEvent.on();註冊事件目標的特定事件類型回調

cc.systemEvent.off();刪除之前用同類型,回調,目標或 useCapture 註冊的事件監聽器,如果只傳遞 type,將會刪除 type 類型的所有事件監聽器


10.event參數傳遞
在這裏插入圖片描述
通過event參數傳遞,可以獲得有關鍵盤相關按鍵的信息



11.通過數學運算來判斷正負值
在這裏插入圖片描述
巧妙之處this.xSpeed / Math.abs(this.xSpeed),通過數學運算方法來判斷速度爲正還是爲負,就不需要通過this.accLeft和this.accRight屬性來判斷速度的正負值,節省代碼


12.return的作用
在這裏插入圖片描述
巧妙使用return語句,當if條件成立時,執行return語句,結束當前update操作

return與break的不同之處,break只能結束當前循環,而return結束整個函數,return作用比break更強大些


13.計算兩點之間位置的距離

// 根據 player 節點位置判斷距離
var playerPos = this.game.player.getPosition();
// 根據兩點位置計算兩點之間距離
var dist = this.node.position.sub(playerPos).mag();

vec2.sub();向量減法

vec2.mag();返回該向量的長度

通過sub向量減法來計算兩點之間位置的距離,比物理碰撞算法還要簡單方便


14.cc.repeatForever()、cc.sequence()
在這裏插入圖片描述
cc.repeatForever();永遠地重複一個動作,有限次數內重複一個動作請使用 repeat 動作,由於這個動作不會停止,所以不能被添加到 cc.sequence 或 cc.spawn 中

cc.sequence();順序執行動作,創建的動作將按順序依次運行


15.cc.macro.KEY
在這裏插入圖片描述
cc.macro.KEY;鍵盤事件的按鍵值


16.播放聲音

// 調用聲音引擎播放聲音
cc.audioEngine.playEffect(this.jumpAudio, false);




17.runAction

// 初始化跳躍動作
let jumpAction = this.setJumpAction();
this.node.runAction(jumpAction);

node.runAction();執行並返回該執行的動作。該節點將會變成動作的目標。調用 runAction 時,節點自身處於不激活狀態將不會有任何效果

注意:你不應該修改 runAction 後的動作,將無法發揮作用,如果想進行修改,請在定義 action 時加入。


18.moveBy和moveTo的區別

你能注意到,每一個動作都會有兩個方法 By 和 To。兩種方法方便你在不同的情況使用,By 算的是相對於節點對象的當前位置,To 算的是絕對位置,不考慮當前節點對象在哪。如果你想動作的表現是相對於 Node 當前位置的,就用 By,相對的想讓動作的表現是按照座標的絕對位置就用 To

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章