2017年3月13日 星期一

製作日誌--017

難得的準時更新
今天把備忘錄功能補齊了
因為偽春菜本身有自己的一套語法
很多操作上有不少限制
只能用比較取巧的方式去處理一些功能

###備忘錄###

本日的更新內容只有備忘錄
因為刪除項目的部份讓我研究了一兩個小時
以下開始說明實作方法

首先,假設我們的備忘錄參數memo現在長這樣子:

memo = "0\n1\n2\n"

在查看備忘錄時,因為有\n的存在,看起來就像條列式的清單
為了讓使用者可以選取想要刪除的項目
我們先用AYA的內建函數SPLIT來處理字串:

memoarr = SPLIT(memo,"\n")

上面的操作會將memo分割成陣列,而分割點為\n
在這裡便會將memo分割成["0","1","2",""]
需注意最後面會多出一個空字串
因為SPLIT的分割模式是一但看到分割點
就會將前後分別做為單一字串放入陣列
因此在memo中最後一個\n的前後分別是"2"與""
這個部分讓我頭痛了一陣子
所以在這裡特別提醒一下
接著就是要將選項輸出了

大家應該還記得選項的輸出方式為:

\q[標題,ID]

但是這裡就有個問題,我們存在memoarr中的元素皆為字串
而上面程式碼中的標題本身就只是一串字,而不是字串
只是傳入內碼的時候會作為字串傳入而已
因此要怎麼將memoarr中的字串成功在選項中被顯示呢?
這時就可以利用AYA內建函數STRFORM
該函數的功能與C語言中的sprintf相似
以下便說明如何將memoarr的每個字串化為一個一個選項輸出:

question = STRFORM("\q[○$s,OnRemoveMemo,$d]\n", i, cnt)

可以看到STRFORM的傳入值為一個有點怪怪的字串
首先,上面程式碼中的$s和$d代表這個地方要由後面提供的變數來替換
s代表string,代表替換變數型態為字串
而d代表decimal,其他應該都與C語言相同
因此上面程式碼中的$s與$d會分別被變數i與cnt代換
而question變數便會存放"\q[○(字串i),OnRemoveMemo,(整數cnt)]\n"
這樣便是一個選項的正確形式了
由於選項中的ID為On開頭的函數,後面的參數會作為reference0、reference1...等等傳入ID函數
而這裡的傳入值是cnt變數所存放的整數
而前面也提過了,傳入值會以字串傳入

現在要將memoarr的內容全部變成選項:

cnt = 0
talk = "\0\s[0]"
foreach memoarr;i
{
    if i != ""
    {
        question = STRFORM("\q[○$s,OnRemoveMemo,$d]\n", i, cnt)
        talk = talk + question
        cnt = cnt + 1
    }
}

首先看到前面兩行
cnt為計數器,記錄memoarr中每個字串的序數
而talk為最後要讓偽春菜說出的話,因此初始值為開啟對話框與設定表情
接著看到foreach迴圈,其功能跟python中的for i in list相同
這裡便是以變數i作為迭代器,將memoarr中每個元素迭代一輪
每一次迭代都檢查i是否為空字串,避免生成不該存在的選項
這個動作便是在防範前面提到SPLIT分割模式所造成的問題
再來看到STRFORM,裡面我將每個選項的序數做為reference0傳入OnRemoveMemo
用途下面會說明
每跑完一圈,cnt就加1,以得到正確的序數
最後看到OnRemoveMemo怎麼處理刪除動作

OnRemoveMemo
{
    memoarr = SPLIT(memo)
    idx = TOINT(reference0)
    cnt = 0
    memo = ""
   
    foreach memoarr;i
    {
        if (idx != cnt) && (i != "")
        {
            memo = memo + i + "\n"
        }
        cnt = cnt + 1
    }
}

這裡的操作基本與前一段程式碼相同
首先看到idx變數,由於reference0會被當作字串傳入
因此要用AYA內建函數TOINT將字串轉為整數
接著在memo被更動前再一次將其分割並存入memoarr變數中
然後將memo清空並重新將沒被刪除的內容填入
這裡重新填入同樣用到foreach迴圈
但是判斷式稍微不一樣
要兩個條件同時為真才會執行if內的動作
第一個是idx不等於cnt,這個判斷是確認當前i的序數是否等於待刪除項目的序數
第二個是i不為空字串,這個判斷的理由在前面已經提過了
在字串內部做刪除這個動作比較困難
但刪除這個動作等價於將剩下的記錄下來
因此我們便是用後者處理刪除的動作

這裡的解說只提了最核心的功能
而我另外還追加了選擇刪除項目時,最下面會出現取消選擇肢
可以用來防按錯的情況
而當memo被刪除所有項目後
會自動還原到空白的狀態
以及當memo為空白狀態時
小鳥會提醒使用者目前備忘錄是空白而不進行刪除工作

==================================================================
今天是把失望表情完成之後才開始編程工作
但並沒有將表情實裝,只有將設定檔寫好而已


一個計畫拖越久,畫風就變越多
這是一件無比哀傷的事情

2017/03/13

沒有留言:

張貼留言