鐵之狂傲

標題: NScripter全攻略 [列印本頁]

作者: dghylkop    時間: 07-12-20 08:52
標題: NScripter全攻略
首先感謝*幻想森林*的*CountD*大
同意我們轉載他的文章@V@"(拉炮~
CountD大一直很致力於教學的分享,與規劃。
在此感謝他長期的犧牲奉獻,努力提供很多新手幫忙。
以前小弟也是長看CountD解說每個人程式上的問題,深受幫助。

此篇暫時勿回

以下是轉載的資訊來源。

-----------------------------------------------------
名稱:幻想森林論壇
類別:程式相關討論
連結:http://bbs.rpgchina.com/index.php
語言:簡體中文
-----------------------------------------------------

個別原始文章連結
-----------------------------------------------------
文章作者:CountD

NScripter全攻略:LEVEL 0
連結:http://bbs.rpgchina.com/read.php?tid=14066&fpage=1
NScripter全攻略:LEVEL 1 Hello World !
連結:http://bbs.rpgchina.com/read.php?tid=14075&fpage=1
NScripter全攻略:LEVEL 2 背景與人物的顯示
連結:http://bbs.rpgchina.com/read.php?tid=14216&fpage=1
NScripter全攻略:LEVEL 3 透明,透明!反鋸齒圖片製作與對話框
連結:http://bbs.rpgchina.com/read.php?tid=15603&fpage=1
NScripter全攻略:LEVEL 4 向左走,向右走 選擇與跳轉、變量入門
連結:http://bbs.rpgchina.com/read.php?tid=15638&fpage=1
NScripter全攻略:LEVEL 5 LSP的混沌宇宙  (1) 圖片的顯示與動畫
連結:http://bbs.rpgchina.com/read-htm-tid-23453.html
NScripter全攻略:LEVEL 6 LSP的混沌宇宙  (2) 顯示數字,文字及簡單按鈕製作
連結:http://bbs.rpgchina.com/read-htm-tid-28672.html
NScripter全攻略:LEVEL 7 LSP的混沌宇宙(3) 用EXBTN升級你的系統畫面
連結:http://bbs.rpgchina.com/read-htm-tid-29898.html
-----------------------------------------------------

文章有部分修正@V@"
修成比較適合鐵傲閱讀的排版方式
還有繁體中文化而已!~

[ 本文章最後由 dghylkop 於 08-7-3 05:50 編輯 ]
作者: dghylkop    時間: 07-12-20 08:53
NScripter講習所初心者系列

LEVEL 0

題外話:
先扯幾句,以免被人說我寫下的都是中文但是沒人看得懂。

關於中文NScripter漫長的歷史……
NScripter,作者高橋直樹,略稱NS,是一款遊戲編輯器,換用通俗的語言來說,就是一個做遊戲的軟件。
早在N年以前,大明(sdlhm520)和小勝兩位先行者就已經推出了NScripter的中文版。
不過,NScripter真正開始熱門起來,應該是從黑影團製作出的《青鳥之虛象》宣傳開始的時候吧?
當發現這世界上居然還存在著可以做遊戲的好東西(並且是免費軟件),大批人,包括某D,製作遊戲的熱血頓時就熊熊燃燒起來了。
然而總之但是,或許是出於「商業機密」的考慮,黑影團對於NS的製作方面的任何資料都守口如瓶。於是一幫BT在碰壁無數次之下,決定拿出菜鳥之終級法寶:GOOGLE和BAIDU,對找到的信息進行地毯式篩選。其中,小渡君率先完成了NScripter的新版本不完全漢化。之後,終於,在長久的尋找之後,某D和小渡君與AVC君,地下黨一般的接上了頭。之後的數月裡,日文盲某D每天潛水於NS官方討論版,希望從一堆日文裡找到看起來親切的代碼……

直到今天,得以和大家分享的這些NScripter資料,其實,是一群BT的汗水的結晶。

上面提到的所有名字,請大家牢記……(不是默哀……= =)

口號:同人精神永垂不朽!——支持原創!保護版權!技術共享!

-----------------------------------------------------

問題一:
NScripter能做什麼樣的遊戲?我聽說這是一款NVL(電子小說)專用的製作工具?

咳咳,首先來看一下目前已經製作完成,或者正在製作的一部分NS遊戲。

商業遊戲(日):
月東日西(高橋直樹)(戀愛冒險)
夢みてナイト(高橋直樹)(戀愛冒險)

同人遊戲(中):
Glassic(幻燈領域製作組)(電子小說)
青空之想試玩版II(S.F工作室)(戀愛養成+商店系統+物品合成+……)

同人遊戲(日):
只推薦一個站點。看了他們的遊戲介紹,就該知道這有多BT……
犬と猫
這個組的全部遊戲都是用NS完成的……包括SLG等……
當然大家最好不要和他們拼BT,全日本也就這一家而已。

範例遊戲:
某D的偽聖書(戀愛冒險)
TOZ君的鍵控四方向行走範例(RPG行走)
水螅的範例小遊戲合集(小遊戲)

看了以上的列表就很容易瞭解,NScripter的製作遊戲範圍其實是非常廣泛的,從最簡單的電子小說,戀愛冒險遊戲,到養成遊戲及卡片戰鬥系統,都可以完成。所以各位大可不必一直憂心忡忡的詢問,NScripter能否完成這樣那樣的功能。答案幾乎永遠是YES,其關鍵只在於製作者本身的水平。

但是,NS主要應用範圍,是集中在戀愛冒險遊戲這一類型的。
從程序方面看,戀愛冒險類型的遊戲不要求大量的循環(比如一張地圖上七八個亂晃的NPC)或數據庫處理(比如擁有300件武器的裝備系統),結構比較清晰,製作難度比較低。

所以假如要做RPG遊戲,還是推薦使用RPG MAKER系列來製作比較合適。因為即使能如TOZ君一樣,利用接近BT頂級的思路及耐心完成大部分的功能,也會導致在速度方面非常受限制,製作效率則幾乎為零。

-----------------------------------------------------

問題二:
NScripter製作出來的遊戲,在發佈及出售方面有限制嗎?

NScripter為免費軟件,因此使用NS製作的遊戲,完全不用擔心被指責為使用盜版。
打算販賣的同人遊戲也不需要徵求作者的同意或者進貢什麼的。
如果是商業遊戲,才需要與作者聯繫並取得使用權。

並且如果商業遊戲的定價低於一定程度可以獲得優惠甚至免費。
實際上中國的一般軟件價格是遠低於日本的,
因此就算你真打算賣幾百RMB,估計玩家會比高橋氏先跳起來。
(回報是,作者可能會根據你的要求為NS增加新的功能,假如,他看得懂你在說什麼的話……= =)

使用規約原文:
[NScripterで作ったゲームを無料で配布する、あるいは値段をつけて売るとしても同人などの場合では、NScripterの使用料を高橋直樹氏に払う必要は無いということです。]

-----------------------------------------------------

問題三:
要使用NS,到底需要什麼?

以下是某D被問過的最哭笑不得的問題:
Q:我要的是NScripter完整版,為什麼只看到漢化補丁?
A:NScripter的主程式僅僅是一個不到400K的exe文件。
因此,你看到的就是完整版,不是什麼漢化補丁。

Q:我下載了NS,為什麼一執行就會出錯?我什麼都沒看到啊?
A:NScripter並不像RM或者LM系列那樣擁有圖形界面(GUI)。
它的執行方法是讀取與EXE文件同一文件夾內的TXT文件(一共可以創建0.txt~99.txt)或者代碼壓縮包內容,執行裡面的命令。
簡單的說,在你不寫下任何命令之前,它什麼也不會做,連臉都不會給你看一下。

實際上,要讓NScripter跑起來,只需要兩個東西。

1主程式(nscr.exe,名稱可以修改/圖標可以修改)
2 按照規則命名,並且寫入正確內容的txt文件。(0.txt~99.txt均可)

把這兩樣東西塞到同一個文件夾裡,這樣就準備完畢,可以開始製作了。

而壓縮包裡的其他內容,就留待之後再說明吧。

附圖1:NScripter運行需要基本文件。

001.jpg

附圖2:NScripter腳本格式。(0.TXT文件內容)

002.jpg

好,現在課間休息,大家可以去吃飯了。[某D被聽眾暴打中……]

本日小貼士:

NScripter使用環境:
WIN95-XP,推薦DirectX 8.0以上。

功能擴展性:
支持DLL插件。壓縮包內附帶有使用範例。
(由於這不是NS本身的功能,因此不多加說明。)

畫面分辨率:
320X240~800X600

支持鼠標及鍵盤操作

素材格式一覽

圖片      BMP JPG
音樂音效      MIDI WAV MP3 OGG(OGG需要DLL插件支持,官方提供)
影片      AVI MPEG
其他      光標及動畫光標 CUR ANI

-----------------------------------------------------

厚道的決定根據讀者反映調整難度,如果覺得太難請回帖。

回帖裡問哪裡下載的一律WS。

本文只為非小白讀者而寫,以上。

[ 本文最後由 dghylkop 於 07-12-20 01:22 PM 編輯 ]
作者: dghylkop    時間: 07-12-20 08:59
LEVEL 1 Hello World !

