2016年5月18日 星期三

同人陣 - 變數代碼(課程二)

  我們在上一堂課中介紹了變數代碼的格式,但還沒有解決問題,所以接下來的課程除了要解決先前的問題之外,亦是要學習變數代碼的實際應用,這堂課可能會比(課程一)難上許多,但你應該不是為了放棄才來看這篇文章的對吧!總之...先看看下面這張圖吧。



▲圖一 (與上一堂課的圖一相同)

  (圖一)中共有 "一個檢查""三個動作" 沒有講解到,分別是:
檢查:
1.人物存活狀況 - 所有玩家(其中一人在戰場上),團隊號碼0,人物變數:任務/player
動作:
1.設定人物屬性 - 團隊號碼設為101
2.設定任務變數 - 整數「{player}.label」=「label」
3.設定任務變數 - 計算整數「label」=「label」+「1」,無條件捨去

  在上一堂課程中我們理論上已經準備好儲存資料的空間了,不過事情並沒有這麼簡單,因為我們必須依序檢查每個玩家,讓準備好的資料儲存空間能夠分發給每位玩家,此部分屬於「逐項檢查」的技巧。
請參考<逐項檢查>

下面兩項便是為了逐項檢查而設置的
人物存活狀況 - 所有玩家(其中一人在戰場上),團隊號碼0,人物變數:任務/player
設定人物屬性 - 團隊號碼設為101


  上一堂課我們已經明白變數「label」為0~7的整數,我們需要讓事件每次執行時的「label」都不同,以確保「label」能正確代表不同的玩家。首先要決定label的初始值。
▲圖二 事件【基本設定】設置 label 的初始值



  我們已將label的初始值設為0,再透過剛才的計算整數「label」=「label」+「1」,我們可以讓label從0開始,每次檢查通過時,都會執行到不同的label。
第一次檢查通過時:label=0 最後執行label=label+1 才得到label=1
第二次檢查通過時:label=1 最後執行label=label+1 才得到label=2
第三次檢查通過時:label=2 最後執行label=label+1 才得到label=3
......依此類推
第八次檢查通過時:label=7 最後執行label=label+1 才得到label=8



暫停一下!
為了配合題目並銜接等會兒的討論,我們需要再替事件【基本設定】增添一些東西,如圖三所示。
1.一個人物槍靶
2.人物最小血量調至200
3.放置狙擊槍在地上
4.設定任務變數「round」(round意思是"回合")
5.一個計分的告示牌
(告示牌的內容如下)
玩家%{player.0.name}%:共%{player.0.final.score}%點傷害
第一回:%{player.0.1.score}%
第二回:%{player.0.2.score}%
第三回:%{player.0.3.score}%

玩家%{player.1.name}%:共%{player.1.final.score}%點傷害
第一回:%{player.1.1.score}%
第二回:%{player.1.2.score}%
第三回:%{player.1.3.score}%
......依此類推

▲圖三 事件【基本設定】完整的設置

接著進入正題!



  最後要談到設定任務變數 - 整數「{player}.label」=「label」,它非常有意思,有個麻煩的變數問題需要用它來解決,這個問題如圖四所示。

▲圖四 事件【擊中槍靶】的錯誤示範

  第二條檢查中的任務變數 label 與攻擊者 player 兩者的關係不穩定,我們在談的不是人際關係什麼的,而是說這個【擊中槍靶】的事件,在人物受傷的步驟儲存了攻擊者代碼到 player,而變數 label 代表玩家標籤,卻沒有跟著玩家的不同而改變,所以我們需要在檢查的階段就改變 label,否則我們在檢查「玩家回合進度」時,會得到一個錯誤的結果。為此我們需要正確的設定事件【擊中槍靶】,如圖五所示


▲圖五 事件【擊中槍靶】

檢查:
1.人物受傷[ch0001]狀態:活者,攻擊者團隊101,受狙擊槍攻擊,儲存攻擊者變數「任務/player」儲存傷害數值「任務/damage」
  「該檢查是為儲存傷害數值,並儲存攻擊者代碼,以便於將傷害得分給予攻擊者」

2.比較數值:任務變數「{player}.label」大於 -1 ,儲存檢查到的數值給「任務/label」
  「{player}.label肯定是大於 -1 的,因此它每次都會將{player}.label的值儲存到 label」
  (這就是先前設定「{player}.label」=「label」的原因)

3.比較數值:任務變數「player.{label}.selfround」等於「round」
  「若玩家回合進度等於當前回合,代表這名玩家在該回合尚未打中槍靶」

動作:
1.計算整數:「player.{label}.final.score」數值=「player.{label}.final.score」+「damage」
  「玩家總分」的數值為「玩家總分」+「傷害數值」

2.計算整數:「player.{label}.selfround」數值=「round」+ 1
  「玩家回合進度」的數值為「當前回合」+ 1
  (與第三條檢查互相對應,功能就像是逐項檢查那樣地把檢查過的玩家剔除)

3.設定任務變數:整數「player.{label}.{round}.score」數值=「damage」
  「玩家.標籤.回合.分數」它其實就是前一堂課教的「每位玩家第X回合的分數」對吧!



  接著,我們要讓回合數能不斷地增加,這個部分比較簡單,只要檢查每一個玩家的回合進度是否等於當前回合即可,動作的部分只需要讓 round = round + 1 就行了。

▲圖六 事件【回合結束】


問題解決









2 則留言:

  1. 我照著做
    卻無法將變數{label}變成0或1或2或其他的

    回覆刪除
    回覆
    1. 這篇文章是我邊做邊寫的,有實際測試過,應該沒有問題。你可以檢查一下有沒有讓事件設重覆次數,還有圖四是錯誤示範要特別注意喔!

      刪除