到底是有多少功能,需要使用“系统”来形容?其实功能非常简单,使用“系统”来形容开发任务能够让你更加“系统化”的去开发这个功能,你就会考虑的更加全面。例如换一种说法:添加一个小小的计分功能,那么在开发过程中,这个功能可能得不到你的重视,然后就会很随便的写一下,实现功能即可。
我以前刚学编程的时候,我会在房间门口贴着“贝尔实验室”,因为C语言是从这里诞生的,在房间敲代码时专注度非常高。
那么,分析一下该“系统”该如何实现?
首先,需要显示分数的地方有2个:当前分数和最高分数。
然后,更新分数的地方有3个:
游戏启动:从存档读取上一次分数,没有则设置为0
消除时:消除时增加分数,如果分数高于历史,则同时更新最高分
重置游戏时:当前分数归零,最高分保存不变
按这么算,即使是最复杂的情况也可能不到10行代码(不计算初始化对象)。所以直接写在导演类中就可以了,不需要单独分离一个类来处理。
开始实现:
01.绑定对象
将场景中的“当前分数”和“最高分数”对象拖动至导演类对应的对象上:
02.添加成员
先添加“当前分数”和“最高分数”对应的脚本对象:
// 当前分数
public GameObject Score;
ScoreScreen _currentScore;
// 最高分数
public GameObject HighScore;
ScoreScreen _highScore;
添加两个表示分数的成员变量。在添加这两个变量时发现命名会与刚刚添加的脚本对象的引用产生冲突,经过思索,决定添加一个后缀来区分,同时那些场景中对象引用的名称也添加一个后缀与脚本名区分开来:
类似public GameObject ScreenMain;这种的变量名添加“Obj”,脚本引用添加“Script”:
// 主屏幕
public GameObject ScreenMainObj;
ScreenMain _screenMainScript;
// 附加屏幕
public GameObject ScreenAttachedObj;
// 当前分数
public GameObject ScoreObj;
ScoreScreen _currentScoreScript;
// 最高分数
public GameObject HighScoreObj;
ScoreScreen _highScoreScript;
// 关卡
public GameObject LevelObj;
// 暂停提示
public GameObject PauseHintObj;
记得修改变量名后,导演对象中的对象引用需要重新指定。
然后这是新添加的两个成员变量:
int _currentScore; // 当前分数
int _highScore; // 最高分数
03.初始化新加的成员
// 初始化分数
_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.在消除时更新分数
为了让计分看起来更精致,可以将更新分数写在ClearOnePoint()方法中,这样,计分就好像多了动画一样,而不是一下就跳到最终分数。
// 更新分数
_currentScore++;
if (_currentScore > _highScore) _highScore = _currentScore;
_currentScoreScript.SetScore(_currentScore);
_highScoreScript.SetScore(_highScore);
05.计分规则
通过判断消除的行数来修改增加的分数:
消除1行:每个点增加1分,共增加10分
消除2行:每个点增加2分,共增加40分
消除3行:每个点增加3分,共增加90分
消除4行:每个点增加4分,共增加160分
// 更新分数
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);
测试结果如下:
代码链接:https://pan.baidu.com/s/1ji3nTes7Uwyn5KaqikBr8Q
提取码:df5v
网友评论