友情提示:在觀看LEVEL 1教程之前,請先詳細讀完LEVEL 0~謝謝合作~

相關指令:
*define
game
*start
end
reset
\
@
br
clickstr
_
;
Hello World。也就是所謂的「自己動手製作的第一個程序」。
似乎,在看過的基本所有程序類「入門到精通」的書裡,都有這東西的存在。雖然這個程序既沒有樂趣也沒多少成就感,而且還沒創意,但是,……

首先,打開我們已經建好的0.txt(其實叫2.txt或者99.txt或者別的什麼也無所謂),在裡面輸入以下內容,然後保存。


  1. ;-------------------我是分隔線-------------------

  2. *define

  3. game

  4. *start

  5. 你好,世界。@

  6. 這是我的第一個程序。\

  7. end

  8. ;-------------------我是分隔線-------------------
複製代碼


003.jpg

再補充說明一下:
一般來說,NScripter讀取指令的時候,是依靠「分行」來辨認的,將每一行視為一條指令。如果有空行,就會被忽略。

還要注意的是「文章(無論中文E文數字都一樣)」及「標點符號」必須使用全角,而作為「顯示文章」標誌的@和\,以及其他的英文部分的指令則是使用半角的。

接下來,是每條指令詳細的說明……

*define 「define」是E文「定義」的意思。
從*define到game之間的部分,被稱為NS的定義區塊。這部分的主要功能是對NS的內部設置做一些修改。假如裡面什麼都不寫的話也沒關係,NS會全部採用默認設置。(包括我們現在看到的那排寫著「畫面設定」「字體設定」的菜單欄,內建存檔的個數等等,都是可以修改的。)而NS開始執行遊戲,也就是從尋找TXT文件裡的*define標誌開始的。(現在知道一開始只有一個EXE文件的NS為什麼會顯示「標籤*define不存在」這樣的錯誤信息了吧?)
game 表示定義部分已經完成,可以開始正式的遊戲了。

*start ——當然就是開始遊戲的意思。這部分以後,就是「遊戲執行區塊」了。
因為有定義部分和遊戲部分的區別,NS本身的指令也分為三種:只能用在定義區塊裡的(F類指令),只能用在遊戲執行區塊裡的(E類指令),和在兩部分都可以通用的(FE類指令)。

最後,當NS執行到end指令的時候,就會退出。

中間的兩行,剛剛已經看到了,就是顯示出來的文章。
你好,世界。@
這是我的第一個程序。\
@和\這兩個標誌的意思都是「顯示一段文字,並且等待玩家點鼠標(或者按下ENTER鍵)之後,才繼續執行下一條指令」。如果不使用這兩個標誌來表示「等待」的話,這兩句話會在屏幕上一閃而過,之後就退出了。
這兩個標誌的特殊還在於可以在同一行裡多次出現。
類似這樣的寫法「你好,@世界。@這是我的第一個程序。\」也是可以的。

-----------------------------------------------------

問題一:既然同樣都是作為「顯示文章」的標誌,@標誌和\標誌有什麼區別嗎?

那麼,試看看把程序寫成這樣……


  1. ;-------------------我是分隔線-------------------
  2. *define
  3. game
  4. *start
  5. 你好,世界。\
  6. 這是我的第一個程序。\
  7. end
  8. ;-------------------我是分隔線-------------------
複製代碼


不用說,自己看看效果吧。

-----------------------------------------------------

問題三:每顯示一段文章都一定要用@和\嗎?麻煩不說,要是忘了加還容易出錯,沒有其他辦法?

既然每句話結尾多少都有個感歎號句號問號之類的,在製作比較大型的遊戲時,還要再為每行文字加一個標誌確實很煩。因此,NS也提供了比較簡單的方法:clickstr命令。
clickstr就是一個F類指令,也就是說,是只能用在NS的定義區塊裡的。


  1. ;-------------------我是分隔線-------------------
  2. *define
  3. clickstr "。",1
  4. game
  5. *start
  6. 你好,世界。
  7. 這是我的第一個程序。
  8. end
  9. ;-------------------我是分隔線-------------------
複製代碼


沒有使用@和\的情況下,效果和之前的完全一樣。
並且,使用clickstr命令之後,NS會根據參數,在文字顯示超過屏幕可容納字數後自動翻頁。

Clickstr的格式為:
Clickstr "。!?(可以寫一個,也可以寫N個,必須要是全角)",2
Clickstr "等待標誌",翻頁參數

翻頁參數為0時候,不會自動翻頁,超過字數會出錯。
為1時,顯示到屏幕(或對話框)滿為止,自動翻頁。
為2時,到離可容納字數還有1行時翻頁。
為3時,到離可容納字數還有2行時翻頁。
以下類推。

而假如某一行裡有句號或其他已經定義的等待符號,比如說問號,但是不想讓這部分等待的時候,還有一個「等待失效」的標誌「_」。
把「_」標誌放在等待符號的前面,執行到這裡的時候就不會等待,而會直接繼續顯示下一句了。
例如:
國家政策,小白要持證上崗_。

補充,假如真的對以上都懶得使用,請在define區內加入linepage命令。
這條命令會把每一行視做一段對話。
缺點是,在使用這個命令之後/命令(換行失效命令)無法使用。

-----------------------------------------------------

問題四:執行完窗口關掉以後,怎麼文件夾裡多了一個叫「envdata」的文件?

Envdata文件是設置文件,類似一般遊戲裡的ini文件。作用是記錄一些玩家的操作和設定,比如上一次進行遊戲時是全屏還是窗口模式,使用的是什麼字體之類的信息,都會被記錄下來。這當然是很貼心的功能了,對遊戲製作者來說卻有點頭大,修改了一些設定之後再執行遊戲,卻無論如何都沒效果,究其原因,都是這個envdata文件在作怪。因此,保險起見,修改一些設定之後,請記得刪除envdata文件再做測試。

-----------------------------------------------------

本日小貼士:
註釋符號「;(半角分號)」的使用。
NScripter裡,某一行裡的「; 」符號後面的部分會被當作註釋而不執行,因此無論是中文英文全角半角都可以用在註釋裡。
雖然似乎很多人(包括藍蛇……= =)都沒有使用註釋的習慣,但是,其實,根據某D的經驗,註釋還是非常有用的。除了使用文字和分隔線,免得時間長了自己看不懂以外,加在某個命令前,使某一條命令暫時不起作用以測試它的功能,或者用來加入大量個人化的東西以惡搞,打上版權標記,或者甚至僅僅為了讓文本看起來不那麼單調,請大家把註釋華麗的使用到底吧……[天音:你以為全世界的人都和你一樣無聊嗎……]
註釋使用範例:


  1. ;------------------我是分隔線----------<<==這行就全是註釋了

  2. *define;這裡開始是定義區<<==可以這麼用....

  3. game   ;定義結束...

  4. ;^^前面多打幾個空格(半角空格)也可以,半角空格和空行一樣是會被自動忽略的

  5. ;------------------我是分隔線----------<<==這行也是註釋
複製代碼


-----------------------------------------------------

作業(覺得太弱智的可以不做,反正沒人檢查……):

1隨便找一段文字把它丟到NS裡,小學課文也可以。試一下「\ ,@,br,clickstr」的使用。

2把程序末尾的end指令令換成reset指令,看看會有什麼變化。

3 DEBUG練習。
找出以下程序的錯誤。


  1. *define
  2. clickstr 「.」
  3. game*START
  4. HELLO WORLD!@
  5. re
  6. set
複製代碼

[ 本文最後由 dghylkop 於 07-12-20 01:10 PM 編輯 ]
作者: dghylkop    時間: 07-12-20 09:03
LEVEL 2 背景與人物的顯示

相關指令:
effect
bg
ld
cl
bgm
dwave
AND其他音樂音效相關播放指令參考
這次的相關指令雖然比較稀少,但是需要說明的地方卻很多。

-----------------------------------------------------

首先,來看effect指令。
一般的遊戲裡,在切換背景或者其他圖片的時候,幾乎都不會使用「瞬間消除」這樣的方法。而是使用不同的畫面切換效果。
如果有用過POWERPOINT,幻燈片之間的切換效果就是一個例子。有時候是從透明漸漸變成不透明,或者是從屏幕的側邊移動到中間,也有使用各種各樣的遮片,從而使畫面到畫面的變換具有特色。
Effect的意思是「效果」,是用來設定在遊戲裡會用到的各種切換效果的。屬於F類指令,只能使用在定義區塊裡。

Effect指令格式:
effect 效果命名,內置效果編號,畫面切換使用時間,("遮片名稱.bmp/.jpg")
(注意effect和效果命名之間是有一個半角空格的)
範例
effect 2,4,1000
或者
effect 3,15,2000,"m3.bmp"

所謂「效果命名」,就是自己給這個效果定下的一個數字。定義裡設定好之後,在遊戲裡就可以用這個編號代表這個效果。

「內置效果編號」就是NS本身所支持的效果類型。一共有以下18種。
1瞬間切換效果
2~5左右上下快門效果
6~9左右上下窗簾效果
10由透明狀態顯示效果(cross fade)
11~14左右上下捲動
15,遮片效果
16,17馬塞克效果
18 ALPHA遮片效果

