到底是有多少功能,需要使用“系統(tǒng)”來形容冤议?其實功能非常簡單斟薇,使用“系統(tǒng)”來形容開發(fā)任務(wù)能夠讓你更加“系統(tǒng)化”的去開發(fā)這個功能,你就會考慮的更加全面恕酸。例如換一種說法:添加一個小小的計分功能堪滨,那么在開發(fā)過程中,這個功能可能得不到你的重視蕊温,然后就會很隨便的寫一下椿猎,實現(xiàn)功能即可。
我以前剛學(xué)編程的時候寿弱,我會在房間門口貼著“貝爾實驗室”犯眠,因為C語言是從這里誕生的,在房間敲代碼時專注度非常高症革。
那么筐咧,分析一下該“系統(tǒng)”該如何實現(xiàn)?
首先噪矛,需要顯示分?jǐn)?shù)的地方有2個:當(dāng)前分?jǐn)?shù)和最高分?jǐn)?shù)量蕊。
然后,更新分?jǐn)?shù)的地方有3個:
游戲啟動:從存檔讀取上一次分?jǐn)?shù)艇挨,沒有則設(shè)置為0
消除時:消除時增加分?jǐn)?shù)残炮,如果分?jǐn)?shù)高于歷史,則同時更新最高分
重置游戲時:當(dāng)前分?jǐn)?shù)歸零缩滨,最高分保存不變
按這么算势就,即使是最復(fù)雜的情況也可能不到10行代碼(不計算初始化對象)。所以直接寫在導(dǎo)演類中就可以了脉漏,不需要單獨分離一個類來處理苞冯。
開始實現(xiàn):
01.綁定對象
將場景中的“當(dāng)前分?jǐn)?shù)”和“最高分?jǐn)?shù)”對象拖動至導(dǎo)演類對應(yīng)的對象上:
02.添加成員
先添加“當(dāng)前分?jǐn)?shù)”和“最高分?jǐn)?shù)”對應(yīng)的腳本對象:
// 當(dāng)前分?jǐn)?shù)
public GameObject Score;
ScoreScreen _currentScore;
// 最高分?jǐn)?shù)
public GameObject HighScore;
ScoreScreen _highScore;
添加兩個表示分?jǐn)?shù)的成員變量。在添加這兩個變量時發(fā)現(xiàn)命名會與剛剛添加的腳本對象的引用產(chǎn)生沖突侧巨,經(jīng)過思索舅锄,決定添加一個后綴來區(qū)分,同時那些場景中對象引用的名稱也添加一個后綴與腳本名區(qū)分開來:
類似public GameObject ScreenMain;這種的變量名添加“Obj”司忱,腳本引用添加“Script”:
// 主屏幕
public GameObject ScreenMainObj;
ScreenMain _screenMainScript;
// 附加屏幕
public GameObject ScreenAttachedObj;
// 當(dāng)前分?jǐn)?shù)
public GameObject ScoreObj;
ScoreScreen _currentScoreScript;
// 最高分?jǐn)?shù)
public GameObject HighScoreObj;
ScoreScreen _highScoreScript;
// 關(guān)卡
public GameObject LevelObj;
// 暫停提示
public GameObject PauseHintObj;
記得修改變量名后皇忿,導(dǎo)演對象中的對象引用需要重新指定畴蹭。
然后這是新添加的兩個成員變量:
int _currentScore; // 當(dāng)前分?jǐn)?shù)
int _highScore; // 最高分?jǐn)?shù)
03.初始化新加的成員
// 初始化分?jǐn)?shù)
_currentScoreScript = ScoreObj.GetComponent<ScoreScreen>();
if (_currentScoreScript == null) return false;
_highScoreScript = HighScoreObj.GetComponent<ScoreScreen>();
if (_highScoreScript == null) return false;
_currentScoreScript.SetScore(_currentScore);
_highScoreScript.SetScore(_highScore);
04.在消除時更新分?jǐn)?shù)
為了讓計分看起來更精致,可以將更新分?jǐn)?shù)寫在ClearOnePoint()方法中鳍烁,這樣叨襟,計分就好像多了動畫一樣,而不是一下就跳到最終分?jǐn)?shù)老翘。
// 更新分?jǐn)?shù)
_currentScore++;
if (_currentScore > _highScore) _highScore = _currentScore;
_currentScoreScript.SetScore(_currentScore);
_highScoreScript.SetScore(_highScore);
05.計分規(guī)則
通過判斷消除的行數(shù)來修改增加的分?jǐn)?shù):
消除1行:每個點增加1分,共增加10分
消除2行:每個點增加2分锻离,共增加40分
消除3行:每個點增加3分铺峭,共增加90分
消除4行:每個點增加4分,共增加160分
// 更新分?jǐn)?shù)
switch (_needClearLines.Count)
{
case 1: _currentScore += 1; break;
case 2: _currentScore += 2; break;
case 3: _currentScore += 3; break;
case 4: _currentScore += 4; break;
}
if (_currentScore > _highScore) _highScore = _currentScore;
_currentScoreScript.SetScore(_currentScore);
_highScoreScript.SetScore(_highScore);
測試結(jié)果如下:
代碼鏈接:https://pan.baidu.com/s/1ji3nTes7Uwyn5KaqikBr8Q
提取碼:df5v