幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4120|回复: 7

[NS] 高桥直树好像又弄出了个NSlua程序?

[复制链接]

9

主题

48

帖子

569

积分

⑤进阶

积分
569
发表于 2010-5-4 02:40:04 | 显示全部楼层 |阅读模式
访问http://www.nscripter.com/官网,新推出了个NSlua程序,好像是“NS的核心+Lua的脚本”这样的方式运行的,其中nslua.dll为读取.lua脚本的动态链接库文件。


有大大研究过么?
我的百度空间:hi.baidu.com/wildgun
回复

使用道具 举报

9

主题

48

帖子

569

积分

⑤进阶

积分
569
 楼主| 发表于 2010-5-4 03:05:43 | 显示全部楼层
给了四个范例,这是其中第一个,文件夹名乱码为:僒儞僾儖1 NScripter偲偺抣偺傗傝庢傝
两个文件,00.txt是NS引擎脚本,system.lua是默认的lua脚本。

内容如下:
  1. *define
  2. luasub test1 ;僥僗僩娭悢侾
  3. luasub test2 ;僥僗僩娭悢俀
  4. luasub test3 ;僥僗僩娭悢俁
  5. luasub test4 ;僥僗僩娭悢係
  6. game
  7. *start
  8. 僥僗僩娭悢侾乮堷悢側偟乯@
  9. test1
  10. 僥僗僩娭悢俀乮堷悢傂偲偮乯@
  11. test2 "偁偄偆偊偍"
  12. 僥僗僩娭悢俁乮堷悢傆偨偮丄堦偮栚偑栠傝抣乯@
  13. test3 %4,"偐偒偔偗偙"
  14. 娭悢倲倕倱倲俁偐傜%4偑栠傝傑偟偨丅@
  15. 僥僗僩娭悢係乮堷悢側偟丄NSGoto偺幚尡乯@
  16. test4
  17. textclear
  18. bg black,10,500
  19. goto *start
  20. *label
  21. 僥僗僩娭悢係偱乽偼偄乿傪慖傫偩傜偙偙偵旘傫偱偒傑偡丅@
  22. end
复制代码


  1. function NSCOM_test1()
  2. NSOkBox("偪傖傫偲test1偑屇偽傟偰傑偡傛乕","寢壥昞帵")
  3. NSExec("bg #883333,10,500") --柦椷傕幚峴偱偒傑偡丅
  4. -- 偪側傒偵丄暥帤楍拞偵"偑彂偒偨偄応崌偼\\"偲偟傑偡丅
  5. -- 徻偟偔偼丄Lua偺擖栧彂摍傪偍妋偐傔偔偩偝偄丅
  6. end
  7. function NSCOM_test2()
  8. local str=NSPopStr()
  9. NSOkBox("test2偑堷悢乽"..str.."乿偱屇偽傟傑偟偨傛乕","寢壥昞帵")
  10. end
  11. function NSCOM_test3()
  12. local iindex=NSPopIntRef()
  13. NSPopComma()
  14. local str=NSPopStr()
  15. NSOkBox("test3偑堷悢俀乽"..str.."乿偱屇偽傟傑偟偨傛乕","寢壥昞帵")
  16. NSSetIntValue(iindex,10)
  17. end
  18. function NSCOM_test4()
  19. if (NSYesNoBox("goto *label偟傑偡偐丠","僕儍儞僾妋擣")==true) then
  20. NSGoto("*label")
  21. end
  22. end
复制代码

猜测如下:

00.txt中定义节的luasub定义了四个分别名为test1、test2、test3、test4的lua过程,分别对应system.lua中以“function...end”定义的函数。

第一个函数
  1. function NSCOM_test1()
  2. NSOkBox("偪傖傫偲test1偑屇偽傟偰傑偡傛乕","寢壥昞帵")
  3. NSExec("bg #883333,10,500") --柦椷傕幚峴偱偒傑偡丅
  4. -- 偪側傒偵丄暥帤楍拞偵"偑彂偒偨偄応崌偼\\"偲偟傑偡丅
  5. -- 徻偟偔偼丄Lua偺擖栧彂摍傪偍妋偐傔偔偩偝偄丅
  6. end
