第三十九節(jié) 實(shí)現(xiàn)關(guān)卡功能

注意:這個(gè)卡讀成“qiǔ┞颍”同仆。

如果至始至終都是一樣的速度,那也太無聊了枪向。所以增加關(guān)卡就很有必要了勤揩。

01.制作關(guān)卡對象

直接復(fù)制一個(gè)場景中的“HighScore”,重命名為Level秘蛔,調(diào)整坐標(biāo):(206, 97, 0)陨亡。
刪除最后一個(gè)數(shù)字傍衡,修改中間的數(shù)字:除了“Middle”,全部隱藏负蠕。
然后將03重命名為Line蛙埂,04,05重命名為03遮糖,04:



然后移除該對象上的ScoreScreen腳本組件绣的。

02.添加關(guān)卡類

添加一個(gè)關(guān)卡類腳本:Level。該類只需4個(gè)數(shù)字止吁,前兩個(gè)數(shù)字為主關(guān)卡被辑,后兩個(gè)為次關(guān)卡:

using UnityEngine;

public class Level : MonoBehaviour
{
    public GameObject Number01;
    public GameObject Number02;
    public GameObject Number03;
    public GameObject Number04;

    public void SetLevel(int mainLevel, int MinorLevel)
    {
        // 設(shè)置主關(guān)卡
        Number01.GetComponent<Number>().SetNumber(mainLevel % 100 / 10);
        Number02.GetComponent<Number>().SetNumber(mainLevel % 10);

        // 設(shè)置次關(guān)卡
        Number03.GetComponent<Number>().SetNumber(MinorLevel % 100 / 10);
        Number04.GetComponent<Number>().SetNumber(MinorLevel % 10);
    }
}
03.添加關(guān)卡腳本

將腳本添加至關(guān)卡對象上,并綁定場景中的數(shù)字對象:


除此之外敬惦,還要將關(guān)卡對象拖放到導(dǎo)演對象的“Level Obj”上盼理。

04.添加成員和初始化

準(zhǔn)備工作都做好了,接下來實(shí)現(xiàn)功能俄删。

首先要添加成員宏怔,關(guān)卡腳本的引用和關(guān)卡值:

Level _levelScript;
int _level;                 // 關(guān)卡

本游戲沒有主次關(guān)卡之分,所以只需要一個(gè)關(guān)卡值就夠了畴椰。
然后就是初始化:

_level = 0;
// 初始化關(guān)卡
_levelScript = LevelObj.GetComponent<Level>();
if (_levelScript == null) return false;
_levelScript.SetLevel(0, _level);
05.如何實(shí)現(xiàn)變速

僅僅是實(shí)現(xiàn)變速的話臊诊,將定時(shí)器的時(shí)間間隔修改下即可:

InvokeRepeating("GameCore", 0, 1 - (_level - 1) * 0.1f);

按照這個(gè)公式,那么關(guān)卡1~10的速度分別為:
1 - 1s下落1格
2 - 0.9s下落1格
3 - 0.8s下落1格
4 - 0.7s下落1格
5 - 0.6s下落1格
6 - 0.5s下落1格
7 - 0.4s下落1格
8 - 0.3s下落1格
9 - 0.2s下落1格
10 - 0.1s下落1格斜脂,這個(gè)是最快的速度抓艳,一秒下落10格

計(jì)算速度并不難,關(guān)鍵是變速的時(shí)機(jī)帚戳。
首先玷或,當(dāng)方塊處于加速下落時(shí)(按下下方向鍵但不松開),肯定不能變更速度片任,否則按鍵還沒松開偏友,速度突然變慢了(加速的速度大于所有關(guān)卡的速度)算怎么回事?
然后消除方塊后如果正好使分?jǐn)?shù)達(dá)到了提升關(guān)卡的條件对供,那么就需要變速位他,也就是說,在消除方塊階段結(jié)束后产场,需要啟動(dòng)一個(gè)更快的定時(shí)器來驅(qū)動(dòng)GameCore()鹅髓。但如果在這里啟動(dòng)定時(shí)器,就會(huì)重現(xiàn)第32節(jié)中出現(xiàn)的Bug京景,不過有一個(gè)比較不錯(cuò)的解決方案迈勋,就是在Invoke Repeating()之前先調(diào)用CancleInvoke():

CancelInvoke("GameCore");
InvokeRepeating("GameCore", 0, 1 - (_level - 1) * 0.1f);

