接近期末,最近也開始忙碌起來了
這次更新可能會是這學期最後一次
預定是要到寒假後才會有下一次更新
除非我中途手癢
不過這個可能性非常低
=======================================================
今天的進度只有把唱歌的動作上色完
下周元旦回家沒有電腦
如果下下周手癢,可能會把動畫做完
小鳥真的真的好可愛啊
2016/12/26
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
重開是開得起來,但螢幕完全沒有訊號...
大半夜室友也睡了,想說別拆主機整理了
就留到早上睡醒再來更新@@
###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
比備考的時候還要好
今天逛中文教學文件的時候
看到了製作歌詞卡的教學
於是心血來潮,想說幫小鳥做個歌詞卡
結果就花了很多時間...囧
所以今天的進度就只有將之前改好的文本和新表情加裝進去而已
###AI對話###
新增了一句(或是兩句)對話。
###啟動對話###
原本的啟動對話只會依照啟動時間(小時)而有不同的內容
現在新增了節日判斷的功能
這個部分參考了橘花的寫法
新增一個"GetTime"的函式
並將節日或時間點以字串的方式回傳
GetTime
{
if month==1 && day==1
{
"NewYear"
}
}
上面的範例便是宣告了新的函式"GetTime"
呼叫此函式時,便會去偵測目前系統的時間
而範例中偵測的是系統的月分與日期
如果月份和日期都是1的話,便會回傳"NewYear"字串
而對話的時候便可以依照回傳值來決定對話內容
###唱歌###
新增了小鳥solo的歌詞卡
製作歌詞卡的部分不難也不簡單
主要是需要耐心
這部分的教學在中文教學文件上非常詳細
這裡便不做教學了
...反正也不會公開歌詞卡((X
==================================================
via GIPHY
微笑表情與說話動畫
還有唱歌的部分
歌本身有版權問題,就只錄唱歌的動畫
今天沒有新畫的圖
不過既然開始做歌詞卡了
可能會預定幾張唱歌專用的圖片也說不定
我是說...說不定...會有...新的圖片...
說不定...
2016/12/12
2016年12月5日 星期一
製作日誌--010
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
最近在考慮是否要放棄用偽春菜製作人格
改用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
2016年11月7日 星期一
製作日誌--008
從開始製作已經兩個月左右了
人格大致上的雛型都有了
接下來的問題是shell與充實功能
另外,鬧鐘功能也尚未寫入
不過有預感之後會花很大一段時間畫圖
文本的部分只能期待靈感正常運作了
題外話,開始覺得當初不應該選擇二創角色
對話真的太難寫了
話題必須被侷限在「像是角色會說的話」
而不能像原創,想說什麼就說什麼
以上只是發牢騷
###AI對話###
只新增了一句對話
有想要擴張話題的範圍
不過很擔心造成話題與角色搭不上邊
###切換人格###
換成別的人格和從別的人格換回來的時候
會依照好感度而有不同的對話
###單語字典###
新增了「話題(topic)」類別
=============================================================
今天並沒有增加surface,但是做出了新的動作
目前預計完整的shell總共會有5-6種動作
搭配不同手勢與表情,形成不同的 surface
當然動作的數目是會隨時調整的
這周是期中考周
祝各位考試順利
2016/11/07
人格大致上的雛型都有了
接下來的問題是shell與充實功能
另外,鬧鐘功能也尚未寫入
不過有預感之後會花很大一段時間畫圖
文本的部分只能期待靈感正常運作了
題外話,開始覺得當初不應該選擇二創角色
對話真的太難寫了
話題必須被侷限在「像是角色會說的話」
而不能像原創,想說什麼就說什麼
以上只是發牢騷
###AI對話###
只新增了一句對話
有想要擴張話題的範圍
不過很擔心造成話題與角色搭不上邊
###切換人格###
換成別的人格和從別的人格換回來的時候
會依照好感度而有不同的對話
###單語字典###
新增了「話題(topic)」類別
=============================================================
今天並沒有增加surface,但是做出了新的動作
目前預計完整的shell總共會有5-6種動作
搭配不同手勢與表情,形成不同的 surface
當然動作的數目是會隨時調整的
這周是期中考周
祝各位考試順利
2016/11/07
2016年10月31日 星期一
製作日誌--007
原本以為今天這篇會是008
結果還在007@@
明天(今天?)有個考試,就不花太多時間更新了
###AI對話###
將使用者觸碰反應的對話依照好感度做了分類
不過依現在的設計
一旦被討厭了,似乎會很難拉好感度
考慮從其他互動來彌補
總之,如果被討厭的情況下做出失禮的事
好感度會降非常快
========================================================
眨眼分解動作,這次覺得眼睛半開的小鳥眼神很鄙視QAQ
說話分解動作,原本驚訝的預設表情是張嘴的
不過因為貼圖好像有點問題
就改成預設閉口了
via GIPHY
驚訝表情動畫,真的好可愛啊
觸碰反應裡面增加了一些有點害羞的對話
寫得自己都很害羞
另外,萬聖節快樂
不給糖就導彈((無誤
2016/10/31
結果還在007@@
明天(今天?)有個考試,就不花太多時間更新了
###AI對話###
將使用者觸碰反應的對話依照好感度做了分類
不過依現在的設計
一旦被討厭了,似乎會很難拉好感度
考慮從其他互動來彌補
總之,如果被討厭的情況下做出失禮的事
好感度會降非常快
========================================================
眨眼分解動作,這次覺得眼睛半開的小鳥眼神很鄙視QAQ
說話分解動作,原本驚訝的預設表情是張嘴的
不過因為貼圖好像有點問題
就改成預設閉口了
via GIPHY
驚訝表情動畫,真的好可愛啊
觸碰反應裡面增加了一些有點害羞的對話
寫得自己都很害羞
另外,萬聖節快樂
不給糖就導彈((無誤
2016/10/31
2016年10月24日 星期一
製作日誌--006
終於到第六周了(應該是第七周)
這周幾乎都在畫圖,不過進度十分緩慢
不如說只要遇到畫新動作與表情
進度就會非常慢@@
###AI對話###
新增了一個forced_talk
和一個蠻長的連鎖對話
測試一下自己對sakura script語句排列的熟練度
=============================================================
目瞪鳥呆,一樣好可愛
via GIPHY
目前對話數量不多,內容也不夠廣泛
表情做完似乎都不知道要放在哪裡@@
另外,今天原本有幫旁邊那隻做了眨眼和動嘴的動畫
但因為主要底色是白色
偽春菜在貼圖時似乎直接把白色當作透明色
於是大失敗
之後應該就不考慮幫他做動畫了
不過可能會有別的表情或動作
2016/10/24
這周幾乎都在畫圖,不過進度十分緩慢
不如說只要遇到畫新動作與表情
進度就會非常慢@@
###AI對話###
新增了一個forced_talk
和一個蠻長的連鎖對話
測試一下自己對sakura script語句排列的熟練度
=============================================================
目瞪鳥呆,一樣好可愛
via GIPHY
目前對話數量不多,內容也不夠廣泛
表情做完似乎都不知道要放在哪裡@@
另外,今天原本有幫旁邊那隻做了眨眼和動嘴的動畫
但因為主要底色是白色
偽春菜在貼圖時似乎直接把白色當作透明色
於是大失敗
之後應該就不考慮幫他做動畫了
不過可能會有別的表情或動作
2016/10/24
2016年10月17日 星期一
製作日誌--005
從決定開始製作已經一個多月了
目前看來進度不快不慢的
沒有期限,所以希望可以完成的完整一些
###AI對話###
增加了一種forced_talk的項目
如果是使用者強制啟動對話的話
有一半的機率會進到forced_talk
另一半的機率會進到一般的aitalk
###主選單###
將芽芽美原有的主選單完全改掉
管理此項目的文件為aya_menu.dic
以下會對於"選項處理"、"輸入框"做些說明
**選項及選項處理**
與人格的互動非常大一部份是建立在選項上的
如果建立選項與處理使用者選擇後的反應便是件很重要的事
我們先看看以下範例:
"請問有什麼事嗎?\n\n/
\q[聊天,talk]\n/
\q[改變會話頻率,interval]\n/
\q[沒事,cancel]\e"
我們先說明"/"這個符號的意思
在文(AYA)中,"/"是保留語
其意義為「將此行結尾與下一行開頭結合,不包含/本身」
在這裡,我們為了排版方便閱讀,使用了"/"符號
讓程式碼的排序更接近於執行後的結果
當然可以選擇不使用該符號
不過使用後的效益遠大於記憶該符號的力氣(個人見解)
再來便是sakura script的選擇肢命令"\q[title, ID]"
每一個這樣的命令都代表了一個選項
title為該選項的標題,會顯示在balloon上供使用者閱讀及點選
因此,title的內容便是用來告知使用者該選項的功能
而ID則是在程式內對於該選項的識別
這點我們在下面的選項處理會繼續說明
接著看到下面的範例:
OnChoiceSelect
{
case reference0
{
when "talk"
{
OnAiTalk
}
when "interval"
{
"想要改變成怎麼樣呢?\n\n/
\q[多話,interval_30]\n/
\q[沉默,interval_0]\e"
}
when "cancel"
{
"\0\s[0]呣。\e"
}
}
}
首先,"OnChoiceSelect"為用來處理選擇後的「所有」事務
個人目前不是很了解其運作,但若有一個以上的"OnChoiceSelect"
程式似乎會出錯,因此必須非常注意「所有」這兩個字
在文(AYA)中,有類似於C的switch條件判斷式
其用法見上例,"case var",var代表之後要用來做判定的變數
範例中使用的"reference0"為選擇選項後傳給OnChoiceSelect的參數
在不同的事件處理中,reference的數量及其代表的意義皆不相同
在OnChoiceSelect中,reference0代表使用者選擇的選擇肢之ID
因此我們用"when "ID""來判定reference0為哪個選項
並對各個選項做處理
這裡可以看到,在talk選項中,會自動導向OnAiTalk事件
而在interval選項中,還包含了兩個選項
這麼做是可以的
假設使用者此時選了"多話"
那麼,"OnChoiceSelect"的"reference0"便會變成"interval_30"
猜測這就是為何不能有多個OnChoiceSelect的原因
最後的"cancel"選項則是讓整個對話結束
另外,我們提到選項處理中可以再新增選項
而新增的選項也必須在同一個OnChoiceSelect中處理
個人推測新增選項的處理必須放在生成該選項的block之外
舉例來說,interval_30是在interval中被生成的
因此,處理interval_30的block必須在interval之後
(以上敘述單純為推測,根據電腦讀取程式碼的順序性,這樣的推測有一定的道理在)
前面提到了只能有一個OnChoiceSelect
為了解決這樣的問題,我從橘花的文件中參考了一些有趣的作法
在說明之前,想先提一下對於「事件發生」與「事件處理」的差別
**事件發生**
以選擇處理為例,不管有沒有OnChoiceSelect的block存在
只要選擇了選項,事件就是會發生
發生這件事並不包含了處理
**事件處理**
事件發生後,我們才能對其做處理
而Ukagaka提供我們許多處理事件用的函式
每個函式都會因為不同事件的發生而得到不同的參數
我們便可以運用這些參數,對事件做出各式各樣的反應
這部分說明僅提供做為參考,若有錯誤,煩請糾正
接著,參考橘花的文件後,可以發現一個"aya_sysex.dic"的文件
我們只需要移植其第一個block
也就是對"OnChoiceSelect"做出一些更動
見以下程式碼:
OnChoiceSelect
{
EVAL("Select.%(reference0)")
}
其中的"EVAL"在上一篇日誌已經有說明了,這裡便不再多做敘述
這裡便會將"Select.%(reference0)"作為指令碼處理
"reference0"跟前面一樣,是指選項的ID
因此,不管在哪個地方遇到"Select.%(reference0)"
都會包含在這裡的"OnChoiceSelect"之中
非常巧妙的迴避了之前提到的問題
真想問問當初的開發者怎麼想到的,太天才了
我們只需要在自己的人格存放dic檔案的地方
新增一個隨意檔名的dic檔
加入上面的程式碼,以UTF-8儲存檔案
並且在人格的資料夾中的"yaya.txt"加上一行:
dic, dic/aya_sysex.dic
這裡以我開發的文件為例,最前面的dic指程式要去開啟的檔案為dic檔
逗號後面則為yaya.txt與dic檔的相對位置
這樣程式啟動時就會自動去開啟這份檔案,讀取並執行其內容了
接著,對於前面的"OnChoiceSelect"的事件處理
可以改成以下形式:
Select.talk
{
OnAiTalk
}
Select.interval
{
"想要改變成怎麼樣呢?\n\n/
\q[多話,interval_30]\n/
\q[沉默,interval_0]\e"
}
Select.cancel
{
"\0\s[0]呣。\e"
}
看起來簡潔許多,也可以在不同文件中做事件處理
真的是一個非常聰明的方式
最後,在本篇日誌最剛開始提到的forced_talk
其實只是在aitalk.dic文件中
另外加上一個forced_talk的block
並在Select.talk的block中
直接加上一行"forced_talk"
這樣處理"talk"選項時
程式便會等機率挑選"OnAiTalk"或"forced_talk"
###BUG###
目前遇到的BUG在主程式更新後便自動消失了
...QAQ
=============================================================
害羞鳥的眨眼與說話動畫的分解動作
為什麼每次半開眼的表情看起來都特別病嬌' ')
via GIPHY
害羞表情動畫的GIF,好可愛
大部分功能的雛型都已經建立好了
接下來就是把表情補完,並且把所有功能再擴充到更加充實
2016/10/17
目前看來進度不快不慢的
沒有期限,所以希望可以完成的完整一些
###AI對話###
增加了一種forced_talk的項目
如果是使用者強制啟動對話的話
有一半的機率會進到forced_talk
另一半的機率會進到一般的aitalk
###主選單###
將芽芽美原有的主選單完全改掉
管理此項目的文件為aya_menu.dic
以下會對於"選項處理"、"輸入框"做些說明
**選項及選項處理**
與人格的互動非常大一部份是建立在選項上的
如果建立選項與處理使用者選擇後的反應便是件很重要的事
我們先看看以下範例:
"請問有什麼事嗎?\n\n/
\q[聊天,talk]\n/
\q[改變會話頻率,interval]\n/
\q[沒事,cancel]\e"
我們先說明"/"這個符號的意思
在文(AYA)中,"/"是保留語
其意義為「將此行結尾與下一行開頭結合,不包含/本身」
在這裡,我們為了排版方便閱讀,使用了"/"符號
讓程式碼的排序更接近於執行後的結果
當然可以選擇不使用該符號
不過使用後的效益遠大於記憶該符號的力氣(個人見解)
再來便是sakura script的選擇肢命令"\q[title, ID]"
每一個這樣的命令都代表了一個選項
title為該選項的標題,會顯示在balloon上供使用者閱讀及點選
因此,title的內容便是用來告知使用者該選項的功能
而ID則是在程式內對於該選項的識別
這點我們在下面的選項處理會繼續說明
接著看到下面的範例:
OnChoiceSelect
{
case reference0
{
when "talk"
{
OnAiTalk
}
when "interval"
{
"想要改變成怎麼樣呢?\n\n/
\q[多話,interval_30]\n/
\q[沉默,interval_0]\e"
}
when "cancel"
{
"\0\s[0]呣。\e"
}
}
}
首先,"OnChoiceSelect"為用來處理選擇後的「所有」事務
個人目前不是很了解其運作,但若有一個以上的"OnChoiceSelect"
程式似乎會出錯,因此必須非常注意「所有」這兩個字
在文(AYA)中,有類似於C的switch條件判斷式
其用法見上例,"case var",var代表之後要用來做判定的變數
範例中使用的"reference0"為選擇選項後傳給OnChoiceSelect的參數
在不同的事件處理中,reference的數量及其代表的意義皆不相同
在OnChoiceSelect中,reference0代表使用者選擇的選擇肢之ID
因此我們用"when "ID""來判定reference0為哪個選項
並對各個選項做處理
這裡可以看到,在talk選項中,會自動導向OnAiTalk事件
而在interval選項中,還包含了兩個選項
這麼做是可以的
假設使用者此時選了"多話"
那麼,"OnChoiceSelect"的"reference0"便會變成"interval_30"
猜測這就是為何不能有多個OnChoiceSelect的原因
最後的"cancel"選項則是讓整個對話結束
另外,我們提到選項處理中可以再新增選項
而新增的選項也必須在同一個OnChoiceSelect中處理
個人推測新增選項的處理必須放在生成該選項的block之外
舉例來說,interval_30是在interval中被生成的
因此,處理interval_30的block必須在interval之後
(以上敘述單純為推測,根據電腦讀取程式碼的順序性,這樣的推測有一定的道理在)
前面提到了只能有一個OnChoiceSelect
為了解決這樣的問題,我從橘花的文件中參考了一些有趣的作法
在說明之前,想先提一下對於「事件發生」與「事件處理」的差別
**事件發生**
以選擇處理為例,不管有沒有OnChoiceSelect的block存在
只要選擇了選項,事件就是會發生
發生這件事並不包含了處理
**事件處理**
事件發生後,我們才能對其做處理
而Ukagaka提供我們許多處理事件用的函式
每個函式都會因為不同事件的發生而得到不同的參數
我們便可以運用這些參數,對事件做出各式各樣的反應
這部分說明僅提供做為參考,若有錯誤,煩請糾正
接著,參考橘花的文件後,可以發現一個"aya_sysex.dic"的文件
我們只需要移植其第一個block
也就是對"OnChoiceSelect"做出一些更動
見以下程式碼:
OnChoiceSelect
{
EVAL("Select.%(reference0)")
}
其中的"EVAL"在上一篇日誌已經有說明了,這裡便不再多做敘述
這裡便會將"Select.%(reference0)"作為指令碼處理
"reference0"跟前面一樣,是指選項的ID
因此,不管在哪個地方遇到"Select.%(reference0)"
都會包含在這裡的"OnChoiceSelect"之中
非常巧妙的迴避了之前提到的問題
真想問問當初的開發者怎麼想到的,太天才了
我們只需要在自己的人格存放dic檔案的地方
新增一個隨意檔名的dic檔
加入上面的程式碼,以UTF-8儲存檔案
並且在人格的資料夾中的"yaya.txt"加上一行:
dic, dic/aya_sysex.dic
這裡以我開發的文件為例,最前面的dic指程式要去開啟的檔案為dic檔
逗號後面則為yaya.txt與dic檔的相對位置
這樣程式啟動時就會自動去開啟這份檔案,讀取並執行其內容了
接著,對於前面的"OnChoiceSelect"的事件處理
可以改成以下形式:
Select.talk
{
OnAiTalk
}
Select.interval
{
"想要改變成怎麼樣呢?\n\n/
\q[多話,interval_30]\n/
\q[沉默,interval_0]\e"
}
Select.cancel
{
"\0\s[0]呣。\e"
}
看起來簡潔許多,也可以在不同文件中做事件處理
真的是一個非常聰明的方式
最後,在本篇日誌最剛開始提到的forced_talk
其實只是在aitalk.dic文件中
另外加上一個forced_talk的block
並在Select.talk的block中
直接加上一行"forced_talk"
這樣處理"talk"選項時
程式便會等機率挑選"OnAiTalk"或"forced_talk"
###BUG###
目前遇到的BUG在主程式更新後便自動消失了
...QAQ
=============================================================
害羞鳥的眨眼與說話動畫的分解動作
為什麼每次半開眼的表情看起來都特別病嬌' ')
via GIPHY
害羞表情動畫的GIF,好可愛
大部分功能的雛型都已經建立好了
接下來就是把表情補完,並且把所有功能再擴充到更加充實
2016/10/17
2016年10月10日 星期一
製作日誌--004
上次更新是上上周的事了((囧
昨天處理完事情已經兩點了,於是現在才來寫日誌
不過這兩周幾乎都在畫圖,進度非常少
###AI對話###
這段時間又新增了幾句AI對話
之後可能會考慮增加與使用者對話的功能
###單語字典###
一樣新增了一些內容
之後應該還是會持續更新
###好感度###
新增了好感度參數,目前只有摸臉動作可以增加好感度
未來不排除有增加與減少好感度的行動
並且所有互動內容都會依照好感度的高低有所分別
**新增自定義參數**
增加參數非常簡單,在bootend.dic裡面就可以新增/減少參數
OnFirstBoot
{
//---- 變數初始化
username = "User"
userbirthday = "未知"
stroke = 0 // 撫摸判定用
teachusername = 0 // 記住user名用
teachuserbirthday = 0 // 記住user生日用
mikireflag = 0 // 見切處理用
communicateratio = 0 // 溝通開始率[%]
intimacy = 0 //好感度
startuptime = 0 //總啟用時間
lastboottime = "%(systemuptime)" //每次啟用時間,用來計算每次開啟人格多少時間
//---- 對話
"\0\s[0]\1\s[10]\0你好,初次見面,我叫南小鳥。\w8\1\s[10]我叫啾啾。\w8\0\s[0]\n請多多指 教。\e"
}
這個部分在芽芽美人格範本bootend.dic的最開始的地方
其中OnFirstBoot意思是人格首次啟動時要執行的事情
首次啟動人格後,這些參數便會記錄到variable.cfg中
未來都可以直接以bootend.dic中定義的名稱來呼叫變數
可以注意範例程式碼裡面已經有"intimacy"(好感度)這個變數了
並且初始設定為0
須注意這裡所有變數都要給予初始值
至於要怎麼控制這個intimacy變數呢
先看看以下程式碼:
OnAiTalk
{
/*
其他資料
*/
"\0\s[0]我也很喜歡%(username)喔\e:eval=(intimacy+=1)"
}
在這個範例程式碼裡面,只要觸發了"我也很喜歡%(username)"這個對話
就會執行"intimacy+=2"
可以注意這裡使用的eval
他會將輸入的字串當作AYA的單一指令執行
也就是說,他不能執行複數個指令
但對於這樣單一變數的操作
使用eval是很方便且簡潔的方式
另外,上面的寫法與下面兩種有一樣的效果:
\e" + EVAL("intimacy+=1")
\e%(intimacy+=1)"
個人比較習慣第一種寫法(範例程式碼的)
另外可以注意,第三種寫法是沒有用到EVAL的
而是直接使用"%"呼叫參數,並對參數做+=2的運算
最後,EVAL一定要使用在\e後面
因為前面有提到,EVAL是將"字串"作為指令執行
如果放在\e前面,因為對話方塊還沒消失
便會把目前intimacy的值印出來
###BUG###
近期發現切換人格的頻率太高的話
容易觸發製作日誌--002中提到的BUG
詳細原因依舊不明
不過只要不一直切換人格
是不會有問題的
========================================================
苦笑和害羞的小鳥
真可愛
via GIPHY
只有錄了轉換成害羞的表情的gif
因為苦笑是直接從一般的檔案修改來的
下次應該會先把害羞表情的動畫做完
2016/10/10
昨天處理完事情已經兩點了,於是現在才來寫日誌
不過這兩周幾乎都在畫圖,進度非常少
###AI對話###
這段時間又新增了幾句AI對話
之後可能會考慮增加與使用者對話的功能
###單語字典###
一樣新增了一些內容
之後應該還是會持續更新
###好感度###
新增了好感度參數,目前只有摸臉動作可以增加好感度
未來不排除有增加與減少好感度的行動
並且所有互動內容都會依照好感度的高低有所分別
**新增自定義參數**
增加參數非常簡單,在bootend.dic裡面就可以新增/減少參數
OnFirstBoot
{
//---- 變數初始化
username = "User"
userbirthday = "未知"
stroke = 0 // 撫摸判定用
teachusername = 0 // 記住user名用
teachuserbirthday = 0 // 記住user生日用
mikireflag = 0 // 見切處理用
communicateratio = 0 // 溝通開始率[%]
intimacy = 0 //好感度
startuptime = 0 //總啟用時間
lastboottime = "%(systemuptime)" //每次啟用時間,用來計算每次開啟人格多少時間
//---- 對話
"\0\s[0]\1\s[10]\0你好,初次見面,我叫南小鳥。\w8\1\s[10]我叫啾啾。\w8\0\s[0]\n請多多指 教。\e"
}
這個部分在芽芽美人格範本bootend.dic的最開始的地方
其中OnFirstBoot意思是人格首次啟動時要執行的事情
首次啟動人格後,這些參數便會記錄到variable.cfg中
未來都可以直接以bootend.dic中定義的名稱來呼叫變數
可以注意範例程式碼裡面已經有"intimacy"(好感度)這個變數了
並且初始設定為0
須注意這裡所有變數都要給予初始值
至於要怎麼控制這個intimacy變數呢
先看看以下程式碼:
OnAiTalk
{
/*
其他資料
*/
"\0\s[0]我也很喜歡%(username)喔\e:eval=(intimacy+=1)"
}
在這個範例程式碼裡面,只要觸發了"我也很喜歡%(username)"這個對話
就會執行"intimacy+=2"
可以注意這裡使用的eval
他會將輸入的字串當作AYA的單一指令執行
也就是說,他不能執行複數個指令
但對於這樣單一變數的操作
使用eval是很方便且簡潔的方式
另外,上面的寫法與下面兩種有一樣的效果:
\e" + EVAL("intimacy+=1")
\e%(intimacy+=1)"
個人比較習慣第一種寫法(範例程式碼的)
另外可以注意,第三種寫法是沒有用到EVAL的
而是直接使用"%"呼叫參數,並對參數做+=2的運算
最後,EVAL一定要使用在\e後面
因為前面有提到,EVAL是將"字串"作為指令執行
如果放在\e前面,因為對話方塊還沒消失
便會把目前intimacy的值印出來
###BUG###
近期發現切換人格的頻率太高的話
容易觸發製作日誌--002中提到的BUG
詳細原因依舊不明
不過只要不一直切換人格
是不會有問題的
========================================================
苦笑和害羞的小鳥
真可愛
via GIPHY
只有錄了轉換成害羞的表情的gif
因為苦笑是直接從一般的檔案修改來的
下次應該會先把害羞表情的動畫做完
2016/10/10
2016年9月26日 星期一
製作日誌--003
未來應該是確定每周更新一次了
然後也有根據其他事情而拖延的可能Orz
今天的進度都是改一些文件的資料而已
只有一些些是跟編程有關,但也都很簡單
以後文章會附上一些編程相關的資訊
供同好參考、交流
###AI對話###
今天又加入了一些AI對話
同時也測試了一個連鎖對話
沒什麼問題
以後應該就會慢慢增加對話內容
**有關對話**
有些編輯的小技巧在文的範本內似乎沒有
我是去別的人格翻來看的
這裡整理了兩項覺得還蠻重要的小技巧
1. 輸出確定子在隨機對話內使用
不知道輸出確定子"--"的人可以去翻翻文的規格書
因為Random Talk本身會是一個大括號
如果在編輯對話內容時直接使用輸出確定子
會導致輸出內容組合錯誤
例如說:
{
"\0\s[0]今天天氣很好。"
--
"\w8\1\s[10]就是說啊。\e"
"\w8\1\s[10]外頭不是在下雨嗎?\w8\0\s[0]\n\n咦咦!?\e"
"\0\s[0]晚餐要吃什麼好呢?\w8\1\s[10]咖哩飯!\e"
}
在上面的例子中,我們的原意是想要輸出:
"今天天氣很好。就是說啊。"
"今天天氣很好。外頭不是在下雨嗎?咦咦!?"
"晚餐要吃什麼好呢?咖哩飯!"
但第三句會被程式認定為是輸出確定子的候補之一,而變成:
"今天天氣很好。就是說啊。"
"今天天氣很好。外頭不是在下雨嗎?咦咦!?"
"今天天氣很好。晚餐要吃什麼好呢?咖哩飯!"
所以這裡我們需要再用一個縮排後的大括號把對話分組:
{
{
"\0\s[0]今天天氣很好。"
--
"\w8\1\s[10]就是說啊。\e"
"\w8\1\s[10]外頭不是在下雨嗎?\w8\0\s[0]\n\n咦咦!?\e"
}
"\0\s[0]晚餐要吃什麼好呢?\w8\1\s[10]咖哩飯!\e"
}
這麼做就可以將最後一句話跟前面天氣的話題隔開
同時不需要將天氣的話題拆成兩句
增加程式的可閱讀性!
2. 連鎖對話
在設計連鎖對話的時候,最怕的就是不熟悉指令及其運作的效果
例如說已經使用了"\e",在下一句對話時仍然加上了"\n"
雖然是很好更正的錯誤
但在編寫時就注意到這些事情可以節省很多修改與測試的時間
這裡直接放上今天寫好的連鎖對話當例子:
"\0\s[0]啾啾有沒有想過以後要成為什麼?\w8\1\s[10]嗯?\w5怎麼突然問這個?\w8\0\s[0]\n\n突然想到而已~\e:chain=Chain1"
Chain1
{{CHAIN
"\w8\1\s[10]也是呢~\w5成為第一隻上太空的鳥吧。\w5\n那小鳥呢?\w8\0\s[0]我想想喔…\w5\n嗯…\w5…\w5…\e"
{
"小鳥想要當"
--
"服裝設計師呢!\w8\1\s[10]很適合嘛~\w5而且你又有天分。\w8\0\s[0]\n\n嘿嘿,到時候小鳥會幫啾啾設計衣服喔!\w5\n啊!\w5也會幫%(username)設計喔!\w8\1\s[10]\n\n怎麼聽起來像是差點忘記%(username)一樣…\w8\0\s[0]\n\n沒,沒有這回事啦!\e:chain=end"
"%(username)的新娘呢!\w8\1\s[10]像個小女孩會說的話呢,\w5\n不過也挺不錯的呀。\w8\0\s[0]\n\n那啾啾要來參加我們的婚禮喔!\w8\1\s[10]\n\n這是一定要的嘛!\e:chain=end"
}
}}CHAIN
第一個要注意的點就是:chain=Chain1要放在雙引號內
個人對於冒號":"的解讀是:直接執行冒號後的函式
所以冒號放的位置是很重要的
如果把:chain=Chain1放到\e之前
會發現開頭的對話是正常的
但卻不會出現接下來的連鎖對話Chain1
因為程式已經執行完chain=Chain1的指令了,之後才執行\e
再來是:chain=end,這個指令會讓程式知道要跳出連鎖對話
回到一般的隨機對話
一般是用在規劃對話路徑用
比如說如果選到這句話,那就不需要接下來的對話
個人習慣是每個連鎖對話的結尾都加上該指令
這麼做並不犯法
因為在芽芽美的範本內是流程控制時在會用到:chain=end指令
只是在我實作時會有問題而已Orz
###單語字典###
更動了一部份的單語內容,讓裡面記載的單語更符合角色
**單語編輯靈活化**
有的人可能會想說單語內容就是把想到的東西全部列舉出來
但在範本中也有用到細層分類的方法
讓同類的單語聚集在一些自定義分類中
不只在單語文件中更容易維護
也可以在其他地方直接呼叫自定義分類
例如:
ms //----人名----
{
history
"小明"
"小華"
}
history //----歷史人物----
{
"劉備"
"關羽"
}
在這裡history就是我們的自定義類別
它同時是ms中的子類別,同時也是一個獨立類別
可以直接用%(history)的方式被呼叫
另外,在單語文件也可以用以下方法,造出較長的子句:
food
{
"加了%(ingredient)的%(method)%(me)"
}
其中ingredient、method、me都是類別的名稱
###滑鼠觸摸&雙擊反應###
把所有觸摸與雙擊反應都補齊了
未來會增加根據好感度不同而產生的反應變化
這裡就跟編輯AI對話差不多
唯一要注意的是要在對的事件裡做對的事情
並且注意流程控制(if、for、while)
###動畫###
將小鳥說話時的動畫補上了
接下來shell的部分就是把表情補齊
**動畫編輯**
目前所有網路上有找到的資料中
對於動畫編輯的敘述都還稍嫌不足(個人看法)
這裡放上一個再更詳細的版本
Surface0
{
/*
其他圖檔資料
*/
//----眨眼----
0interval,rarely
0pattern0,1001,7,overlay,78,112
0pattern1,1002,7,overlay,78,112
0pattern2,1001,7,overlay,78,112
0pattern3,-1,7,overlay,78,112
}
我們先看看這裡眨眼動畫的設定
首先是"0interval",比較重要的是前面的序數
這個序數就是該動畫的編號,因此同一個動畫前面的序數會相同
否則會被認為是不同的動畫
再來是interval後面的"rarely"
這個是代表自然執行頻率,角色在所有時候都會不斷以該頻率執行這個動畫
這裡提供所有可用的頻率關鍵詞:
sometimes:每秒1/2的機率
rarely:每秒1/4的機率
random,數字:每秒(1/數字)的機率
periodic,數字:每(數字)秒一次
always:不斷循環
runonce:切換到該surface的瞬間執行一次
never:不自動執行,但可以由其他動畫呼叫(後面會說明)
yen-e:在該surface下,遇到"\e"時執行
注意"每...的機率"與"每...一次"的不同
所以在上面的例子中,眨眼動作會每秒1/4的機率執行
接下來是"0pattern*",*代表接下來的貼圖順序,最前面的0則是先前提到的動畫序數
pattern後面的"1001"、"1002"等等是指圖片編號
1001代表surface1001.png
1002代表surface1002.png,以此類推
下一個數字是指該圖片的持續時間,單位為ms
因此上面例子每張圖片的持續時間都是7ms
接著"overlay"是指貼圖方式
而overlay的意思是直接覆蓋
貼圖方式有非常多種,這裡就不一一介紹了
有興趣的在網路上都可以找到資料
最後的"78,112"分別是"X座標,Y座標"
這個座標是以原本大圖的最左上角為準來測量
用小畫家就可以量到正確的數據了
因為用來做動畫的圖片尺寸不會太大,只有角色的局部而已
所以貼圖位置會顯得相當重要
一種很安全的方法是
把畫好的半開眼、閉眼圖檔存成全身圖
然後用小畫家選個合適的起始點(注意要是動畫用圖的左上角)
在螢幕下方會出現該點的座標,記錄下來,同時裁切出動畫用圖
接下來是說話動畫的製作,這裡程式碼會比較長:
Surface0
{
// ...
1interval,never
1pattern0,1003,5,overlay,118,177
1pattern1,1004,5,overlay,118,177
1pattern2,1003,5,overlay,118,177
1pattern3,-1,10,overlay,118,177
2interval1,never
2pattern0,1003,5,overlay,118,177
2pattern1,-1,10,overlay,118,177
3interval,talk,4
3pattern0,0,0,alternativestart,[1.2]
}
其中interval的部分應該不用多作敘述,在上面就提過了
另外1003是半開嘴的圖,1004則是全開
我們直接看到3interval後面的"talk,4"
其實這也算是一種頻率指令
"talk"代表在Ballon中有文字出現時執行該動畫
"4"則代表每出現4個字時執行一次
再來看到interval裡面
會發現對序數3中的pateern0來說,圖檔名稱為0,持續時間也為0
這是因為之後要貼的圖片在序數1、2中都已經定義了
也跟接下來的指令有關
"alternativestart"意思是隨機執行中括號內的動畫
而中括號內放的就是動畫的序數,注意序數之間是用點"."隔開,不是用逗號","
另外當使用了alternativestart,程式會自動忽略它所在的pattern的Surface ID(最上面的Surface0)、持續時間、XY座標
這也是為何我們沒有標上上述內容的原因
基本上有上面兩個說明已經足以做出一個完整的shell了
有些特殊的功能則要請有興趣的人自行上網搜尋
###BUG###
同製作日誌--002
=============================================================
張嘴分解動作的小鳥
個人一個動畫是閉→半張→張→半張→閉
另一個是閉→半張→閉
供讀者參考
via GIPHY
說話動畫,實際使用效果還不錯
是說小鳥每次錄影時都會顯瘦@@
2016/09/26
然後也有根據其他事情而拖延的可能Orz
今天的進度都是改一些文件的資料而已
只有一些些是跟編程有關,但也都很簡單
以後文章會附上一些編程相關的資訊
供同好參考、交流
###AI對話###
今天又加入了一些AI對話
同時也測試了一個連鎖對話
沒什麼問題
以後應該就會慢慢增加對話內容
**有關對話**
有些編輯的小技巧在文的範本內似乎沒有
我是去別的人格翻來看的
這裡整理了兩項覺得還蠻重要的小技巧
1. 輸出確定子在隨機對話內使用
不知道輸出確定子"--"的人可以去翻翻文的規格書
因為Random Talk本身會是一個大括號
如果在編輯對話內容時直接使用輸出確定子
會導致輸出內容組合錯誤
例如說:
{
"\0\s[0]今天天氣很好。"
--
"\w8\1\s[10]就是說啊。\e"
"\w8\1\s[10]外頭不是在下雨嗎?\w8\0\s[0]\n\n咦咦!?\e"
"\0\s[0]晚餐要吃什麼好呢?\w8\1\s[10]咖哩飯!\e"
}
在上面的例子中,我們的原意是想要輸出:
"今天天氣很好。就是說啊。"
"今天天氣很好。外頭不是在下雨嗎?咦咦!?"
"晚餐要吃什麼好呢?咖哩飯!"
但第三句會被程式認定為是輸出確定子的候補之一,而變成:
"今天天氣很好。就是說啊。"
"今天天氣很好。外頭不是在下雨嗎?咦咦!?"
"今天天氣很好。晚餐要吃什麼好呢?咖哩飯!"
所以這裡我們需要再用一個縮排後的大括號把對話分組:
{
{
"\0\s[0]今天天氣很好。"
--
"\w8\1\s[10]就是說啊。\e"
"\w8\1\s[10]外頭不是在下雨嗎?\w8\0\s[0]\n\n咦咦!?\e"
}
"\0\s[0]晚餐要吃什麼好呢?\w8\1\s[10]咖哩飯!\e"
}
這麼做就可以將最後一句話跟前面天氣的話題隔開
同時不需要將天氣的話題拆成兩句
增加程式的可閱讀性!
2. 連鎖對話
在設計連鎖對話的時候,最怕的就是不熟悉指令及其運作的效果
例如說已經使用了"\e",在下一句對話時仍然加上了"\n"
雖然是很好更正的錯誤
但在編寫時就注意到這些事情可以節省很多修改與測試的時間
這裡直接放上今天寫好的連鎖對話當例子:
"\0\s[0]啾啾有沒有想過以後要成為什麼?\w8\1\s[10]嗯?\w5怎麼突然問這個?\w8\0\s[0]\n\n突然想到而已~\e:chain=Chain1"
Chain1
{{CHAIN
"\w8\1\s[10]也是呢~\w5成為第一隻上太空的鳥吧。\w5\n那小鳥呢?\w8\0\s[0]我想想喔…\w5\n嗯…\w5…\w5…\e"
{
"小鳥想要當"
--
"服裝設計師呢!\w8\1\s[10]很適合嘛~\w5而且你又有天分。\w8\0\s[0]\n\n嘿嘿,到時候小鳥會幫啾啾設計衣服喔!\w5\n啊!\w5也會幫%(username)設計喔!\w8\1\s[10]\n\n怎麼聽起來像是差點忘記%(username)一樣…\w8\0\s[0]\n\n沒,沒有這回事啦!\e:chain=end"
"%(username)的新娘呢!\w8\1\s[10]像個小女孩會說的話呢,\w5\n不過也挺不錯的呀。\w8\0\s[0]\n\n那啾啾要來參加我們的婚禮喔!\w8\1\s[10]\n\n這是一定要的嘛!\e:chain=end"
}
}}CHAIN
第一個要注意的點就是:chain=Chain1要放在雙引號內
個人對於冒號":"的解讀是:直接執行冒號後的函式
所以冒號放的位置是很重要的
如果把:chain=Chain1放到\e之前
會發現開頭的對話是正常的
但卻不會出現接下來的連鎖對話Chain1
因為程式已經執行完chain=Chain1的指令了,之後才執行\e
再來是:chain=end,這個指令會讓程式知道要跳出連鎖對話
回到一般的隨機對話
一般是用在規劃對話路徑用
比如說如果選到這句話,那就不需要接下來的對話
個人習慣是每個連鎖對話的結尾都加上該指令
這麼做並不犯法
因為在芽芽美的範本內是流程控制時在會用到:chain=end指令
只是在我實作時會有問題而已Orz
###單語字典###
更動了一部份的單語內容,讓裡面記載的單語更符合角色
**單語編輯靈活化**
有的人可能會想說單語內容就是把想到的東西全部列舉出來
但在範本中也有用到細層分類的方法
讓同類的單語聚集在一些自定義分類中
不只在單語文件中更容易維護
也可以在其他地方直接呼叫自定義分類
例如:
ms //----人名----
{
history
"小明"
"小華"
}
history //----歷史人物----
{
"劉備"
"關羽"
}
在這裡history就是我們的自定義類別
它同時是ms中的子類別,同時也是一個獨立類別
可以直接用%(history)的方式被呼叫
另外,在單語文件也可以用以下方法,造出較長的子句:
food
{
"加了%(ingredient)的%(method)%(me)"
}
其中ingredient、method、me都是類別的名稱
###滑鼠觸摸&雙擊反應###
把所有觸摸與雙擊反應都補齊了
未來會增加根據好感度不同而產生的反應變化
這裡就跟編輯AI對話差不多
唯一要注意的是要在對的事件裡做對的事情
並且注意流程控制(if、for、while)
###動畫###
將小鳥說話時的動畫補上了
接下來shell的部分就是把表情補齊
**動畫編輯**
目前所有網路上有找到的資料中
對於動畫編輯的敘述都還稍嫌不足(個人看法)
這裡放上一個再更詳細的版本
Surface0
{
/*
其他圖檔資料
*/
//----眨眼----
0interval,rarely
0pattern0,1001,7,overlay,78,112
0pattern1,1002,7,overlay,78,112
0pattern2,1001,7,overlay,78,112
0pattern3,-1,7,overlay,78,112
}
我們先看看這裡眨眼動畫的設定
首先是"0interval",比較重要的是前面的序數
這個序數就是該動畫的編號,因此同一個動畫前面的序數會相同
否則會被認為是不同的動畫
再來是interval後面的"rarely"
這個是代表自然執行頻率,角色在所有時候都會不斷以該頻率執行這個動畫
這裡提供所有可用的頻率關鍵詞:
sometimes:每秒1/2的機率
rarely:每秒1/4的機率
random,數字:每秒(1/數字)的機率
periodic,數字:每(數字)秒一次
always:不斷循環
runonce:切換到該surface的瞬間執行一次
never:不自動執行,但可以由其他動畫呼叫(後面會說明)
yen-e:在該surface下,遇到"\e"時執行
注意"每...的機率"與"每...一次"的不同
所以在上面的例子中,眨眼動作會每秒1/4的機率執行
接下來是"0pattern*",*代表接下來的貼圖順序,最前面的0則是先前提到的動畫序數
pattern後面的"1001"、"1002"等等是指圖片編號
1001代表surface1001.png
1002代表surface1002.png,以此類推
下一個數字是指該圖片的持續時間,單位為ms
因此上面例子每張圖片的持續時間都是7ms
接著"overlay"是指貼圖方式
而overlay的意思是直接覆蓋
貼圖方式有非常多種,這裡就不一一介紹了
有興趣的在網路上都可以找到資料
最後的"78,112"分別是"X座標,Y座標"
這個座標是以原本大圖的最左上角為準來測量
用小畫家就可以量到正確的數據了
因為用來做動畫的圖片尺寸不會太大,只有角色的局部而已
所以貼圖位置會顯得相當重要
一種很安全的方法是
把畫好的半開眼、閉眼圖檔存成全身圖
然後用小畫家選個合適的起始點(注意要是動畫用圖的左上角)
在螢幕下方會出現該點的座標,記錄下來,同時裁切出動畫用圖
接下來是說話動畫的製作,這裡程式碼會比較長:
Surface0
{
// ...
1interval,never
1pattern0,1003,5,overlay,118,177
1pattern1,1004,5,overlay,118,177
1pattern2,1003,5,overlay,118,177
1pattern3,-1,10,overlay,118,177
2interval1,never
2pattern0,1003,5,overlay,118,177
2pattern1,-1,10,overlay,118,177
3interval,talk,4
3pattern0,0,0,alternativestart,[1.2]
}
其中interval的部分應該不用多作敘述,在上面就提過了
另外1003是半開嘴的圖,1004則是全開
我們直接看到3interval後面的"talk,4"
其實這也算是一種頻率指令
"talk"代表在Ballon中有文字出現時執行該動畫
"4"則代表每出現4個字時執行一次
再來看到interval裡面
會發現對序數3中的pateern0來說,圖檔名稱為0,持續時間也為0
這是因為之後要貼的圖片在序數1、2中都已經定義了
也跟接下來的指令有關
"alternativestart"意思是隨機執行中括號內的動畫
而中括號內放的就是動畫的序數,注意序數之間是用點"."隔開,不是用逗號","
另外當使用了alternativestart,程式會自動忽略它所在的pattern的Surface ID(最上面的Surface0)、持續時間、XY座標
這也是為何我們沒有標上上述內容的原因
基本上有上面兩個說明已經足以做出一個完整的shell了
有些特殊的功能則要請有興趣的人自行上網搜尋
###BUG###
同製作日誌--002
=============================================================
張嘴分解動作的小鳥
個人一個動畫是閉→半張→張→半張→閉
另一個是閉→半張→閉
供讀者參考
via GIPHY
說話動畫,實際使用效果還不錯
是說小鳥每次錄影時都會顯瘦@@
2016/09/26
2016年9月19日 星期一
製作日誌--002
開學之後把電腦搬到了宿舍
變成假日回家沒有電腦的狀態Orz
以後可能一個星期才會更新一次
看來進度會十分緩慢
今天的進度不算少
但也冒出了新的BUG
下面會一一說明
###報時功能###
現在Ghost只要整點就會報時
每個時間的內容都不一樣
未來考慮會再增加對話
讓報時功能更多樣化
如果有成功追加好感度的話
會考慮以好感度做判定
而有不同的報時對話
###初始參數###
在序篇有提過
這個偽春菜人格是個人使用的
因此初始參數也調整成個人的資料
目前也成功可以使用
但還沒加入更改參數(ex.用戶名、生日)的功能
###對話###
對話已經被我刪到剩兩句
一句是自己新增的
另一句是AYA範本的連鎖對話
###動畫###
Sakura的預設表情已經有眨眼動畫了
另外,Sakura和Kero的預設表情也已經完工了
接下來計畫先做出Sakura的說話動畫
再開始處理其他表情的圖片
而Kero端是否要有動畫則還在考慮中
###BUG###
從其他人格切換到小鳥的時候
Sakura端的Balloon不會正常顯示
但程式依然會正常運作
即使等到了下個AiTalk
也只有Kero端的Balloon會顯示
這個問題目前可以利用右鍵選單的"アイコン化"解決
另外,如果是重啟人格便不會有以上BUG
via GIPHY
自己錄的眨眼動畫,畫質不好請見諒
目前實在還想不到這隻的名字
暫且叫他啾啾
2016/09/19
變成假日回家沒有電腦的狀態Orz
以後可能一個星期才會更新一次
看來進度會十分緩慢
今天的進度不算少
但也冒出了新的BUG
下面會一一說明
###報時功能###
現在Ghost只要整點就會報時
每個時間的內容都不一樣
未來考慮會再增加對話
讓報時功能更多樣化
如果有成功追加好感度的話
會考慮以好感度做判定
而有不同的報時對話
###初始參數###
在序篇有提過
這個偽春菜人格是個人使用的
因此初始參數也調整成個人的資料
目前也成功可以使用
但還沒加入更改參數(ex.用戶名、生日)的功能
###對話###
對話已經被我刪到剩兩句
一句是自己新增的
另一句是AYA範本的連鎖對話
###動畫###
Sakura的預設表情已經有眨眼動畫了
另外,Sakura和Kero的預設表情也已經完工了
接下來計畫先做出Sakura的說話動畫
再開始處理其他表情的圖片
而Kero端是否要有動畫則還在考慮中
###BUG###
從其他人格切換到小鳥的時候
Sakura端的Balloon不會正常顯示
但程式依然會正常運作
即使等到了下個AiTalk
也只有Kero端的Balloon會顯示
這個問題目前可以利用右鍵選單的"アイコン化"解決
另外,如果是重啟人格便不會有以上BUG
眨眼分解動作中的小鳥
via GIPHY
自己錄的眨眼動畫,畫質不好請見諒
目前實在還想不到這隻的名字
暫且叫他啾啾
2016/09/19
2016年9月11日 星期日
製作日誌--001
這幾天花了不少時間在看編成的文件
中文的教程大約三年前就停止更新了
不過找到了還存活著的日文文件
只有這種時候才覺得會日文很好
目前有完成的只有Sakura與Kero的預設表情
而且只上了底色
畫出來的圖比想像中的還大
但還不考慮縮小
中文的教程大約三年前就停止更新了
不過找到了還存活著的日文文件
只有這種時候才覺得會日文很好
目前有完成的只有Sakura與Kero的預設表情
而且只上了底色
畫出來的圖比想像中的還大
但還不考慮縮小
將紺野芽芽美的ghost整個複製一份
目前只有把shell中descript.txt和profile以外的資料清空
把surface.txt與圖檔換成小鳥的資料
個人覺得還不錯
短腿鳥
恩...
2016/09/11
2016年9月8日 星期四
製作日誌--序
第一次接觸偽春菜是在國中的時候
當時沒有接觸過任何程式語言
讀人格製作的教學文件變成一件很辛苦的事情
只能做到修改AiTalk的程度
前陣子突然想起偽春菜
在網路上搜尋了一下
以前的用過的人格、教學文件等等的資料依然還在
加上對程式語言有一些基礎的了解
重新有了要製作一個全新的人格的想法
目前決定要製作一個LL小鳥的人格
主要是私用,畢竟人物有版權問題
如果有意外的話(?),可能會再製作另一種公開用的人格
參考了一些教學文章,決定用AYA語法編寫Shiori
架構會直接採用AYA的人格範本──紺野芽芽美
不過整體的製作會從Surface開始
##一定會搭載的功能##
隨機對話
報時
鬧鐘
使用者碰觸反應
特殊節日、時間的起始對話
記住使用者的名字、生日
調整對話頻率
##可能會搭載的功能##
好感度
重疊反應
見切(人物圖像有一部份)被放置於螢幕外)
雙擊菜單功能調整
其餘的就是未知項目了' ')
2016/09/08
當時沒有接觸過任何程式語言
讀人格製作的教學文件變成一件很辛苦的事情
只能做到修改AiTalk的程度
前陣子突然想起偽春菜
在網路上搜尋了一下
以前的用過的人格、教學文件等等的資料依然還在
加上對程式語言有一些基礎的了解
重新有了要製作一個全新的人格的想法
目前決定要製作一個LL小鳥的人格
主要是私用,畢竟人物有版權問題
如果有意外的話(?),可能會再製作另一種公開用的人格
參考了一些教學文章,決定用AYA語法編寫Shiori
架構會直接採用AYA的人格範本──紺野芽芽美
不過整體的製作會從Surface開始
##一定會搭載的功能##
隨機對話
報時
鬧鐘
使用者碰觸反應
特殊節日、時間的起始對話
記住使用者的名字、生日
調整對話頻率
##可能會搭載的功能##
好感度
重疊反應
見切(人物圖像有一部份)被放置於螢幕外)
雙擊菜單功能調整
其餘的就是未知項目了' ')
2016/09/08
訂閱:
文章 (Atom)