2017年2月20日 星期一

製作日誌--015

開學了,之後的更新進度應該會和以前一樣一周一次
不知不覺這個網誌也更新到第15篇文章了
但每周的進度倒是越來越少

今天程式的更新不多
但是畫了新表情的草稿

###溝通###

在與小鳥對話時如果輸入中包含"出門"或"出發"的話
小鳥會問使用者是否要出門了
如果選是,偽春菜會在對話後自動關閉
這裡我銜接到了備忘錄的功能

###備忘錄###

新增初始參數goout,作為判斷是否在使用者出門時印出備忘錄
出門提醒的開關在主菜單的備忘錄選單內
設計上就只是在memo.dic中加上ChangeGoOut的函式
並且在備忘錄選單中新增選項與對話
設計非常簡單,便不詳細說明程式碼了

======================================================

這次的新表情是失望,但畫起來感覺像是鬧彆扭


將近兩個月沒有畫小鳥了,希望沒有太奇怪

2017/02/20

2017年1月30日 星期一

製作日誌--014

小鳥偽春菜已經一個月沒有更新了
一開始放假就失去了時間感
直到今天早上才想起今天是星期日
幸好休息一個月之後沒有失去戰鬥力

本次更新有一項非常重要的事情必須宣布
「南小鳥人格新增了備忘錄功能 」
雖然是臨時想到可以新增的功能
作為對SakuraScript的練習也是個不錯的挑戰
目前只有最基本的功能
詳細會在下面做討論

###溝通###

新增了一些溝通內容
備忘錄功能就是在增加溝通對話時想到的主意

###備忘錄###

本次更新的重點
以下會說明一下個人的對此功能的構想與做法
首先,我認為備忘錄不應該因為偽春菜主程式的關閉而消失
且應該可以隨時新增項目、查看、清空和刪除項目
並且在使用者要出門前可以提醒要帶出去的東西

接著是我已完成的部分
現在只有新增項目、察看與清空的功能
出門提醒的功能還沒引入,但這部份很簡單

首先我先在aya_bootend.dic的OnFirstBoot事件中加入兩個參數

memo = "<空白>"
memoisblank = 1

memo參數的型態為字串(string),這個參數就是整本備忘錄
而memoisblank則是用來判定memo目前是否為空白
由於個人不希望當備忘錄空白時,查看備忘錄時就真的看到空白
因此用"<空白>"來表示目前沒有記錄任何項目

接下來則是加入一些專門處理memo的函式
先新增一個叫做aya_memo.dic的檔案
(詳細處理方式請參考005─**事件處理**的部分)
並在裡面加入兩個函式

ClearMemo
{
    memo = "<空白>"
    memoisblank = 1
}

OnAddMemo
{
    if reference0 != ""
    {
        if memoisblank == 1
        {
            memo = ""
            memoisblank = 0
        }
        memo += reference0 + "\n"
    }
    "\0\s[0]已經幫%(username)把提醒寫進備忘錄囉!\e"
}

第一個ClearMemo就是將備忘錄整個清空
第二個OnAddMemo則為新增項目
先判定使用者有無輸入內容
如果有,再判斷目前備忘錄是否為空白
如果有輸入且備忘錄為空白
則將memoisblank設為0,且將memo設為""
再加入新增項目
如果有輸入且備忘錄已有內容
則直接加入新增項目
如果沒有輸入內容
小鳥依然會告訴你已更新備忘錄
但其實她什麼也沒做(.8.)

再來就是要提供使用者存取備忘錄的方式
首先在OpenMenu中多加上這行

"\q[○備忘錄,memo]\n"

這樣在開啟主菜單時便會多出備忘錄的選項
接著再加上

Select.memo
{
    Memo
}


Memo
{
    "\0\s[0]\n\n/
    \q[○查看,open_memo]\n/
    \q[○新增項目,add_memo]\n/
    \q[○清空,clear_memo]\e"
}


如此一來使用者便可以在主菜單找到備忘錄的功能了
接著便要寫入現有的三個互動式功能
第一個是"查看"

Select.open_memo
{
    "\0\s[0]這是%(username)的備忘錄:\n\n%(memo)\e"
}

這裡應該不需要多加說明了,就只是將memo作為變數存取並顯示出來而已

第二個是"新增項目"

Select.add_memo
{
    "\0\s[0]請問要加入什麼項目呢?\![open,inputbox,OnAddMemo,-1]\e"
}