雖然還是會(huì)有問題(多線程的問題),不過應(yīng)該能大大減少觸發(fā)Bug的概率醋粟。之前的Bug是因?yàn)槲覜]有調(diào)用CanlInvoke():



調(diào)用CancleInvoke()之后:



不過還是會(huì)有問題靡菇,因?yàn)橛锌赡軙?huì)出現(xiàn)這種順序:

只是概率非常低,因?yàn)橥V购蛦?dòng)兩行代碼是寫在一起的米愿,要觸發(fā)Bug需要你松開按鍵的時(shí)機(jī)必須剛剛好卡在線程一的這兩行代碼之間厦凤。就算觸發(fā)了,按一下加速就恢復(fù)了育苟。
然后因?yàn)椴荒茉诩铀贍顟B(tài)中變速较鼓,所以需要加一個(gè)標(biāo)記來判斷是否處于加速狀態(tài)中:

bool _InQuickDown = false;          // 記錄是否正在快速下落

在按下下方向鍵時(shí)設(shè)置為true,松開后設(shè)置為false违柏,順便修改啟動(dòng)核心邏輯的定時(shí)器代碼博烂,根據(jù)關(guān)卡來計(jì)算時(shí)間間隔:

// 按鍵 - 下方向鍵
if (Input.GetKeyDown(KeyCode.DownArrow))
{
    _InQuickDown = true;
    CancelInvoke("GameCore");
    InvokeRepeating("GameCore", 0, 0.03f);
}
if (Input.GetKeyUp(KeyCode.DownArrow))
{
    _InQuickDown = false;
    CancelInvoke("GameCore");
    InvokeRepeating("GameCore", 0, 1 - (_level - 1) * 0.1f);
}

然后需要在消除階段結(jié)束后變更速度前添加一個(gè)判斷:

// 如果未處于加速中
if (!_InQuickDown)
{
    CancelInvoke("GameCore");
    InvokeRepeating("GameCore", 0, 1 - (_level - 1) * 0.1f);
}

好了,現(xiàn)在變速的幾個(gè)地方都添加好代碼了漱竖,最后一件事就是根據(jù)分?jǐn)?shù)計(jì)算關(guān)卡禽篱。
我的關(guān)卡提升規(guī)則是,每增加2500分提升一個(gè)Level:

// 更新關(guān)卡
int newLevel = _currentScore / 2500 + 1;
if (newLevel > 10) newLevel = 10;
if (newLevel > _level)
{
    _level = newLevel;
    _levelScript.SetLevel(0, _level);
}

為了方便測試提升關(guān)卡后是否會(huì)提升速度馍惹,你可以將2500改成一個(gè)很小的值躺率,比如200分。

1秒下落10格真的反應(yīng)不過來:


代碼鏈接:https://pan.baidu.com/s/1eIYPXNIL6V8i-aJ6ncmcXQ
提取碼:at6a

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末万矾,一起剝皮案震驚了整個(gè)濱河市悼吱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌良狈,老刑警劉巖后添,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異薪丁,居然都是意外死亡遇西,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門窥突,熙熙樓的掌柜王于貴愁眉苦臉地迎上來努溃,“玉大人,你說我怎么就攤上這事阻问∥嗨埃” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵称近,是天一觀的道長第队。 經(jīng)常有香客問我,道長刨秆,這世上最難降的妖魔是什么凳谦? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮衡未,結(jié)果婚禮上尸执,老公的妹妹穿的比我還像新娘家凯。我一直安慰自己,他們只是感情好如失,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布绊诲。 她就那樣靜靜地躺著,像睡著了一般褪贵。 火紅的嫁衣襯著肌膚如雪掂之。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天脆丁,我揣著相機(jī)與錄音世舰,去河邊找鬼。 笑死槽卫,一個(gè)胖子當(dāng)著我的面吹牛跟压,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晒夹,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼裆馒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了丐怯?” 一聲冷哼從身側(cè)響起喷好,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎读跷,沒想到半個(gè)月后梗搅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡效览,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年无切,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丐枉。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哆键,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瘦锹,到底是詐尸還是另有隱情籍嘹,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布弯院,位于F島的核電站辱士,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏听绳。R本人自食惡果不足惜颂碘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望椅挣。 院中可真熱鬧头岔,春花似錦塔拳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至澎胡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娩鹉,已是汗流浹背攻谁。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弯予,地道東北人戚宦。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像锈嫩,于是被迫代替她去往敵國和親受楼。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容