复制代码
function定义句,为"function NSCOM_"+lua过程名+"()"。这里的lua过程名要与00.txt中luasub后的字符串相同。
函数第一句,似乎是在System.lua脚本中使用“NSOkBox”命令,调出NS的OkBox对话框,内容为“偪傖傫偲test1偑屇偽傟偰傑偡傛乕”,标题栏为“寢壥昞帵”。
函数第二句,NSExec()命令应该就是用NS引擎执行括号中的文本命令。

后两句是乱码注释……


第二个函数
  1. function NSCOM_test2()
  2. local str=NSPopStr()
  3. NSOkBox("test2偑堷悢乽"..str.."乿偱屇偽傟傑偟偨傛乕","寢壥昞帵")
  4. end
复制代码

定义句,同test1
在00.txt脚本中,调用test2时后面跟了一个字符串:test2 "偁偄偆偊偍"
而lua脚本函数第一句local str=NSPopStr(),应该是将调用lua过程时后面跟的字符串赋值给lua脚本中的字符串变量str。
函数第二句,以OKBox的方式淡出提示,其文本就包含了从00.txt传递的字符串。
因此test2示例是从NS脚本传递字符串至lua脚本的范例。


第三个函数
  1. function NSCOM_test3()
  2. local iindex=NSPopIntRef()
  3. NSPopComma()
  4. local str=NSPopStr()
  5. NSOkBox("test3偑堷悢俀乽"..str.."乿偱屇偽傟傑偟偨傛乕","寢壥昞帵")
  6. NSSetIntValue(iindex,10)
  7. end
复制代码

在NS脚本中调用的语句是:test3 %4,"偐偒偔偗偙"
后面跟了一个变量,和一个字符串。
来看lua脚本中的函数,第一句应该是将%4变量以“传址(ByRef)”的方式传送给iindex,即在lua脚本中也可以修改%4的数值。
第二句NSPopComma没看懂……
第三句是将字符串传给str
第四句是OkBox提示框,与test2演示的功能类似。
第五句NSSetIntValue(iindex,10),是将10传递给iindex,也就传给了%4。

回到NS脚本后,“以娭悢倲倕倱倲俁偐傜%4偑栠傝傑偟偨丅@“打印到屏幕上,%4果然已经是10。
test3演示了从lua脚本到NS脚本的数据传递。


第四个函数
  1. function NSCOM_test4()
  2. if (NSYesNoBox("goto *label偟傑偡偐丠","僕儍儞僾妋擣")==true) then
  3.   NSGoto("*label")
  4. end
  5. end
复制代码

演示了lua脚本中if函数的使用。
并有两条命令:
NSYesNoBox,调用NS中的“是/否对话框”,有一个布尔变量的返回值。
NSGoto,即跳转到字符串所对应的NS标签。
我的百度空间:hi.baidu.com/wildgun
回复 支持 反对

使用道具 举报

9

主题

48

帖子

569

积分

⑤进阶

积分
569
 楼主| 发表于 2010-5-4 12:04:06 | 显示全部楼层
第二个例子,文件夹名乱码为“僒儞僾儖2-1 夋柺傪挼偹夞傞巐妏”,运行效果是一个弹跳的红色方块,撞到窗口四边后反弹。

00.txt脚本:
  1. *define
  2. luacall animation
  3. luasub animestart
  4. luasub animestop
  5. game
  6. *start
  7. animestart
  8. 杮暥偱偡乕丅@
  9. 偆傝傖偆傝傖偆傝傖乕丅@
  10. 僶僢僋僌儔僂儞僪偱摦偄偰偄傑偡丅@
  11. animestop
  12. 偲傔傑偟偨丅@
  13. end
复制代码