這裡我們注意到新的語法\![open,inputbox,OnAddMemo,-1]
這個語法的功能是打開輸入視窗,等待使用者輸入內容
詳細說明如下:
\![open,inputbox,ID,(等待時間),(預設輸入內容)]
(括號內的內容為選擇性參數,可輸入可不輸入)
首先,由於開啟了inputbox
如果使用者有輸入內容,則會引發OnUserInput事件
而ID會被當作reference0被傳入OnUserInput作為事件名稱
而使用者輸入內容則是作為reference1被傳入
等待時間以毫秒為單位,超過等待時間就會自動關閉輸入框
若等待時間為-1,則代表輸入框會等到使用者輸入內容或自行關閉才會關閉
而預設輸入內容則是在輸入框出現時
顯示在輸入欄的文字
作為提醒使用者目前該輸入的內容,是個貼心的設計

這個語法有個特別的用法
當ID所表的事件名稱為On開頭,會跳過OnUserInput事件
直接執行ID所表示的事件名稱
也就是上面範例碼的用法
因此當使用者輸入(或沒有輸入)內容時
程式會自動跳轉到aya_memo.dic內定義的OnAddMemo函式
這也是會什麼該函式要以On作為開頭的原因

第三個是"清空"

Select.clear_memo
{
    "\0\s[0]這就幫你把備忘錄清空!\e"
    ClearMemo
}

以上是目前備忘錄的功能
對特定內容作刪除可能還需要更多字串處理的工作
然後不排除會新增備忘錄的其他功能

###唱歌###

將唱歌的表情實裝
但發現唱歌時不會執行動嘴的動畫

=============================================================

雖然畫了唱歌時的動嘴動畫
但上面已經說了
並不會被執行
因此今天沒有新的圖檔

2017/01/30

2016年12月26日 星期一

製作日誌--013

接近期末,最近也開始忙碌起來了
這次更新可能會是這學期最後一次
預定是要到寒假後才會有下一次更新
除非我中途手癢
不過這個可能性非常低

=======================================================
今天的進度只有把唱歌的動作上色完
下周元旦回家沒有電腦
如果下下周手癢,可能會把動畫做完


小鳥真的真的好可愛啊

2016/12/26

2016年12月19日 星期一

製作日誌--012

昨天半夜(今天凌晨)電腦突然當機
重開是開得起來,但螢幕完全沒有訊號...
大半夜室友也睡了,想說別拆主機整理了
就留到早上睡醒再來更新@@

###AI對話###

正準備要想force_talk的時候當機了
不過有新增一句一般對話

###溝通###

在009那篇提到,個人寫的溝通是可以切換溝通對象的
不過溝通對象flag的初始化被放在ReplyToUser的函式裡面
導致不管怎麼切換,溝通的對象都是salura端
後來我將初始化變數放在bootend.txt裡面
因此每次重啟人格時,對象會重設為sakura端
而在運作期間,則會記憶該次溝通對象

###變數初始化###

接著溝通對象變數的問題
由於需要tailtosakura與talktokero兩個做為flag的變數
在OnFirstBoot中就必須宣告這兩個變數的存在
原本的初始值是設定為0
但因為這次的修改
因此在首次啟動的時候
改成直接將talktosakura設定為1

======================================================
這周畫圖的進度很...慢
要來好好檢討一下了@@



唱歌的動作
不排除會有更多種唱歌的動作

2016/12/19

2016年12月12日 星期一

製作日誌--011

這周感冒了,但精神其實很好
比備考的時候還要好

今天逛中文教學文件的時候
看到了製作歌詞卡的教學
於是心血來潮,想說幫小鳥做個歌詞卡
結果就花了很多時間...囧
所以今天的進度就只有將之前改好的文本和新表情加裝進去而已

###AI對話###

新增了一句(或是兩句)對話。

###啟動對話###

原本的啟動對話只會依照啟動時間(小時)而有不同的內容
現在新增了節日判斷的功能
這個部分參考了橘花的寫法
新增一個"GetTime"的函式
並將節日或時間點以字串的方式回傳

GetTime
{
    if month==1 && day==1
    {
        "NewYear"
    }
}

上面的範例便是宣告了新的函式"GetTime"
呼叫此函式時,便會去偵測目前系統的時間
而範例中偵測的是系統的月分與日期
如果月份和日期都是1的話,便會回傳"NewYear"字串
而對話的時候便可以依照回傳值來決定對話內容

