鐵之狂傲

 取回密碼
 註冊
搜尋

無名的勇者

天繾寶寶說你好

切換到指定樓層
1#
機翻整理自名前表示ウィンドウの実装~defsubその1
                    名前表示ウィンドウの実装~defsubその2,錯誤請指證。


閱讀建議 把下面前置點數點完
    1.Count D的
Nscripter全攻略 消化完畢
    2.偽聖書 有看沒全懂
    3.
中文不完全手冊擺手邊
    4.
NS自製系統入門1-textgosub
    5.
NS自製系統2-換行換頁的實裝
  6.NS自製系統3-游標的實裝



本回使用

defsub     既存命令的調換。和globalon連用可以取得或更改某些變數的值。
caption    變更窗口標題欄
mov         
給變數值
+              
一般意義的加號
getparam  
當呼叫自定義命令時,讀入命令後的文字
len           文字列的字數回傳給數字變數
div         
除法


前言電子小說有各式各樣的文字框設計。
  現在教的是普通的名前框,還算基本範圍。
  不過,以自製系統來說是很好的教學。
  使用defsub命令,往後的程式碼能夠變的簡潔而直覺。

  自製系統,隨著機能追加,
  以往NScripter程式碼變得不易閱讀,記述也往往變得繁雜。
  用defsub命令,可以大幅度改善此種情況。

  要熟悉defsub多多少少需要程式編制的思考。
  總而言之,先從簡單的東西試著理解吧。
  這裏省略基礎說明,主要敎使用defsub的命令。



[ 本文最後由 發條人形紅舞鞋 於 08-3-1 12:02 AM 編輯 ]

[ 本文章最後由 發條人形紅舞鞋 於 08-7-2 18:54 編輯 ]

name_window.rar

966 Bytes, 下載次數: 281, 下載積分: 鐵幣 -5 元

名前框

 
轉播0 分享0 收藏0

回覆 使用道具 檢舉

總評分:  聲望 + 11   檢視全部評分
myway0619    發表於 12-5-21 20:41 聲望 + 1 枚
dghylkop  這篇好正點!  發表於 08-1-21 18:15 聲望 + 5 枚
soking  喔喔喔喔喔喔喔喔喔@w@  發表於 08-1-21 01:02 聲望 + 5 枚

無名的勇者

天繾寶寶說你好

程式構思

程式構思1.素材與介面構想
  首先,準備名前框的素材、決定位置。
  像在這樣在PHOTOSHOP完成偽介面。

偽‧介面
  名前框橘色範圍、
  也就是從左上角到右下角以名字的字數來算的話,可以容納6字。
    (根據字數變更名前框尺寸是比較好的選擇,但是現在先擺旁邊~)
  文字置中+不超過框。名字是由於文字sp繪出。

2.SP圖片編號確定
sp號碼往後調整會比較好(為了其他系統做準備)
  這裏先把名前框設定5號。

  
SP使用一覽
  lsph 0,":l/3,60,2;img\cursor0.bmp",0,0                ;單擊等候游標
  lsph 1,":l/3,60,2;img\cursor1.bmp",0,0                ;換頁等候游標
  lsph 5,"img\name_window.bmp",20,383                ; 名前框


  游標用的sp,依被表示的文字列位置而變更,
  座標指定X=0,是Y=0。
  不過,在這裡名前框是固定的,絕對要預先指定好!
  先試著考慮往後程式腳本的格式,會比較好寫。

3.程式腳本格式構想
  
預想的腳本格式
  name "發條人形"根據自己實裝的命令,@為了讓劇本簡單清楚易閱讀,@
  必須要已視覺化方式寫程式腳本。\

  name "紅舞鞋"某種程度預先堅實系統,@
  積極地空出時間在創作劇本上。\


4.自定義命令執行方式構想
  自定義「name」命令。
  試著思考執行的內容。

name文字列
  名字框自動表示。
  在沒有字串的內容的情況(name "")名字框自動被遮住。
  文字是名前框在裡顯示。

  接下來是defsub的解說。

defsub 命令名
  定義區用。
  首先,從簡單的例子理解吧。
  簡單的用法,是既存命令的調換。
  和globalon連用可以取得或更改某些變數的值。



[ 本文最後由 發條人形紅舞鞋 於 08-1-10 03:08 AM 編輯 ]
 

回覆 使用道具 檢舉

無名的勇者

天繾寶寶說你好

實裝前測試

實裝前測試1.defsub簡單例子
  1. *define

  2.     game

  3.     defsub *sin;用defsub定義sin命令



  4.     *start

  5.     sin   %0,2,5

  6.     %0

  7.     click

  8.     end



  9.     *sin  

  10.     getparam %0,%1,%2;sin命令取得指定的三個

  11.     mov %0,%1 + %2;變數1+2的值、帶入變數0

  12.     return