因為這似乎無法做詳細的描述,具體每一個效果會是什麼樣大家可以自己去試看看。

畫面切換使用的時間是以毫秒為單位的,就是說「1000」這個數字就代表一秒鐘的時間。

需要特別說明的是,由於1號是「瞬間切換效果」,完全不需要定義時間和遮片,因此為效果定義的時候,效果命名是從2號開始的。
另外,實際上NS還存在一個神秘的內置效果「0號」,具體功能留待以後再說吧。哼哼。[眾人:你幹嗎特別加重零號這兩個字……]

而遮片,就是在畫面切換的時候擔任「幕布」角色的圖片。使用內置效果15和18定義效果時,必須要指定遮片。規格大小一般和畫面大小相等(640X480或者800X600)。基本都是黑白圖片。遮片的製作非常簡單,一般只要使用PS的漸變圖層就能夠自己製作了。至於喜歡複雜效果的,愛做成什麼樣,什麼顏色,在上面打上你的名字,或者直接用一張CG代替都是沒有限制的,請盡量發揮想像吧。

(附圖:一張正常的遮片大概長成什麼樣)

004

說了這麼多,現在可以開始應用了吧。

-----------------------------------------------------
上一個LEVEL裡只講到了怎麼顯示文章,這一次,就來試試看顯示背景和人物吧。
-----------------------------------------------------
先是顯示背景的指令「bg」(E指令)。Bg是background的簡稱,總之就是背景的意思。(廢話)

指令格式:
bg "圖片名稱",效果命名
bg #RGB顏色,效果命名 ;不需圖片,顯示各種純色背景
bg black,效果命名 ;專門用來顯示純黑背景
bg white,效果命名 ;專門用來顯示純白背景

(BG和後面的東西之間也是有個半角空格把它們隔開的)

另外,請注意圖片名稱一定要使用半角的雙引號」」括起來哦。雙引號括起來的東西叫做「文字列」,由於有了雙引號為標誌,不會和NS的命令混起來,所以裡面的內容也可以是半角英文或者數字。(上次的clickstr命令因為用法特殊所以有有限制。)

範例:
bg "aaa.jpg",1 ;瞬間顯示圖片aaa.jpg作為背景
bg #FF0000,2 ;以自定義的2號效果顯示紅色背景
bg black,1 ;瞬間顯示純黑色背景
bg white,5 ; 以自定義的5號效果顯示白色背景

另外,如果事先並沒有定義任何效果其實也是沒關係的,因為bg指令還有另外一種格式。

bg 「圖片名稱」,內置效果編號,畫面切換使用時間,(遮片名稱.bmp/.jpg)
例如:
bg "aaa.jpg",10,1000
代表以NS內置的10號效果(淡入淡出效果),在1000毫秒的時間內顯示圖片aaa.jpg作為背景。
可以看到,後面的部分和effect的後半部分完全一樣。這是一種臨時的定義。

-----------------------------------------------------

顯示背景完成了,接下來就是顯示人物或者其他圖片了。(當然假如夠BT直接把人物做進背景裡也不錯……)
由於在遊戲裡需要頻繁的使用顯示人物命令,為了每個人物專門設定坐標當然是非常麻煩的事。因此NS提供了簡單的顯示人物命令「ld」(E指令),可以直接把人物圖片顯示在屏幕的左,中,右三個位置(圖片底部貼著屏幕底線)。
指令格式:
ld l,圖片名稱,效果命名  ;在屏幕左邊顯示圖片
ld c,圖片名稱,效果命名 ;在屏幕中間顯示圖片
ld r,圖片名稱,效果命名 ;在屏幕右邊顯示圖片

效果命名的用法和顯示背景裡的是一樣的,也同樣可以使用臨時定義,例如:

ld c,"chr.jpg",10,700 ;在0.7秒內讓名為"chr.jpg"的圖片以淡入方式顯示在屏幕中央。

當然,同一個位置是不能同時顯示兩張圖片的。所以當這條命令第二次使用的時候,如果第二張圖片同樣是顯示在中間,第一次顯示的圖片就會自動消失了。

需要消除圖片的時候,則是使用cl指令:
格式:
cl c,效果命名 ;消除顯示在中間的圖片
當然,有c,就有l和r,不用多說。

另外,如果使用:
cl a,效果命名
還可以把左中右三張圖片一次性的全部消除掉。

使用範例:
cl l,2 ;以自定義2號效果消除顯示在屏幕左邊的圖片

一口氣講下來,到目前為止,一定有很多問題吧?

-----------------------------------------------------

問題1:
附圖1(梵塵夢 塵風遊戲組/五分之庭早期人設 友情客串:克裡斯 背景:實景PS)

005.jpg