system.lua脚本:
  1. function NSCOM_animestart()
  2. x=100
  3. y=100
  4. vx=-8
  5. vy=-8
  6. NSExec("erasetextwindow 0") --偙傟偑側偄偲丄僥僉僗僩暥帤偑徚偊偰偟傑偆偺偱
  7. NSExec("lsp 0,\\":c;>50,50,#FF0000\\",0,0")
  8. NSExec("print 1")
  9. NSLuaAnimationMode(true);
  10. end
  11. function NSCOM_animestop()
  12. NSLuaAnimationMode(false);
  13. NSExec("vsp 0,0")
  14. NSExec("print 1")
  15. end
  16. function NSCALL_animation ()
  17. x=x+vx;
  18. y=y+vy;
  19. if (x<0) then x=0 vx=-vx end
  20. if (y<0) then y=0 vy=-vy end
  21. if (x>590) then x=590 vx=-vx end
  22. if (y>430) then y=430 vy=-vy end
  23. NSExec("amsp 0,"..x..","..y)
  24. NSExec("print 1")
  25. return true
  26. end
复制代码


NS脚本定义节中,分别有lucall和luasub两个命令。
我不是很清楚这两个命令的各自作用与具体区别,在NScripter API Reference中有如下说明:

Ver.2.93【定義節のみ】
るあこーる
luacallシステムカスタマイズ関連luacall NAME名前機能名(tag,text0,text,animation,close,end,savepoint,save,load)

NScripterのデフォルト動作のほとんどを、Lua関数で横取りすることができます。
表示文をスプライト機能で置き換えたり、システムカスタマイズなどをLuaで行えるようになります。
指定文字列は""で囲む必要はありません。また、大文字小文字も区別されません。
Lua側の関数名は、NSCALL_(指定文字列)となります。
Lua関数の引数や文字列は、それぞれの機能ごとに形式が定められています。
例)

テキスト表示時、Lua関数NSCALL_textを呼び出すよう設定する。
luacall text


Ver.2.93【定義節のみ】
るあさぶ
luasubシステムカスタマイズ関連luasub NAME名前任意の命令名

define節命令です。
命令名を受け取り、それをLua側のNSCOM_(命令名)という関数に結び付けます。
この命令を実行すると、以後シナリオスクリプト(00.txt~)でfunc命令を実行したときに、
Lua関数 NSCOM_func() が呼び出されます。
luasubで登録されるLua関数には引数も戻り値もありません。
引数や戻り値はそれぞれ下で説明している関数を使って利用してください。

※なお、既存の命令も上書きできます。
たとえばluasub bgとすると、もともとのbg命令ではなくluaのNSCOM_bg関数が優先されます。
もともとのbg命令を呼びたい場合は、defsubのときと同様_bgとしてください。
例)

Lua関数NSCOM_funcを呼び出すfunc命令を定義する。
luasub func


请懂日文的朋友帮忙翻译一下……

我个人理解,luacall是声明一个lua过程并直接调用,而luasub则是声明一个lua过程但不立即使用。

再看Lua脚本,函数NSCALL_animation规定了动画的运动规则
x=x+vx 横坐标每次增加vx,y=y+vy,纵坐标每次增加vy。
下面四个if语句,作用是实现碰壁反弹的效果。
再下面两句NSExec,作用是绘制出0号sp。

函数NSCOM_animestart(),定义了x、y、vx、vy的初值。
然后执行了三句语句,分别是清屏、定义0号sp、绘制。
NSLuaAnimationMode(true),这句应该是NS自定义的语句,似乎引入了“动画模式”的概念,具体不明。

函数NSCOM_animestop,第一行结束了动画模式。后两行执行NS的命令,清除0号sp。
我的百度空间:hi.baidu.com/wildgun
回复 支持 反对

使用道具 举报

9

主题

48

帖子

569

积分

⑤进阶

积分
569
 楼主| 发表于 2010-5-4 12:25:37 | 显示全部楼层
第三个示例,文件夹名乱码为“僒儞僾儖2-2 昞帵暥傪僗僾儔僀僩壔”。

NS脚本:
  1. *define
  2. luacall tag
  3. luacall text
  4. game
  5. *start
  6. 偁偄偆偊偍\\
  7. [僞僌偮偗偨]偐偒偔偗偙\\
  8. 偙傫側偐傫偠偱昞帵偝傟傑偡丅\\
  9. [偵傚偵傚]僗僾儔僀僩偱偡丅\\
  10. goto *start
  11. *textbtn
  12. ;晛捠偺儃僞儞張棟僒僽儖乕僠儞傪屇傫偱偄傑偡丅
  13. ;textgosub偺昁梫偑偁傝傑偣傫丅
  14. *lp
  15. ;幚尡側偺偱庤敳偒幚憰偱偡丅
  16. btndef clear
  17. btnwait2 %0
  18. if %0=0 return
  19. goto *lp
复制代码