複製代碼


defsub 效果
sin圖
這裏製作製作「sin」命令。
        參數有三個。
        有關其他defsub命令請參考最新版的NScripter的手冊,
        樣品文件夾內有defsub樣品。


再來作「name」命令。

2.name執行簡單測試
  1. *define

  2.         defsub name                ;用defsub定義name命令

  3.         game

  4.         *start

  5.         name "發條人形"                ; name命令跳躍到標籤*name

  6.         根據自己實裝的命令,@為了讓劇本簡單清楚易閱讀,@

  7.         必須要已視覺化方式寫程式腳本。\

  8.         name "紅舞鞋"某種程度預先堅實系統,@

  9.         積極地空出時間在創作劇本上。\

  10.         click

  11.         end

  12.         *name

  13.                 getparam $0        ;用name命令取得被指定的文字列

  14.                 caption $0 ;變更框的文字為$0

  15.         return
複製代碼


name 效果
NAME
      這樣defsub命令基本地與getparam命令一起使用。

getparam
        當呼叫自定義命令時,讀入命令後的文字。
        這裏出現的name,不是名前框的意思,而是讀入name之後的文字。
        使用上須劃定特殊變數區,兩個用於getparam的變數之間不能有任何其他功能的變數。
        舉例來說紀錄用%90、顯示圖片用%95,那%93不可以這兩者以外的功能。

        總之,用這個標籤「*name」,做名前框的處理,前述的功能應該能實現。
        如果沒使用上述的腳本defsub命令,會變得以下情況。

PS.不用defsub實裝name功能的情況.....
  1. *define

  2.         Game



  3.         *start



  4.         mov $0," 發條人形" ;文字變數0代入發條人形

  5.         gosub *name

  6.         根據自己實裝的命令,@為了讓劇本簡單清楚易閱讀,@

  7.         必須要已視覺化方式寫程式腳本。\



  8.         mov $0, "紅舞鞋"  ; 文字變數0代入紅舞鞋

  9.         gosub *name

  10.         某種程度預先堅實系統,@

  11.         積極地空出時間在創作劇本上。\

  12.         click

  13.         end

  14.         *name

  15.                 caption $0 ;變更框的文字為$0

  16.         return
複製代碼


        程式腳本變的麻煩而不直觀。
        (雖然說這個例子可以用「caption」命令一發解決)

<注意>
        在defsub副程式使用的變數和在原腳本使用的變數,千萬不要混雜使用。
        舉例來說%0-%49用在普通的腳本、%50-%99用在defsub副程式。



[ 本文最後由 發條人形紅舞鞋 於 08-1-18 02:08 AM 編輯 ]
 

回覆 使用道具 檢舉

無名的勇者

天繾寶寶說你好

程式碼更新

程式碼更新
      目前為止的程式腳本~
**為主要變更點
  1. ;mode800
  2.       *define
  3.       defsub name  ;**
  4.       humanz 100
  5.       windowback
  6.       transmode alpha
  7.       rubyon 10,10
  8.       shadedistance 1,2
  9.       useescspc
  10.       textgosub *custom
  11.       game
  12.       *start
  13.       goto *game_start
  14.       ;========================================================
  15.       ;客製化系統
  16.       ;========================================================
  17.       *custom

  18.               ispage %0                                          ;取得單擊等候取得換頁等候
  19.               getcursorpos %1,%2                                ;取得文本的末尾的座標

  20.               if %0 = 1        amsp 1,%1,%2:vsp 1,1:vsp 0,0        ;單擊等候時候的處理
  21.               if %0 = 0        amsp 0,%1,%2:vsp 0,1:vsp 1,0        ;改變頁等候時候的處理

  22.               print 1
  23.               *btn_loop
  24.                               btndef clear        ; 按鈕定義清除
  25.               textbtnwait %0

  26.               if %0 = 0        goto *text_end                ;按鈕以外的點擊
  27.               if %0 = -1        goto *btn_loop                ;右鍵點擊
  28.               if %0 = -10        end                        ; ESC鍵結束
  29.               goto *btn_loop

  30.       *text_end

  31.               ;游標消除
  32.               vsp 0,0
  33.               vsp 1,0
  34.               print 1
  35.                       texec        ;換頁圖示等游標消去
  36.               saveon        ;textgosub的自動saveoff指令改為saveon
  37.       return
  38.       ;========================================================
  39.       ;名前表示 ;**
  40.       ;========================================================
  41.       *name ;**
  42.               getparam $0 ;**
  43.       return ;**
  44.       ;========================================================
  45.       ; 遊戲開始
  46.       ;========================================================
  47.       *game_start

  48.       lsph 0,":l/3,60,2;img\cursor0.bmp",0,0                ;單擊等候游標
  49.       lsph 1,":l/3,60,2;img\cursor1.bmp",0,0                ;換頁等候游標
  50.       lsph 5,"img\name_window.bmp",20,383                ;名前框**

  51.       erasetextwindow 0

  52.       setwindow 64,448,24,5,26,28,2,10,50,1,1,"img\text_window.bmp",20,430
  53.       bg #888888,1

  54.       name "發條人形" ;**
  55.   根據自己實裝的命令,@為了讓劇本簡單清楚易閱讀,@
  56. 必須要已視覺化方式寫程式腳本。\


  57.       name "紅舞鞋" ;**
  58.     某種程度預先堅實系統,@
  59. 積極地空出時間在創作劇本上。\


  60.       end