我照著教程上說的做了,顯示出來的人物圖片為什麼是這個樣子呢?
這個就要從NS支持的兩種圖片格式說起了。同樣一張圖片,看起來幾乎完全一樣的情況下,BMP格式和JPG格式的大小是差很多的。實際上,JPG格式的圖片已經經過了壓縮。這種壓縮會導致圖片質量有一定的損失,儘管我們看不出來,但是JPG格式圖片相比起BMP來說,一部分顏色會有變化。
在使用顯示圖片命令,不做任何特別定義的時候,NS會把圖片左邊最上面的一個象素格(0,0)的顏色作為透明色。
在的BMP圖片裡,除了人物以外的一整片黑色都是純黑色(#000000),因此除了人物以外的部分都自動透明了。我們看到的就是人物周圍非常乾淨的邊緣。

附圖2(梵塵夢 塵風遊戲組/五分之庭早期人設 友情客串:克裡斯 背景:實景PS)

006.jpg

而JPG圖片,卻並不是如此,圖上的那些黑塊就是因為壓縮而改變了的顏色。也許只是變為#000001,但是在這裡就成了全透明和不透明的差別。

-----------------------------------------------------

問題2:
難道這就意味著JPG圖片不能用來顯示人物嗎?那做出來的遊戲豈不是要大得可怕?

當然不是了。實際上,因為JPG價格便宜量又足,還是很大家推薦使用的。至於具體要怎麼讓JPG的人物邊緣也變得乾淨,就是下一講的內容了。(爆~)

-----------------------------------------------------

問題3:
如果我就是想顯示一整張圖片,不想要透明色怎麼辦?還要特意把左上點做成不一樣的顏色嗎?
不需要,這個問題和問題2一樣,也留待下一講吧。

大家還有什麼問題?(眾:問了你也只會說留待下一講,還問什麼……)
沒問題我收拾東西走人啦……

-----------------------------------------------------

想起忘東西,CJ的跑回來:

本日小貼士(意思就是不看也可以,但是看了有好處的):
1
立ち絵,其實就是人物圖片的意思。如果在日本的NS教程裡看到「立ち絵」,就代表著用ld命令顯示的圖片。

2默認的情況下NS圖片顯示層次(簡):

-----------------------------------------------------

文章
人物圖片(右)
人物圖片(中)
人物圖片(左)
背景

-----------------------------------------------------

3要把所選的背景等顏色寫成#RRGGBB形式的顏色代碼,可以使用PHOTOSHOP等作圖工具查詢,不過更簡單的辦法是推薦類似UltraEdit一類的文本編輯工具,可以直接挑選顏色並插入代碼。

這裡提一下很多人問到的關於音樂播放的問題,其實沒什麼好說的。
NS默認的音樂播放指令就是

bgm "音樂文件名"

支持MIDI,MP3等格式。
音樂播放是默認自動循環的。
之後是音效的播放。

dwave 0,"XX.wav"

第一個數字代表聲音的編號,可以同時播放多個音效,例如說:
如果人物語音播放編號為0,而嘈雜的環境音效編號為1,就可以同時播放。
想讓音效循環播放的話,使用以下指令:

dwaveloop 0,"XX.wav"

下面再列出一些音樂音效播放相關的指令供參考。


  1. play "aa.mid" 用來播放MIDI
  2. play "*1"  播放CD上的音軌
  3. playonce "aa.mid"  和上面兩個一樣,不過不是循環而是放一次就停止
  4. playstop  停止MIDI或者CD
  5. wave "XX.wav" 當然是放WAV文件的命令
  6. waveloop "XX.wav"  循環播放wav文件
  7. wavestop  停止wav播放.很煩吧...><
  8. mp3 "XX.mp3" 播放MP3的
  9. mp3loop "XX.mp3" 循環播放MP3的

  10. chvol 0,100
  11. 調節音量的命令,把0號音樂音量調節為100。

  12. cdfadeout 1000
  13. mp3fadeout 1000
  14. 音樂淡入淡出時間設定,這兩條是用在*define裡的定義,用來定義音樂切換時的漸出時間。
複製代碼


作業:
1為下面這段程序加入詳細的註釋


  1. *define
  2. effect 2,10,1000
  3. effect 3,5,700
  4. game

  5. *start
  6. bg "a.bmp",2
  7. ld c,"b.bmp",3
  8. 花的生命很短。\
  9. cl c,1
  10. end
複製代碼


2利用LEVEL 1和LEVEL 2的教程內容製作一個簡單的電子小說。

3試驗effect命令的內置效果,其中有兩個效果是很特殊的,如果有發現請指出來。
(和下一個LEVEL有關)

4如果發現哪個命令沒有看懂可以提問。不過需要說清楚到底哪裡不懂哦。

[ 本文最後由 dghylkop 於 07-12-20 01:11 PM 編輯 ]
作者: dghylkop    時間: 07-12-20 09:07
LEVEL 3 透明,透明!反鋸齒圖片製作與對話框

相關指令
transmode
:l;
:c;
:a;
setwindow
相關程序
反鋸齒圖片製作工具(NS安裝包中均有提供)
bw2aconv.exe

-----------------------------------------------------

NScripter的透明格式與設定方法:

透明色指定,也就是指定某張圖片中的一個顏色(背景色)不顯示,這點應該滿好理解的。

NScripter有三種透明色指定格式:
left
copy
Alpha
第一種就是left。也就是上一講已經提到的:
在使用顯示圖片命令,不做任何特別定義的時候,NS會把圖片左邊最上面的一個象素格(0,0)的顏色作為透明色。圖片格式最好是BMP格式。

第二種copy,顧名思義,就是完全照搬,沒有透明色。當然是用來顯示方塊狀的圖片了。

第三種,NS自己定義的透明格式。可以解決上次說到的JPEG的顏色問題。關於NScripter不支持自帶透明通道的圖片格式例如PNG之類的,確實很讓人頭大,不過應該是屬於習慣就好吧……(躲過美工們的磚頭)

但是最讓我頭大的,其實是……無論我怎麼講這個透明格式的原理,都有人反映聽不懂……orz……
那麼先講一下怎麼設定這三種透明格式吧。

第一種辦法:
假如在*define區裡加入transmode命令,就能設定遊戲默認的透明格式。
上次說過,在不加設定的時候,默認為是左上點透明。

例如:
transmode left
transmode copy
transmode alpha

第二種辦法:
當這張圖片的顯示格式不同於默認格式的時候,需要對每張圖片單獨定義透明格式。
還記得上一講說到的人物圖片顯示命令嗎?
ld c,"chr.jpg",10,700

假如,要把這張圖片完全顯示,沒有任何透明色的話,這條命令就會改寫成:
ld c,":c;chr.jpg",10,700

在」」裡,圖片的名稱前,增加了:c;
c,當然就代表copy。
同樣的,寫成 :a; 就代表採用NS自定義的透明格式。
而寫成 :l;的話,就是以圖片左上點為透明色了。

這種單獨的參數設定方法在NS裡相當常見。

而且,不只可以用來設定透明格式……具體請參見下一講,lsp的混沌宇宙。=v=

-----------------------------------------------------

bw2aconv.exe 反鋸齒圖片製作工具的使用:

說了這麼多「理論基礎」,終於可以開始說NS特定的透明格式了。

上一講裡提到的價格便宜量又足的JPG格式,這時候可以開始派上用場了。

那麼首先我們來看看這兩張圖片。

附圖(梵塵夢 塵風遊戲組/五分之庭早期人設 友情客串:海亞辛斯)

007.jpg
008.jpg

這兩張圖片的區別就是……

一張背景是黑的,一張背景是白的,沒錯吧!(被眾人毆打:你到底想說什麼?!)

咳,咳,總之,個人猜測這就是bw2aconv.exe反鋸齒圖片製作工具的原理了。

如果這個像素點是作為背景存在的,也就是需要透明掉的部分,
那麼,在這兩張圖片上,這一點的顏色就是不一樣的。
這樣,就讓這個工具知道了哪些部分是需要透明掉的。
從而,生成了按照NS獨特的透明格式製作出的圖片,也就是下面這張。

009.jpg

bw2aconv.exe的使用方法就是這樣:
[如果實在需要配圖說明請回帖……看看需求量了……畢竟傳圖相當麻煩……=v=]

1準備兩張同樣的圖片(BMP格式)。分別起名叫
圖片名_b.bmp 和 圖片名_w.bmp
第一張圖片的背景色為黑色,第二張圖片的背景色為白色。

2把這兩張圖片放在一個文件夾裡。

3打開bw2aconv.exe。會跳出一個路徑選擇框。[這個程序本身放在哪裡都無所謂。]

4選擇這兩張圖片所在的文件夾。點確認。

5在這個文件夾裡,會自動出現一個新的文件夾,名為「OUT」。

6打開這個out文件夾,就可以找到一張名叫 圖片名.bmp 的圖片了。

7現在,就算把這張圖片轉成JPG使用,也完全不會有鋸齒出現了。
當然要記得用剛剛講過的兩種方法之一,把這張圖片的透明格式設為alpha哦。

另外就是,bw2aconv.exe 會自動轉換指定的文件夾內,所有按照這種格式起名的BMP圖片。
所以,是可以批量生產的……
假如對透明格式沒有更高的要求(比如說半透明,漸變之類的),這麼做就可以了。

-----------------------------------------------------

進一步的說明:

看看剛剛生產出來的那張圖片,就會發現,右半邊圖片實際上是一個人物的剪影效果。
也就是說,在圖片的左半邊,需要顯示的部分,在右半邊表示為黑色。
而左半邊需要透明的部分,在右半邊表示為白色。
那麼,圖片的左半邊,需要半透明的部分,在右半邊,當然是……表示為灰色了……

總結:圖片的右半邊每一點的灰度=圖片左半邊對應點的不透明度
灰度越高越不透明。黑色是全不透明,而白色是全透明。

當然,如果打算做出半透明效果(例如50%透明的對話框),
bw2aconv.exe恐怕就幫不上什麼忙了。

需要在PS或者其他作圖軟件裡做這樣的處理。這個,就要看美工技術了~

-----------------------------------------------------

對話框的設定:

setwindow,這個恐怕是NScripter裡參數最多最長的命令了。並且,相當的常用。
看看還剩點版面就講了吧。這可是重點丫……

首先是超級簡單的對話框,通常是一整塊半透明的矩型,雖然不怎麼華麗但是很清楚。
那麼,除了對話框的顏色以外,還有多少個屬性要設定呢?
對話框的位置和大小當然不用說,還有:
對話框裡的文字具體顯示在哪個位置,能顯示幾行,每行幾個字
每個文字的具體大小,文字的間距,文字是否是粗體,是否要加陰影
還有,文字顯示的速度,是一個字一個字慢慢顯示,還是一整段文字一起顯示。
以上這麼多參數,都需要在setwindow裡設定。

命令格式是這樣的:

setwindow 文字顯示位置X,文字顯示位置Y,每行顯示字數,可顯示文字行數,文字長,文字寬, 行間距,列間距,文字顯示速度(數值越小速度越快),是否粗體字(1粗體,0普通),是否陰影字(1陰影,0普通),對話框顏色(用顏色代碼表示),對話框的左上點數值(2個數字)和右下點數值(2個數字)

例如:
setwindow 8,16,20,23,26,26,0,2,20,1,1,#999999,0,0,639,479

如果想要全透明的對話框,把顏色代碼改成#ffffff就可以了。(純白色……無視……=v=)

這個就是顯示一個簡單的半透明對話框的辦法了。

如果需要複雜一點,把這個半透明矩形用一張對話框圖片代替,之前的參數還是一樣的。
但是從顏色代碼開始就需要換個寫法。

因為圖片本身的大小就決定了對話框的大小,所以只要指定圖片名稱和圖片的左上點位置就可以了。

setwindow 172,472,15,4,24,24,2,5,30,1,1,":a;pic\frame.jpg",0,0

上面這一行,看懂了嗎?這個可是五分之庭的對話框顯示數據哦……=v=

既然說了這個,就順便在這裡提一下,這些參數,其實都是可以用變數代替的。
[變數是什麼?那是以後的事情了……]
另外,setwindow命令,應該用在*start到end的部分之間,也就是遊戲執行部分。
這樣就可以隨時改變對話框的樣子了。(那也別一句話一換啊……)

-----------------------------------------------------

本日小貼士:
遊戲製作得久了,所有的素材都堆在一個文件夾裡,亂七八糟的看著都眼暈。
不妨利用下NScripter支持的多層文件夾。
也就是說,可以把人物圖片、背景、音樂等等放到不同的文件夾裡。
像剛剛上面寫的
setwindow 172,472,15,4,24,24,2,5,30,1,1,":a;pic\frame.jpg",0,0
這裡的 pic\ 就是frame.jpg 所放的文件夾名稱了。
順便沿用下LM2的素材文件夾名稱,放背景的就叫bgd,放音樂的就叫bgm……
把東西分門別類的整理一下,是不是感覺舒服多了?
當然,再多建個幾層,寫成 pic\xyz\123\frame.jpg 也沒關係……=v=

[ 本文最後由 dghylkop 於 07-12-20 01:11 PM 編輯 ]
作者: dghylkop    時間: 07-12-20 09:09
LEVEL 4 向左走,向右走 選擇與跳轉、變量入門

相關指令
select
goto
mov
add
sub

相關符號
*(標籤)
%(變量)

-----------------------------------------------------

遊戲之所以不同於其他任何一種娛樂形式,就在於,遊戲具有「互動性」。
也就是說,隨著玩家的動作,遊戲也會做出相應的反映。
在多線型的電子小說中,這就表現為最簡單的形式——選擇。
屏幕上出現幾個選項,而玩家從中選擇一個,從而走到不同的路線上。

NScripter除了本身的*define和*start區以外,允許玩家在*start區裡自定義以 * 號開頭的標籤。標籤的作用,就是把整個遊戲腳本分成多個部分,每兩個標籤之間,可以視為一個「事件」。比如說,以下這樣的形式。


  1. *define
  2. game

  3. *start

  4. *event1

  5. *event2

  6. *event3

  7. end
複製代碼


NS默認的執行方式,就是從*start開始,一路執行到end。
所以一定會經歷事件1,2,3。
如果想要作一個三個選項的選擇支,然後根據選擇的不同而分別走向事件1,事件2,和事件3,那麼,就可以寫成這樣。


  1. *define
  2. game

  3. *start
  4. select "我選一", *event1,"我選二", *event2,"我選三" ,*event3

  5. *event1
  6. 你選擇了一。\
  7. end

  8. *event2
  9. 你選擇了二。\
  10. end

  11. *event3
  12. 你選擇了三。\
  13. end
複製代碼


以上,就是一個簡單的選項。
和之前的例子還有一點不同,那就是每個事件的結尾,都加上了end。
不妨試看看,假如刪除前兩個end會出現怎樣的情況。

沒錯,刪除end之後,再選擇「我選一」,執行*event1的內容之後,還是會繼續接下來執行*event2和*event3。

當然,一般來說,根據選擇分歧的事件,往往最後還是會合到一條路來。所以簡單的加入end不太實際。


  1. *define
  2. game

  3. *start

  4. select "我選一", *event1,"我選二", *event2,"我選三" ,*event3

  5. *event1 ;事件1
  6. 你選擇了一。\
  7. goto *goodending

  8. *event2 ;事件2
  9. 你選擇了二。\
  10. goto *goodending

  11. *event3 ;事件3
  12. 你選擇了三。\
  13. goto *goodending ;因為是緊接著的,這行其實可寫可不寫,看出來了嗎?

  14. *goodending
  15. 這裡是結局了。\
  16. end
複製代碼


這個例子裡,無論選擇了哪個項目,在執行完對應的事件之後,都會匯合到最後一個事件裡。
Goto 所起的就是這個在事件之間跳轉的作用。

到現在為止,已經可以做出一個互動的電子小說了。

現在,只要稍微動動腦,NS的官方範例遊戲《泡沫》,都可以用現在所知道的技術實現了。
《泡沫》的標題就是用「全透明對話框」+「選擇」構成的。雖然簡陋,但是也相當實用哦。

-----------------------------------------------------

忙完電子小說,當然要開始考慮其他更複雜的AVG了。
戀愛遊戲裡最重要的是什麼?
PPMM?——錯!
答案是——好感度!
那麼,好感度的本質是什麼呢?
根據你的「選擇」,對方對你的好感度會有「增加」、「減少」或者「不變」三種可能。
說白了。好感度,就是一個數值而已。=v=
這種可以加加減減的數值,在遊戲裡就叫做「變量」或者「變數」——因為是可以變化的嘛。
變量本身需要有一個名字,例如「某人的好感度」,「某人的BT度」「HP」,「昨天的颱風等級」等,而變量的內容,就是一個數字。
在NScripter裡,變量的名字是以 % (百分號)開頭的。可以從 %0 到 %4010以上 (以2.45版測試,到%5000雖然不會出錯,但是變量的操作不會被記錄下來。4000應該說是相當夠用了)。
當然這個%0 ,%4010之類的並不是變量的內容,而是變量的名字,或者說編號哦。
變量本身的內容,則是需要通過賦值(代入)和操作(加減乘除等)改變的。
比如
mov %10,200
代表把200這個數賦值給%10這個變量。
那麼,現在,%10=200
add %253,300
代表把變量%253的現有數值再加上300
sub %4010,25
代表把變量%4010現有的數值減去25。

-----------------------------------------------------

假設我們現在規定變量 %10 ,作為某個戀愛遊戲女主角的「好感度」。
然後,寫出這樣一段代碼。


  1. *define
  2. game

  3. *start
  4. mov %10,0 ;把對方的好感度預設為0

  5. 一起去公園怎麼樣?\

  6. select "好啊",*event1,"不行",*event2,"那個,稍微有點事……",*event3

  7. *event1 ;事件1
  8. 嗯,那麼走吧。\
  9. add %10,5 ;對方好感度上升了
  10. goto *goodending

  11. *event2 ;事件2
  12. 真是的,那麼凶幹嗎……\
  13. sub %10,5 ;對方好感度降低了
  14. goto *goodending

  15. *event3 ;事件3
  16. 這樣啊,太遺憾了。\

  17. *goodending
  18. 這裡是結局了。對方對你的好感度現在是%10哦。\

  19. end
複製代碼


執行一下這段,就會發現選擇1,對方的好感度是5,選擇2的話,則是-5,選擇3,是0。
變量的名字,也就是%10,直接出現在對話裡,顯示出來的卻是變量的具體數值。
不知不覺,居然寫滿4頁……那,收工吧。=v=

010.jpg

再來看下這張圖。雖然對話一樣,但是和上面的樣例有一些不同。
加入了對話框的使用,並且用換行符號 @ 代替了翻頁符號 \ ,讓劇情看起來更連貫。
當然要記得,對話+選擇總的行數不能超過對話框設定的範圍,否則會出錯的。

-----------------------------------------------------

本日小貼士:變量的管理。
遊戲做得久了,哪幾個變量用過哪幾個變量沒用過,基本上是記不清楚了。
非常可能因為這樣出現各種低級錯誤。《=某D就犯過把HP當作臨時變量操作來操作去的白癡錯誤。
因此,建議大家開始製作遊戲前先準備好筆記本,將大致的變量區間分配下。
比如,%200到%300用做人物好感度,而%400到%600用做人物的養成數值等等。
同時在製作過程中,將已經使用過的變量標注出來。當然也推薦使用excel類的工具進行列表。
另外,為了避免一操作變量的時候一個不小心把mov %100,20寫成mov %1000,20,NScripter也提供了變量自行命名的功能。
在*define區塊裡加入:
numalias attack,1
就代表把變量%1命名為attack
這樣以後操作變量%1的時候,除了可以用mov %1,20的寫法,也可以用mov %attack,20的寫法。

-----------------------------------------------------

作業:技術含量和《泡沫》差不多,帶分歧與好感顯示的電子小說……=v=

[ 本文最後由 dghylkop 於 07-12-20 01:11 PM 編輯 ]
作者: dghylkop    時間: 07-12-20 13:05
LEVEL 5 LSP的混沌宇宙(1) 圖片的顯示與動畫

相關指令
print
見列表
相關格式
文字,按鈕,圖片動畫控制參數

-----------------------------------------------------

呼,歡迎來到NS十絕陣之一的SP混沌陣,我就是陣主D天君……(被聽眾PIA飛)
(擦擦汗飄回來)唔,總之NS裡所謂的SP,也就是sprite(精靈,這個概念在RGSS裡也經常出現,相信RMER也不會陌生),指的就是一些可以進行顯示、消除、移動之類的操作的圖片而已。
同時,將SP系列指令與其他指令,例如btnwait等的配合,還可以製作動畫、按鈕、地圖、指令輸入畫面等等。如果說之前學到的東西剛剛夠製作一個簡單的電子小說,那麼掌握了SP系列指令之後,只要再稍微發揮一點點想像力,就可以用NS製作很多有趣的其他類型遊戲了。
在(1)裡,首先將SP系列的指令都列出來並做一下基本說明,這些命令將在以後的幾講裡分別詳細敘述。之後,重點講一下SP圖片的顯示,動畫的設定及print指令。

-----------------------------------------------------

指令    說明    備註
lsp    預載圖片/文字. 包含動畫格式設定    需print刷新屏幕後顯示
lsph    預載圖片/文字. 包含動畫格式設定    默認為不顯示
csp    清除圖片    需print刷新屏幕後清除
vsp    圖片顯示/不顯示狀態切換    需print刷新屏幕後表現

Msp    移動圖片到某相對位置    需print刷新屏幕後顯示
Amsp    移動圖片到畫面上某絕對位置    需print刷新屏幕後顯示

strsp    顯示多行文字(自動改行)   
Logsp(系列)    顯示文字   
spfont    定義SP顯示字體    *define專用

Spbtn    將預載的圖片設為按鈕    普通版按鈕
Exbtn    將預載的圖片設為按鈕    華麗版按鈕

Drawsp(系列)    特殊方式描繪圖片    旋轉,縮放等
spwait    等待動畫圖片播放後繼續   
allsphide    隱藏所有SP圖片(包括立繪)   
allspresume    恢復所有SP圖片顯示   
getspmode    獲取圖片顯示/不顯示狀態   

-----------------------------------------------------

首先是使用LSP命令顯示圖片。
格式是:
Lsp 圖片編號,文字列,左上角坐標X, 左上角坐標Y,(圖片透明度0-255)

這個命令和之前講過的顯示人物圖像並沒有什麼大的區別。只是增加了幾個參數。
圖片編號代表的是當有很多圖片顯示時,這些圖片互相之間的重疊順序。
數字越大,則重疊順序越靠後。也就是說,當1號圖片和2號圖片同時顯示在同一位置上時,2號圖片會被1號圖片擋住。
左上角坐標X, 左上角坐標Y,圖片透明度—這個不用說了,就是圖片的顯示位置,透明度參數不加的話,就是默認為255。
文字列參數,通常指的是圖片名稱和格式。這裡特別的是幾個用法。
例如說,動畫的相關參數也要在這裡定義。
這個是NS自帶的小動畫,就拿它來做點實驗好了。
現在新建一個實驗用的工程(EXE文件和TXT文件~)
然後把以下代碼複製進去看看:


  1. *define
  2. game

  3. *start
  4. lsp 1,"cursor1.bmp",0,100
  5. print 1
  6. click
  7. end
複製代碼


現在,在0,100位置顯示了一張靜止圖片。

問題:出現了沒見過的命令print。那是做什麼用的?
那麼,就直接把這命令刪了吧。
輸入以下的代碼:


  1. *define
  2. game

  3. *start
  4. lsp 1,"cursor1.bmp",0,100
  5. click
  6. end
複製代碼


奇跡出現了——完全沒反應。
Print命令是「刷新畫面」的意思。而後面帶的參數,則是早已熟悉的:effect效果編號。
LSP指令之後,默認是不立刻顯示圖片的。要等到利用print命令之後才顯示。
這樣一是可以做出比較華麗的顯示效果,
二是可以一次性的讀入大量圖片再一次性顯示。

再複習一下關於effect效果編號。
現在用的print 1當然是表示瞬間顯示。
之前講過的神秘效果0,現在可以說,所謂的效果0,就和LSP指令一樣,意思是「不立刻顯示圖片」。而是等到下一次「刷新畫面」的時候顯示。
NS裡,背景圖片和人物圖片顯示是伴隨著自動刷新畫面的,
比如說,把背景的顯示效果編號設為0。在顯示人物的時候,畫面會自動刷新,就做成了讓背景和人物一起顯示的效果。

LSP命令則更像是「預載」,先把相關的圖片載入內存,然後等待刷新畫面命令再顯示。

如果覺得以上很煩,那麼就記住一句話:用LSP命令之後,記得用PRINT命令……=____=

然後當然到了動畫部分:


  1. *define
  2. game

  3. *start
  4. lsp 1,":/3,300,2;cursor1.bmp",100,100
  5. click
  6. end
複製代碼


現在在畫面上100,100的位置顯示了一個動畫。
cursor1.bmp是圖片名,和之前[透明格式講解]說過的一樣,前面的參數部分和圖片名用;隔開。
: (冒號)代表分格參數設定的開始。/3代表把圖片平均分成三格。之後的300則是每格的播放時間300毫秒。
最後一個參數是2,2代表的是「把這張圖片作為動畫」。實際上,在2的位置用0或者1替換,也是播放動畫,只是實際播放的效果並不太一樣。具體的,請自己實驗一下就明白了。
而如果需要給這張圖片設定特別的透明格式,也只要在:(冒號)後面加入代表透明格式的l,c,或者a。也就是寫成以下的形式:
lsp 1,":a/3,300,2;cursor1.bmp",100,100

問題1:那麼如果需要每格的播放時間長短不一樣怎麼辦?
NS是提供了每格設定不一樣長時間的指令的。例如:
lsp 1,":a/3,<100,200,300>,2;cursor1.bmp",100,100
用尖括號裡的三個參數代替了原來的300。就是這樣。

問題2:這次沒有使用print命令,不過圖片也自動顯示出來了?
嗯,看來動畫是默認立刻顯示的。

問題3:那麼動畫不能自由控制什麼時候顯示和用什麼效果顯示嗎?
當然不是了,這就要使用LSP系列的第二個命令LSPH。


  1. *define
  2. game

  3. *start
  4. lsph 2,":/3,300,2;cursor1.bmp",100,100
  5. click
  6. end
複製代碼


估計這裡的H的意思是hide——隱藏(誰說是工口的叉出去打!),使用了LSPH以後,實際上不但不在預載的時候刷新畫面,無論什麼時候刷新畫面,這東西都死活不會顯示的……
一直到,使用vsp命令+再次刷新畫面為止。


  1. *define
  2. game

  3. *start
  4. lsph 2,":/3,300,2;cursor1.bmp",100,100
  5. vsp 2,1
  6. print 1
  7. click
  8. end
複製代碼


vsp指令的第一個參數代表SP圖片編號,第二個參數則代表圖片的顯示狀態。1是顯示圖片,0則是隱藏圖片。使用後同樣需要刷新屏幕。

現在應該就可以利用這幾個指令自由的控制圖片/動畫的顯示狀態了。

順帶當然要一講圖片的消除命令CSP。
格式是:
Csp 圖片編號

如果是csp -1則是代表一次性把所有的SP圖片都消除。
同樣,即使是消除圖片,也需要等到刷新屏幕後才會有效果。
-----------------------------------------------------

本日小貼士:

1這些LSP動畫相關的參數,也都可以用在ld命令顯示人物的時候。算是對LD命令的一個補充講解。覺得對眨眼動畫的象素太麻煩的話,就考慮把整張人物圖做成動畫吧……XD

2把NS自帶的cursor圖片丟到根目錄下,就會在換行和分頁的時候自動出現等待的小圖標了。如果想要自己設定等待圖標的話,使用setcursor命令自定義就可以了。方法和定義SP動畫一樣。

-----------------------------------------------------

作業:
讓電子小說裡的人物動起來。

-----------------------------------------------------

PS:最近發現有些噁心論壇無授權轉載這裡精華區的東西還一個都不署名,嚴重BS……
但是現在懶得和小人計較搞些什麼回復帖之類的。
如果各位有看到本教程的無端轉載的話,毫不留情的砸下您的磚就是對我最大的支持XD。

PS的PS:
LSP系列實在是相當繁瑣的東西,而且個人對此也不是全部精通。
已經熟悉SP系列命令的各位幫忙看一下有什麼遺漏的,或者覺得有什麼要詳細講的。
請回帖說一下。

[ 本文最後由 dghylkop 於 07-12-20 05:34 PM 編輯 ]
作者: dghylkop    時間: 07-12-20 13:05
LEVEL 6 LSP的混沌宇宙(2) 顯示數字,文字及簡單按鈕製作

相關指令:
lsp
btndef
spbtn
btnwait
itoa
mov
add
if
goto
等等等等……基本的多,講過的多|||

-----------------------------------------------------

相關格式:
按鈕定義相關格式

先是最近MS很多人問到的,關於使用LSP命令顯示多於三位數的數字。(當然前提是大家都已經知道顯示三位及以下的數字可以使用命令prnum。)
實際上,只要會使用lsp命令顯示文字的話,顯示數字當然也不成問題。
但是,重點就變成了變量形式之間的互相轉化,和LSP命令本身相關的只有一點而已。

首先,放上LSP顯示文字的格式。其實這個在系列範例裡都有的。
lsp 11,":s/25,25,0;#ffffff顯示文字",305,252

:s,和a,l,r等一樣是格式標記符,這裡代表的是,接下來要顯示的是文字。
25,25,0是文字參數。分別代表的是單個文字的長,寬及字間距。
;以後的顏色,代表的當然是文字的顏色。
最後的兩個坐標,和顯示圖片一樣,代表文字位置。

記得加上print命令,丟到實際遊戲裡面看看哦。

接著,一點前情提要:NS所有的指令的參數都可以用變數代替。
例如說,

lsp 1,"cursor1.bmp",0,100

等價於以下兩條指令

mov $132, "cursor1.bmp"
lsp 1,$132,0,100

另外:
lsp 11,":s/25,25,0;#ffffff顯示文字",305,252

也可以等價於:

mov $132,"顯示文字"
lsp 11,":s/25,25,0;$132 ",305,252

那麼,要用LSP命令顯示數字,雖然不能直接把數字變數放到參數里面(不信的人可以試看看,只會顯示出%132之類的……),但是,NS也提供了把數字變數轉成文字變數的命令。

itoa 文字變數,數值
將數字變換成文字列。但是,只能轉成半角文字。
例)
    itoa $0,120
    itoa $1,%2

