wildgun 发表于 2010-5-4 02:40:04

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

访问http://www.nscripter.com/官网,新推出了个NSlua程序,好像是“NS的核心+Lua的脚本”这样的方式运行的,其中nslua.dll为读取.lua脚本的动态链接库文件。


有大大研究过么?

wildgun 发表于 2010-5-4 03:05:43

给了四个范例,这是其中第一个,文件夹名乱码为:僒儞僾儖1 NScripter偲偺抣偺傗傝庢傝
两个文件,00.txt是NS引擎脚本,system.lua是默认的lua脚本。

内容如下:


*define
luasub test1 ;僥僗僩娭悢侾
luasub test2 ;僥僗僩娭悢俀
luasub test3 ;僥僗僩娭悢俁
luasub test4 ;僥僗僩娭悢係
game

*start
僥僗僩娭悢侾乮堷悢側偟乯@
test1
僥僗僩娭悢俀乮堷悢傂偲偮乯@
test2 "偁偄偆偊偍"
僥僗僩娭悢俁乮堷悢傆偨偮丄堦偮栚偑栠傝抣乯@
test3 %4,"偐偒偔偗偙"
娭悢倲倕倱倲俁偐傜%4偑栠傝傑偟偨丅@
僥僗僩娭悢係乮堷悢側偟丄NSGoto偺幚尡乯@
test4
textclear
bg black,10,500
goto *start


*label
僥僗僩娭悢係偱乽偼偄乿傪慖傫偩傜偙偙偵旘傫偱偒傑偡丅@
end




function NSCOM_test1()
NSOkBox("偪傖傫偲test1偑屇偽傟偰傑偡傛乕","寢壥昞帵")
NSExec("bg #883333,10,500") --柦椷傕幚峴偱偒傑偡丅
-- 偪側傒偵丄暥帤楍拞偵"偑彂偒偨偄応崌偼\\"偲偟傑偡丅
-- 徻偟偔偼丄Lua偺擖栧彂摍傪偍妋偐傔偔偩偝偄丅
end

function NSCOM_test2()
local str=NSPopStr()
NSOkBox("test2偑堷悢乽"..str.."乿偱屇偽傟傑偟偨傛乕","寢壥昞帵")
end

function NSCOM_test3()
local iindex=NSPopIntRef()
NSPopComma()
local str=NSPopStr()
NSOkBox("test3偑堷悢俀乽"..str.."乿偱屇偽傟傑偟偨傛乕","寢壥昞帵")
NSSetIntValue(iindex,10)
end

function NSCOM_test4()
if (NSYesNoBox("goto *label偟傑偡偐丠","僕儍儞僾妋擣")==true) then
NSGoto("*label")
end
end

猜测如下:

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

第一个函数

function NSCOM_test1()
NSOkBox("偪傖傫偲test1偑屇偽傟偰傑偡傛乕","寢壥昞帵")
NSExec("bg #883333,10,500") --柦椷傕幚峴偱偒傑偡丅
-- 偪側傒偵丄暥帤楍拞偵"偑彂偒偨偄応崌偼\\"偲偟傑偡丅
-- 徻偟偔偼丄Lua偺擖栧彂摍傪偍妋偐傔偔偩偝偄丅
end

function定义句,为"function NSCOM_"+lua过程名+"()"。这里的lua过程名要与00.txt中luasub后的字符串相同。
函数第一句,似乎是在System.lua脚本中使用“NSOkBox”命令,调出NS的OkBox对话框,内容为“偪傖傫偲test1偑屇偽傟偰傑偡傛乕”,标题栏为“寢壥昞帵”。
函数第二句,NSExec()命令应该就是用NS引擎执行括号中的文本命令。

后两句是乱码注释……


第二个函数

function NSCOM_test2()
local str=NSPopStr()
NSOkBox("test2偑堷悢乽"..str.."乿偱屇偽傟傑偟偨傛乕","寢壥昞帵")
end


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


第三个函数

function NSCOM_test3()
local iindex=NSPopIntRef()
NSPopComma()
local str=NSPopStr()
NSOkBox("test3偑堷悢俀乽"..str.."乿偱屇偽傟傑偟偨傛乕","寢壥昞帵")
NSSetIntValue(iindex,10)
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脚本的数据传递。


第四个函数

function NSCOM_test4()
if (NSYesNoBox("goto *label偟傑偡偐丠","僕儍儞僾妋擣")==true) then
NSGoto("*label")
end
end


演示了lua脚本中if函数的使用。
并有两条命令:
NSYesNoBox,调用NS中的“是/否对话框”,有一个布尔变量的返回值。
NSGoto,即跳转到字符串所对应的NS标签。

wildgun 发表于 2010-5-4 12:04:06

第二个例子,文件夹名乱码为“僒儞僾儖2-1 夋柺傪挼偹夞傞巐妏”,运行效果是一个弹跳的红色方块,撞到窗口四边后反弹。

00.txt脚本:


*define
luacall animation
luasub animestart
luasub animestop
game

*start
animestart
杮暥偱偡乕丅@
偆傝傖偆傝傖偆傝傖乕丅@
僶僢僋僌儔僂儞僪偱摦偄偰偄傑偡丅@
animestop
偲傔傑偟偨丅@
end




system.lua脚本:

function NSCOM_animestart()
x=100
y=100
vx=-8
vy=-8
NSExec("erasetextwindow 0") --偙傟偑側偄偲丄僥僉僗僩暥帤偑徚偊偰偟傑偆偺偱
NSExec("lsp 0,\\":c;>50,50,#FF0000\\",0,0")
NSExec("print 1")
NSLuaAnimationMode(true);
end

function NSCOM_animestop()
NSLuaAnimationMode(false);
NSExec("vsp 0,0")
NSExec("print 1")
end

function NSCALL_animation ()
x=x+vx;
y=y+vy;
if (x<0) then x=0 vx=-vx end
if (y<0) then y=0 vy=-vy end
if (x>590) then x=590 vx=-vx end
if (y>430) then y=430 vy=-vy end
NSExec("amsp 0,"..x..","..y)
NSExec("print 1")
return true
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。

wildgun 发表于 2010-5-4 12:25:37

第三个示例,文件夹名乱码为“僒儞僾儖2-2 昞帵暥傪僗僾儔僀僩壔”。

NS脚本:

*define
luacall tag
luacall text
game
*start
偁偄偆偊偍\\
[僞僌偮偗偨]偐偒偔偗偙\\
偙傫側偐傫偠偱昞帵偝傟傑偡丅\\
[偵傚偵傚]僗僾儔僀僩偱偡丅\\
goto *start
*textbtn
;晛捠偺儃僞儞張棟僒僽儖乕僠儞傪屇傫偱偄傑偡丅
;textgosub偺昁梫偑偁傝傑偣傫丅
*lp
;幚尡側偺偱庤敳偒幚憰偱偡丅
btndef clear
btnwait2 %0
if %0=0 return
goto *lp


lua脚本:

function NSCALL_tag (tag)
if (tag~="") then
NSExec("lsp 100,\\":s/20,20,0;#FFFFFF"..tag.."\\",20,300")
--lsp 100,":s/20,20,0;#FFFFFF(僞僌暥帤楍)",20,300 傪屇傫偱偄傑偡丅
else
NSExec("csp 100")
end
end
function NSCALL_text (text)
NSExec("strsp 101,\\""..text.."\\",28,322,25,4,22,22,0,0,0,0,#FFFFFF")
--strsp 101,"(昞帵暥帤楍)",28,322,乣丂傪屇傫偱偄傑偡丅
NSExec("print 1")
NSGosub ("*textbtn") --僒僽儖乕僠儞僐乕儖偟偰偄傑偡丅
end


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

wildgun 发表于 2010-5-4 12:36:15

第三个函数,文件夹名乱码为“僒儞僾儖3 奺庬擖椡娭悢偺僒儞僾儖”,实现效果也很简单:将鼠标在当前窗口中的坐标显示在程序标题上。
NS脚本如下:

;嵍僋儕僢僋偐z僉乕擖椡偱廔椆丅
*define
luasub sub
game
*start
print 1
sub
偍偟傑偄\\
end


Lua脚本如下:

function NSCOM_sub ()
local x,y,l
while true do
if NSDoEvents() then return end
NSSleep(1)
x,y=NSGetMouse()
NSExec("caption \\""..x..","..y.."\\"")
l=NSGetClick()
if l then return end
if NSGetKey("z") then return end
end
end


NS脚本用luasub定义了一个名为sub的lua过程。当sub结束后则显示“偍偟傑偄\\”并结束。
lua脚本第一句定义了三个变量x、y、l。
接下来是个循环,当循环返回值为真时继续循环,返回值为假时跳出循环,进而跳出函数,回到NS脚本。
循环内的第一第二句没看懂……
第三句是取坐标。
第四句调用NS命令caption,改变程序窗口标题内容
第五句及第六句应该是检测程序是否有收到回车键或鼠标左键,如果有则返回假。
第七句是检测是否有按键“z”,有则返回假。

wildgun 发表于 2010-5-4 12:41:05

综上,大致给出了我经过观察,对于四个简单范例中各语句功能的猜测。

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

不过仅仅是增加了一种新的脚本,并未改善NS引擎本身的执行效率。而且Lua脚本不能独立使用,必须将NS脚本和Lua脚本互相参杂在一起混合使用,破坏了原来NS的简洁易学的特性。

CountD 发表于 2010-5-13 22:56:09

貌似是为了修改一些普通脚本动不了的功能,算是补充吧。
乱码文件可以试试用convertz转成日文。

tioover 发表于 2010-6-17 14:12:02

Lua这语言似乎很简单而且比basic高级清爽些
页: [1]
查看完整版本: 高桥直树好像又弄出了个NSlua程序?