複製代碼


[ 本文最後由 發條人形紅舞鞋 於 08-1-20 12:57 PM 編輯 ]
 

回覆 使用道具 檢舉

無名的勇者

天繾寶寶說你好

修正程式腳本的思考

修正程式腳本的思考

取得文字數
*name
getparam $0
return


繼續修正程式腳本的內容,
試著思考名前框運作的流程。

getparam取得的文字列的文字數(主要因為’’雙引號’’)

文字數如果是0,名前框消失

如果文字數是0以外,在對應的位置顯示文字sp
變成這樣的感覺~


首先,取得文字數。
getparam $0        ;取得指定的文字列
len %0,$0                ;文字列$0的字數回傳給數字變數%0
div %0,2                ;從len命令得到的字数是半形字數所以除以2就變成全形字數


運算後的字數結果會回傳給%0。
不過文字數是0的情況還沒有寫出來,繼續努力奮鬥。***
※        SP號碼4名字文字雪碧,5是名前框的SP號碼。


文字數為0的情況
if %0 = 0 vsp 5,0:print 1:return

如果字數是0消去SP號碼5,刷新畫面,並且從gosub跳躍返回。



文字數不為0的情況(以3為例)
if %0 = 3 lsph 4,":s/26,28,0;#FFFFFF$0",88,391
vsp 4,1
vsp 5,1
print 1


如果文字數是3,定義文字SP
顯示文字SP
顯示名前框
刷新畫面

這樣就大概完工了,歸結成以下的腳本。
 

回覆 使用道具 檢舉

無名的勇者

天繾寶寶說你好

歸納腳本與解說

歸納腳本與解說
綜合以上腳本
*name
csp 4;消除文字SP
                getparam $0;取得指定的文字變數0
        len %0,$0        ;文字變數$0的字數帶入數字變數%0
        div %0,2;len得到的字數是半形除以2就變成全形字數
                if %0 = 0 vsp 5,0:print 1:return        ;如果文字為0,作此處理
        if %0 = 1 lsph 4,":s/26,28,0;#FFFFFF$0",114,391;如果文字為1,作此處理
        if %0 = 2 lsph 4,":s/26,28,0;#FFFFFF$0",101,391;如果文字為2,作此處理
        if %0 = 3 lsph 4,":s/26,28,0;#FFFFFF$0",88,391;如果文字為3,作此處理
        if %0 = 4 lsph 4,":s/26,28,0;#FFFFFF$0",75,391;如果文字為4,作此處理
        if %0 = 5 lsph 4,":s/26,28,0;#FFFFFF$0",62,391;如果文字為5,作此處理
        if %0 = 6 lsph 4,":s/26,28,0;#FFFFFF$0",49,391;如果文字為6,作此處理
                ;名前框顯示
        vsp 4,1
        vsp 5,1
        print 1
return



解說
如果按照順序思考,並不是那麼難的事吧。

◎div可以省略?
在這裏為了易懂,對全形計算用div處理,
不過,刪掉「div %0,2」那一行,if的數字全部×2也沒有關係。

◎用程式計算與各自的文字數對應了顯示座標也許比較好?
(知道文字數和字元大小,計算座標並不是什麼困難的事)
用程式算出說不定比較威,
但是用指定了NScripter的動作比較輕快。
沒有必要頻繁通過的副程式勉強計算。

◎len奇數的情況?
文字變數$0,len取得的數值不考慮作為奇數的情況。
要實裝奇數,請示著考慮’’無論如何也想那樣處理的情況’’。

用副程式的開頭實行saveoff的話,更能加快速度。
SAVE的處理之後敘述。

總結了這裏的腳本。
請嘗試看看~