轉換以後的數字會被記錄在指定的文字變數里。以上兩個例子分別是$0和$1。
所以,假如要顯示%2里記錄的數字的話,進行以下操作就可以了
itoa $0,%2
lsp 11,":s/25,25,0;$0",305,252

請注意這裡,當數字位數是雙數時,正確顯示是沒有問題的,但是當顯示位數是5位等等時,就有可能出現數字被吃掉,不能正確顯示的情況,這是因為NS的設計,和在對話中一樣,一般情況下LSP命令也只能顯示全角文字造成的。解決方法當然是有,詳細的請看這裡:
http://bbs.rpgchina.com/read-htm-tid-18363-fpage-0-toread--page-1.html
當然,對顯示數字來說,在文字變數的最前面加零比在最後加空格好……並且,如果數字的位數已經是固定的話(例如金錢默認就是最高999999,最低000000)那麼就直接使用len命令判斷當前轉換出來的變數長度,再酌量在變數前面加零吧。例如說:
len %100,$0
if %100==6 mov $1,$0
if %100==5 mov $1, "0": add $1,$0
if %100==4 mov $1, "00": add $1,$0
if %100==3 mov $1, "000": add $1,$0
if %100==2 mov $1, "0000": add $1,$0
if %100==1 mov $1, "00000": add $1,$0

