第三十六节 实现计分系统

到底是有多少功能,需要使用“系统”来形容?其实功能非常简单,使用“系统”来形容开发任务能够让你更加“系统化”的去开发这个功能,你就会考虑的更加全面。例如换一种说法:添加一个小小的计分功能,那么在开发过程中,这个功能可能得不到你的重视,然后就会很随便的写一下,实现功能即可。
我以前刚学编程的时候,我会在房间门口贴着“贝尔实验室”,因为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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,308评论 6 13
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,171评论 1 32
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,911评论 1 45
  • 一、信用内涵的界定 【】应收应付【】预收预付 二、信用的产生与信用形式的演进 (一)信用的产生 前提条件: 财产私...
    旋律sama阅读 425评论 0 0
  • 剩一天考试了,我很着急。可我在你们的身上看不到着急。 周四的我看到你们的测试卷,令我所有的惊喜期待都...
    杨琪雨阅读 106评论 0 0