依前述本次自定name命令
name ‘’文字’’
文字數是0的情況,遮住名前框。(獨白的時候等等)
使用文字的最大數為全形6字。
 

回覆 使用道具 檢舉

無名的勇者

天繾寶寶說你好

更新程式碼

更新程式碼

  1. ;mode800
  2. *define
  3. defsub name
  4. humanz 100
  5. windowback
  6. transmode alpha
  7. shadedistance 1,2
  8. useescspc
  9. textgosub *custom
  10. game
  11. *start
  12. goto *game_start
  13. ;===========================================================
  14. ;客製化系統
  15. ;===========================================================
  16. *custom
  17. ispage %0; 取得單擊等候取得換頁等候
  18. getcursorpos %1,%2;取得文本的末尾的座標
  19. if %0 = 1        amsp 1,%1,%2:vsp 1,1:vsp 0,0        ;單擊等候時候的處理
  20. if %0 = 0        amsp 0,%1,%2:vsp 0,1:vsp 1,0        ;換頁等候時候的處理
  21. print 1

  22. *btn_loop
  23.         btndef clear; 按鈕定義清除
  24.         textbtnwait %0

  25.         if %0 = 0        goto *text_end;按鈕以外的點擊
  26.         if %0 = -1        goto *btn_loop        ;右鍵點擊
  27.         if %0 = -10        end;ESC鍵結束
  28.         goto *btn_loop

  29. *text_end        ;游標消除
  30.         vsp 0,0
  31.         vsp 1,0
  32.         print 1
  33.         texec;換頁等候的情況消去對話框
  34.         saveon; textgosub的自動saveoff指令改為saveon
  35. return

  36. ;=================================================
  37. ;名前表示**
  38. ;=================================================
  39. *name
  40.         csp 4;消除文字SP
  41.         getparam $0;取得指定的文字變數0
  42.         len %0,$0        ;文字變數$0的字數帶入數字變數%0
  43.         div %0,2;len得到的字數是半形除以2就變成全形字數
  44.         if %0 = 0 vsp 5,0:print 1:return        ;如果文字為0,作此處理
  45.         if %0 = 1 lsph 4,":s/26,28,0;#FFFFFF$0",114,391;如果文字為1,作此處理
  46.         if %0 = 2 lsph 4,":s/26,28,0;#FFFFFF$0",101,391;如果文字為2,作此處理
  47.         if %0 = 3 lsph 4,":s/26,28,0;#FFFFFF$0",88,391;如果文字為3,作此處理
  48.         if %0 = 4 lsph 4,":s/26,28,0;#FFFFFF$0",75,391;如果文字為4,作此處理
  49.         if %0 = 5 lsph 4,":s/26,28,0;#FFFFFF$0",62,391;如果文字為5,作此處理
  50.         if %0 = 6 lsph 4,":s/26,28,0;#FFFFFF$0",49,391;如果文字為6,作此處理
  51.         ;名前框顯示
  52.         vsp 4,1
  53.         vsp 5,1
  54.         print 1
  55.         return

  56. ;========================================================
  57. ; 遊戲開始
  58. ;========================================================
  59. *game_start
  60.     lsph 0,":l/3,60,2;img\cursor0.bmp",0,0                ;單擊等候游標
  61.     lsph 1,":l/3,60,2;img\cursor1.bmp",0,0                ;換頁等候游標
  62.     lsph 5,"img\name_window.bmp",20,383                ;名前框**
  63.     erasetextwindow 0
  64.     setwindow 64,448,24,5,26,28,2,10,50,1,1,"img\text_window.bmp",20,430
  65.     bg #888888,1
  66.     name "發條人形" ;**
  67. 根據自己實裝的命令,@為了讓劇本簡單清楚易閱讀,@
  68. 必須要已視覺化方式寫程式腳本。\
  69.     name "紅舞鞋" ;**
  70.     某種程度預先堅實系統,@
  71. 積極地空出時間在創作劇本上。\
  72.     end
複製代碼
 

回覆 使用道具 檢舉

無名的勇者

天繾寶寶說你好

測試結果

測試結果

測試結果

現在的狀態,不做「遮住對話框」的動作,
之後對話框合起處理,名前框變得需要切換顯示狀態等等的處理。


[ 本文最後由 發條人形紅舞鞋 於 08-2-29 11:56 PM 編輯 ]
 

回覆 使用道具 檢舉

你需要登入後才可以回覆 登入 | 註冊

存檔|手機版|聯絡我們|新聞提供|鐵之狂傲

GMT+8, 24-12-5 04:17 , Processed in 0.033859 second(s), 18 queries , Gzip On.

回頂部