最後,再用LSP命令顯示$1就可以了。(注意是顯示$1,不是$0……)

那麼,綜合起來,使用LSP命令顯示六位數字的範例就像以下這樣:



  1. *define

  2. game

  3. *start
  4. mov %1,325
  5. itoa $0,%1

  6. len %100,$0

  7. if %100==6 mov $1,$0
  8. if %100==5 mov $1, "0": add $1,$0
  9. if %100==4 mov $1, "00": add $1,$0
  10. if %100==3 mov $1, "000": add $1,$0
  11. if %100==2 mov $1, "0000": add $1,$0
  12. if %100==1 mov $1, "00000": add $1,$0

  13. lsp 11,":s/25,25,0;#ffffff$1",305,252
  14. print 1
  15. click
  16. end
複製代碼


============我是沒有愛的分隔線===========

第二,使用lsp製作的按鈕。
還是老話,所謂遊戲,就是根據玩家的動作而做出反應的東西。在AVG裡,最常見的就是選擇支,還有就是按鈕了。其原理也很簡單,先定義屏幕上所有可以點選的地方,然後等待玩家的動作,再根據玩家的動作跳轉到不同的分歧。
NS裡製作按鈕大概有兩種方式。大略的介紹可以參考這裡:

http://bbs.rpgchina.com/read.php?tid=9057&fpage=1