###唱歌###

新增了小鳥solo的歌詞卡
製作歌詞卡的部分不難也不簡單
主要是需要耐心
這部分的教學在中文教學文件上非常詳細
這裡便不做教學了
...反正也不會公開歌詞卡((X

==================================================


via GIPHY
微笑表情與說話動畫
還有唱歌的部分
歌本身有版權問題,就只錄唱歌的動畫

今天沒有新畫的圖
不過既然開始做歌詞卡了
可能會預定幾張唱歌專用的圖片也說不定
我是說...說不定...會有...新的圖片...
說不定...

2016/12/12

2016年12月5日 星期一

製作日誌--010

上週日因為喝了酒,沒有更新
這周因為隔天考試,到凌晨2:30才開始畫圖
所以今天的進度只有把上次的圖上色完畢而已
希望下周開始可以回到正常的進度
 

畫的時候順便複習了一下配色跟陰影位置
之後即使有不同動作
也不用為了思考上色而浪費時間了

2016/12/05

2016年11月21日 星期一

製作日誌--009

上週因為準備期中考,便自行暫停更新一周
最近在考慮是否要放棄用偽春菜製作人格
改用pyQt重寫一份偽AI桌面助理程式
個人覺得重寫對最後的完成度會有很大的幫助
但目前有兩個問題:

1. 不確定pyQt的功能是否符合我的需求。
2. 在Windows上安裝pyQt非常困難

第2點是我今天試了3個小時後的結論
因此,如果要轉用pyQt開發程式的話
會轉到Linux上做開發,但這樣程式是否可以在Windows運行就又是問題了
總之,近期的更新依然會在偽春菜上
也有可能在把原本設定的目標在偽春菜上完成後
再轉向自行設計程式

因為花了些時間嘗試安裝pyQt
今天的更新內容較少
但有補上新的功能

###啟動對話###

有鑑於前陣子的萬聖節
突然想到啟動對話應該也要與節日有關
於是新增了對特定節日的對話
目前有:
新年
情人節
萬聖節
聖誕節
之後會再新增節日與使用者的生日

###溝通###

今天最大的更新就是做好與人格溝通的雛形
以下簡單說明我的做法:

**溝通對象**
我希望使用者可以對Sakura端與Kero端分別進行對話
因此新增了兩個變數:talktosakura與talktokero
其值只會為1或0
當其中一個為1時,另一個必為0
而使用者的溝通對象便是變數為1的對象
可以藉由輸入對象的名字來切換溝通對象
(ex."小鳥"、"啾啾")

**溝通**
這個人格的對話只限於使用者呼叫的被動對話
因此我們只需要用到"OnCommunicate"事件
請看以下範例碼:

OnCommunicate
{
    if reference0 == "user" || reference0 == "User"
    {
        ReplyToUser //與User對話
    }
}
OnCommunicate事件中,我們需要用到reference0來判定與人格溝通的對象
偽春菜中支持與使用者和與其他人格的溝通
如果要和其他人格溝通
則將"user"更改為"人格本體側名字"即可
另外,"||"代表邏輯運算中"or"意思,只要其中一個運算元為真,則為真
而"&&"則代表"and"的意思,除了兩個運算元皆為真時為真,其他條件皆為假
如果要處理多重條件,且不需要用到巢狀結構時會使用到
接著我們來看看如何處理使用者輸入的訊息:

ReplyToUser
{
    //預設與本體側對話
    talktosakura = 1
    talktokero = 0
    if "你好" _in_ reference1
    {
        if talktosakura == 1
        {
            "\0\s[0]你好。\e"
        }
        else
        {
            "\1\s[10]你好啊。\e"
        }
    }
    elseif "小鳥" _in_ reference1
    {
         talktosakura = 1
         talktokero = 0
}
在這裡處理使用者輸入訊息的方式十分簡單
由於偽春菜會將輸入訊息當作字串傳入程式
因此我們只要檢查特定單詞是否出現在字串中
便可以讓人格做出回應
"_in_"在文中代表檢查左側的字串是否包含在右側字串中
另外範例的最後也示範了如果更改溝通對象
對Kero端溝通的方法也一樣,這裡便不再贅述

================================================================

今天只把上次的線稿描邊上底色而已
原本想說把圖趕完
但想想還是幫程式加點東西好了
預計下周可以完成這張圖
最晚下下周就可以把這張圖的動畫做完

2016/11/21