lua脚本:
  1. function NSCALL_tag (tag)
  2. if (tag~="") then
  3.   NSExec("lsp 100,\\":s/20,20,0;#FFFFFF"..tag.."\\",20,300")
  4.   --lsp 100,":s/20,20,0;#FFFFFF(僞僌暥帤楍)",20,300 傪屇傫偱偄傑偡丅
  5. else
  6.   NSExec("csp 100")
  7. end
  8. end
  9. function NSCALL_text (text)
  10. NSExec("strsp 101,\\""..text.."\\",28,322,25,4,22,22,0,0,0,0,#FFFFFF")
  11. --strsp 101,"(昞帵暥帤楍)",28,322,乣丂傪屇傫偱偄傑偡丅
  12. NSExec("print 1")
  13. NSGosub ("*textbtn") --僒僽儖乕僠儞僐乕儖偟偰偄傑偡丅
  14. end
复制代码

这个案例我看得不是很明白。
大致就是在lua脚本中对一行文字的tag及正文文本进行格式化显示。
tag是方括号“[]”中的文字,而方括号后的为正文文本。
我不明白的在于,为什么程序能将字符串(tag和text)自动传入lua脚本。
我的百度空间:hi.baidu.com/wildgun
回复 支持 反对

使用道具 举报

9

主题

48

帖子

569

积分

⑤进阶

积分
569
 楼主| 发表于 2010-5-4 12:36:15 | 显示全部楼层
第三个函数,文件夹名乱码为“僒儞僾儖3 奺庬擖椡娭悢偺僒儞僾儖”,实现效果也很简单:将鼠标在当前窗口中的坐标显示在程序标题上。
NS脚本如下:
  1. ;嵍僋儕僢僋偐z僉乕擖椡偱廔椆丅
  2. *define
  3. luasub sub
  4. game
  5. *start
  6. print 1
  7. sub
  8. 偍偟傑偄\\
  9. end
复制代码
Lua脚本如下:
  1. function NSCOM_sub ()
  2. local x,y,l
  3. while true do
  4.   if NSDoEvents() then return end
  5.   NSSleep(1)
  6.   x,y=NSGetMouse()
  7.   NSExec("caption \\""..x..","..y.."\\"")
  8.   l=NSGetClick()
  9.   if l then return end
  10.   if NSGetKey("z") then return end
  11. end
  12. end
复制代码
NS脚本用luasub定义了一个名为sub的lua过程。当sub结束后则显示“偍偟傑偄\\”并结束。
lua脚本第一句定义了三个变量x、y、l。
接下来是个循环,当循环返回值为真时继续循环,返回值为假时跳出循环,进而跳出函数,回到NS脚本。
循环内的第一第二句没看懂……
第三句是取坐标。
第四句调用NS命令caption,改变程序窗口标题内容
第五句及第六句应该是检测程序是否有收到回车键或鼠标左键,如果有则返回假。
第七句是检测是否有按键“z”,有则返回假。
我的百度空间:hi.baidu.com/wildgun
回复 支持 反对

使用道具 举报

9

主题

48

帖子

569

积分

⑤进阶

积分
569
 楼主| 发表于 2010-5-4 12:41:05 | 显示全部楼层
综上,大致给出了我经过观察,对于四个简单范例中各语句功能的猜测。

现在看来NSlua仅仅是增加了lua脚本及对应的解释器。我不知道这样做的优势是什么,或许可以提高语句的复用性,使语句更为模块化?亦或者能让脚本看起来更接近高级语言一些?

不过仅仅是增加了一种新的脚本,并未改善NS引擎本身的执行效率。而且Lua脚本不能独立使用,必须将NS脚本和Lua脚本互相参杂在一起混合使用,破坏了原来NS的简洁易学的特性。
我的百度空间:hi.baidu.com/wildgun
回复 支持 反对

使用道具 举报

122

主题

3954

帖子

24万

积分

超级版主

传说中的Bunny坑神~!

Rank: 8Rank: 8

积分
244543

声命组铜赏

发表于 2010-5-13 22:56:09 | 显示全部楼层
貌似是为了修改一些普通脚本动不了的功能,算是补充吧。
乱码文件可以试试用convertz转成日文。
http://www.nvlmaker.net/
回复 支持 反对

使用道具 举报

5

主题

23

帖子

226

积分

③业余

=v=

积分
226
发表于 2010-6-17 14:12:02 | 显示全部楼层
Lua这语言似乎很简单而且比basic高级清爽些
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-4-26 15:39 , Processed in 0.019743 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表