這裡只介紹第二種。(因為第二種是後來發展出來的,操作起來比較簡單)

廢話不多說了,依然是基本介紹,先是文字按鈕,也就是LSP顯示文字的擴展。
例如說:
lsp 11,":s/25,25,0;#ffffff#ffff00開始遊戲",305,252
和普通的LSP顯示文字差別就在於多了一個顏色代碼。第一個代表文字一般狀況下的顏色,第二個則是代表當這個文字按鈕被「選中」時候的顏色。

接下來是,因為普通的SP圖片/文字是不能點的,所以要把11號SP定義成一個按鈕……=_=
定義的方法是:
spbtn 11,1

11當然是代表SP文字編號,而1則代表這個按鈕的編號。在NS裡,就是根據按鈕編號判斷玩家做了什麼反應的。0代表玩家點了不是任何按鈕的地方,1以上是由你自己定義的編號,而小於0的部分,則代表玩家做了其他的操作,例如說:點了鼠標右鍵,ESC鍵,用了滾輪等等。
最後,則是根據玩家的動作,執行不同的腳本。

丟個實例看看,就是那傳說中的標題畫面:


  1. *define

  2. game

  3. *start


  4. lsp 11,":s/25,25,0;#ffffff#ffff00開始遊戲",305,252
  5. lsp 12,":s/25,25,0;#ffffff#ffff00讀取進度",305,282
  6. lsp 13,":s/25,25,0;#ffffff#ffff00離開遊戲",305,312
  7. print 1

  8. btndef "" ;這裡用btndef指令代表定義的開始,請記得不要漏掉這一行。

  9. ;定義了三個按鈕及其編號
  10. spbtn 11,1
  11. spbtn 12,2
  12. spbtn 13,3

  13. btnwait %0
  14. ;等待玩家動作,玩家的動作對應編號(剛剛所說的1,2,3等等,會被記錄在%0這個變數里(btnwait 之外,也可以使用btnwait2指令,其具體的差別請看本日小貼士)


  15. ;以下,將根據玩家的動作進行不同的跳轉

  16. if %0<=0 goto *start ;當沒有點按鈕時,不做反應(也就是從*start重新開始執行)如果沒有這一行的話,玩家點下右鍵等等的時候,會繼續往下執行,也就是進行到*loadgame那裡。
  17. if %0==1 goto *newgame ;開始新遊戲
  18. if %0==2 goto *loadgame ;讀取進度
  19. if %0==3 goto *endgame ;結束遊戲

  20. *loadgame
  21. systemcall load ;呼叫NS的讀檔選單
  22. goto *start ;當玩家沒有讀檔,而是選擇退出讀檔選單之後,要返回重頭開始執行,如果沒有這一行的話,會繼續執行到*endgame那裡。

  23. *endgame
  24. end

  25. *newgame
  26. csp -1
  27. print 1
  28. 開始遊戲\
  29. end
複製代碼


詳細說起來,按鈕與變量操作的結合,可以用於製作選擇支,商店系統,標題畫面,CG界面,存儲界面等等等等。因此學會怎麼使用是一回事,把按鈕和其他簡單指令顯示組合起來,製作自己想要的系統就是另外一回事了。可能有很多新人喜歡上來就問「XX系統要怎麼做啊」,這個……的確是很難以回答的問題。因為不知道你本身的水平如何,也不知道要怎麼解釋才能聽懂。但是如果把問題拆成:怎麼顯示文字,怎麼顯示數字,怎麼操作變量,怎麼製作文字按鈕,玩家點下以後進行什麼操作——那基本上,就算是新人,自己也能解決了吧。= =b

============我是沒有愛的分隔線二===========

寫到這裡忽然想起來……我忘記了,還有圖片按鈕……OTL
之前在LSP的混沌宇宙之一就有提到過,SP圖片播放動畫的時候,是使用:
lsp 1,":a/2,200,2;aaa.jpg",100,100
這樣的格式。代表將圖片分成兩幀,每幀間隔時間200毫秒。
那麼,當顯示圖片按鈕的時候,圖片也一樣是分成兩幀(普通的情況和被選中的情況),但是不需要時間間隔,所以就寫成:
lsp 1,":a/2,0,3;aaa.jpg",100,100
(分號前的最後一個數字代表將SP圖片用做什麼用途,最後一個數字為2是動畫,為3就是按鈕了。)
接著,再和以上的文字按鈕一樣,使用spbtn指令定義按鈕就行了。
一段範例,和上面的文字標題基本沒有什麼不同咯。(請記得自己準備一張叫btn.jpg的圖片)


  1. *define

  2. game

  3. *start

  4. lsp 11,":a/2,0,3;btn.jpg",305,252
  5. lsp 12,":a/2,0,3;btn.jpg",305,302
  6. lsp 13,":a/2,0,3;btn.jpg",305,352

  7. print 1

  8. btndef ""
  9. spbtn 11,1
  10. spbtn 12,2
  11. spbtn 13,3

  12. btnwait %0



  13. if %0<=0 goto *start
  14. if %0==1 goto *newgame ;開始新遊戲
  15. if %0==2 goto *loadgame ;讀取進度
  16. if %0==3 goto *endgame ;結束遊戲

  17. *loadgame
  18. systemcall load ;呼叫NS的讀檔選單
  19. goto *start

  20. *endgame
  21. end

  22. *newgame
  23. csp -1
  24. print 1
  25. 開始遊戲\
  26. end
複製代碼


-----------------------------------------------------

本日小帖士:

1順手也把文字列轉數字的命令貼出來吧,至於有啥用大家看著辦……XD
atoi 數字變數,文字列
例)
    atoi %0,"123"
    atoi %3,$0

2 btnwait2與btnwait的功能是相同的,不同的是使用btnwait2的時候,即使玩家已經執行過動作,定義的按鈕也不會被消除,這樣,當玩家點了右鍵之類的情況下,可以在btnwait2前面直接設一個標籤,然後跳轉到那裡,省得再從頭執行一遍定義等等。
想要手動清除按鈕定義的時候,請使用btndef clear指令。

3關於有時間限制的按鍵反應,請參考這裡……(感謝TOZ和KENDY SAN的貢獻XD)

http://bbs.rpgchina.com/read.php?tid=16456&fpage=1
http://bbs.rpgchina.com/read.php?tid=12555&fpage=4

4關於前文寫到的:
if %100==5 mov $1, "0": add $1,$0

類似這樣,將指令用冒號分隔開,一行可以寫好幾個指令,並且只在符合該行的if條件時執行。比再跳轉到某一標籤繼續執行要方便一些,對比較短的指令段,可以這麼用。

[ 本文最後由 dghylkop 於 07-12-20 05:42 PM 編輯 ]
作者: dghylkop    時間: 07-12-20 13:05
LEVEL 7 LSP的混沌宇宙(3) 用EXBTN升級你的系統畫面

相關指令:
exbtn
相關格式:
exbtn的參數格式

-----------------------------------------------------

嗯,這次大概就只能講exbtn指令了吧。
在遊戲中,涉及按鈕懸停效果的,除了上一講說過的使用lsp顯示圖片並用spbtn定義按鈕外,當鼠標移動到某按鈕上時,一般還有以下兩種效果。
1、播放音效
2、在某個位置顯示圖片,並當鼠標從按鈕上移開時圖片消失。

熟悉了按鈕的使用以後,以普通的懸停效果,加上以上兩種效果,就可以製作出相當複雜的系統了。當然,單純做個華麗點的標題畫面更沒有問題。
這種情況下不附上範例真是不行咧,所以大家就暫時參考《青空之想試玩II》的遊戲系統吧(順便打個廣告)。遊戲中的option系統和物品系統就大量應用了exbtn製作的效果。當然青空是不能給你拆的(=_=b),但是看完這講之後,你也可以試試製作類似的系統了。

首先是使用exbtn達成和spbtn一樣的懸停效果,這是為了可以在這個基礎上進行擴展。


  1. *define

  2. game

  3. *start

  4. lsp 11,":a/2,0,3;btn.jpg",305,252
  5. lsp 12,":a/2,0,3;btn.jpg",305,302
  6. lsp 13,":a/2,0,3;btn.jpg",305,352

  7. print 1

  8. btndef ""
  9. exbtn 11,1,"P11,1"
  10. exbtn 12,2,"P12,1"
  11. exbtn 13,3,"P13,1"

  12. btnwait %0



  13. if %0<=0 goto *start
  14. if %0==1 goto *newgame ;開始新遊戲
  15. if %0==2 goto *loadgame ;讀取進度
  16. if %0==3 goto *endgame ;結束遊戲

  17. *loadgame
  18. systemcall load ;呼叫NS的讀檔選單
  19. goto *start

  20. *endgame
  21. end

  22. *newgame
  23. csp -1
  24. print 1
  25. 開始遊戲\
  26. end
複製代碼


參考下上次的代碼,就可以看出,只是把
spbtn 11,1這樣的指令,改成了exbtn 11,1,"P11,1"而已。
前面的11,1依然代表一樣的意思,而後面的第三個參數,使用""括起來的部分,就是exbtn的追加效果參數。
P11,1代表,當鼠標移動到圖片lsp11上時,將顯示圖片lsp 11的第1格。
注意,由於我們之前的設定,lsp11的圖片是被分成了兩格,而格數是從零起算的,平時顯示的就是第0格,因此這裡第1格就是特殊效果了。(如果是文字的話,自然就代表選中的文字顏色了)
顯示多格的圖片時,需要指定圖片編號和格數,兩者之間用逗號隔開。但當圖片沒有分格,或是單色文字的時候,就只需要指定編號了。

那麼,再試試加上音效播放效果吧。

找一個wav文件(這裡起名叫xd.wav)放到文件夾裡,然後把
exbtn 11,1,"P11,1"
修改成
exbtn 11,1,"P11,1S1,(xd.wav)"

運行遊戲,是不是當鼠標移動上去的時候,可以聽到音效呢?

然後,加上其他圖片的顯示及消失效果。
範例:當鼠標移動到圖片lsp12 上時,將會在畫面的左邊顯示lsp文字「讀取遊戲」。
加上在lsp11按鈕添加音效的修改,代碼變成如下這樣:


  1. *define

  2. game

  3. *start

  4. lsp 11,":a/2,0,3;btn.jpg",305,252
  5. lsp 12,":a/2,0,3;btn.jpg",305,302
  6. lsp 13,":a/2,0,3;btn.jpg",305,352
  7. lsph 14,":s/25,25,0;#ffffff讀取遊戲 ",205,302

  8. print 1

  9. btndef ""
  10. exbtn 11,1,"P11,1S1,(xd.wav)"
  11. exbtn 12,2,"P12,1P14"
  12. exbtn 13,3,"P13,1"

  13. btnwait %0



  14. if %0<=0 goto *start
  15. if %0==1 goto *newgame ;開始新遊戲
  16. if %0==2 goto *loadgame ;讀取進度
  17. if %0==3 goto *endgame ;結束遊戲

  18. *loadgame
  19. systemcall load ;呼叫NS的讀檔選單
  20. goto *start

  21. *endgame
  22. end

  23. *newgame
  24. csp -1
  25. print 1
  26. 開始遊戲\
  27. end
複製代碼


注意,這裡增加了一個默認不顯示的精靈,lsp 14。

實際測試,效果是出現了,問題也來了。
雖然當移動上去時,文字顯示了,但是當鼠標從按鈕上移動開之後,文字還留在那……
那是因為,雖然設定了「鼠標在按鈕上時執行的效果」,卻沒有定義「鼠標不在任何按鈕上時的效果」。
Ns為此提供了exbtn_d這一指令,用來定義當鼠標不在任何按鈕上時,畫面的顯示。
由於我們需要的是鼠標移開之後14號精靈消失,因此改寫成這樣:


  1. *define

  2. game

  3. *start

  4. lsp 11,":a/2,0,3;btn.jpg",305,252
  5. lsp 12,":a/2,0,3;btn.jpg",305,302
  6. lsp 13,":a/2,0,3;btn.jpg",305,352
  7. lsph 14,":s/25,25,0;#ffffff讀取遊戲 ",205,302

  8. print 1

  9. btndef ""
  10. exbtn 11,1,"P11,1S1,(xd.wav)"
  11. exbtn 12,2,"P12,1P14"
  12. exbtn 13,3,"P13,1"

  13. exbtn_d "C14"

  14. btnwait %0



  15. if %0<=0 goto *start
  16. if %0==1 goto *newgame ;開始新遊戲
  17. if %0==2 goto *loadgame ;讀取進度
  18. if %0==3 goto *endgame ;結束遊戲

  19. *loadgame
  20. systemcall load ;呼叫NS的讀檔選單
  21. goto *start

  22. *endgame
  23. end

  24. *newgame
  25. csp -1
  26. print 1
  27. 開始遊戲\
  28. end
複製代碼


可以看出來,
exbtn_d "C14"是唯一增加的部分。
也就是說,字母P代表顯示,而C則代表消失,S則代表播放音效。
以上這三個參數是可以不斷疊加的,例如說,要為所有按鈕增加播放音效和文字註釋效果。可以寫成以下這樣:


  1. *define

  2. game

  3. *start

  4. lsp 11,":a/2,0,3;btn.jpg",305,252
  5. lsp 12,":a/2,0,3;btn.jpg",305,302
  6. lsp 13,":a/2,0,3;btn.jpg",305,352

  7. lsph 14,":s/25,25,0;#ffffff開始遊戲 ",205,252
  8. lsph 15,":s/25,25,0;#ffffff讀取遊戲 ",205,302
  9. lsph 16,":s/25,25,0;#ffffff離開遊戲 ",205,352

  10. print 1

  11. btndef ""
  12. exbtn 11,1,"P11,1P14S1,(xd.wav)"
  13. exbtn 12,2,"P12,1P15S1,(xd.wav)"
  14. exbtn 13,3,"P13,1P16S1,(xd.wav)"

  15. exbtn_d "C14C15C16"

  16. btnwait %0



  17. if %0<=0 goto *start
  18. if %0==1 goto *newgame ;開始新遊戲
  19. if %0==2 goto *loadgame ;讀取進度
  20. if %0==3 goto *endgame ;結束遊戲

  21. *loadgame
  22. systemcall load ;呼叫NS的讀檔選單
  23. goto *start

  24. *endgame
  25. end

  26. *newgame
  27. csp -1
  28. print 1
  29. 開始遊戲\
  30. end
複製代碼


注意這裡P/C/S之前反而不用逗號分隔。

嗯,有些BT人可能會想到,當遊戲的一個畫面裡涉及到數十張圖片的顯示和消除的時候,這麼寫一定很容易讓人想死……

幸好NS還提供了簡寫功能:
exbtn_d "C14-16"和exbtn_d "C14C15C16"是等效的。

另外,由於exbtn所帶的參數自然可以用文字變數代替,可以考慮先把這些P啊C啊S的全部加到一個變數(例如$name)裡,最後使用exbtn 11,1,$name就能搞定。
如果你擅長使用循環和條件的話,簡化過程就更容易了。(啥?循環和條件是啥?……這不是今天的內容!)

-----------------------------------------------------

本日小貼士:
那麼讓我們來YY吧。
Q:lsp的應用範圍?
A:標題,選項,系統設定,系統按鈕,右鍵菜單,存儲讀取,地圖,小遊戲……
顯示圖片、顯示按鈕、根據玩家選擇進行操作,這是所有遊戲系統的基礎~
與其詢問別人怎麼做,不如自己思考一下。
當然,如果是自製右鍵菜單、對話系統按鈕和存取,這還要配合NS提供的一些系統類指令進行,這不是今天的內容……(跑……)

Q:動畫按鈕怎麼做?按鈕都是靜態的吧?
A:用exbtn製作透明按鈕,當不在按鈕上時顯示普通的lsp動畫一張,在按鈕上時顯示選中的lsp動畫一張。^^

Q:我要怎麼移動、放大、縮小、旋轉圖片?
A:雖然實際效果不太理想,但Drawsp 系列指令可以製作簡單的動態效果,那啥,下,下,下一講……(已經不知道下幾講才能講完了OTL)

[ 本文最後由 dghylkop 於 07-12-20 05:43 PM 編輯 ]




歡迎光臨 鐵之狂傲 (https://gamez.com.tw/)