幻想森林

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

[NS] [原创]NScripter全攻略:LEVEL 6 LSP的混沌宇宙(2)显示数字,

[复制链接]

122

主题

3954

帖子

24万

积分

超级版主

传说中的Bunny坑神~!

Rank: 8Rank: 8

积分
244543

声命组铜赏

发表于 2007-7-18 17:37:03 | 显示全部楼层 |阅读模式
……我为什么要写这个东西……自己也理解不能OTL
嘛,就当是填坑吧。

邪恶之诅咒:
盗帖者全家死光光
无端转载者出门被狗咬

假如获得转载授权,转载同时请贴出本人签字画押授权书。
本教程已在国家R界专利局申请专利,禁止任何形式的侵犯版权行为。

作者联系方式:
fs_countd@126.com

以下内容需要积分高于 0 才可浏览

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 ... 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条件时执行。比再跳转到某一标签继续执行要方便一些,对比较短的指令段,可以这么用。


http://www.nvlmaker.net/
回复

使用道具 举报

43

主题

1664

帖子

113802万

积分

⑥精研

月球背面:坑坑坑坑坑

积分
1138022059
QQ
发表于 2007-7-18 17:47:08 | 显示全部楼层
[s:6] 原来D还没忘啊……鼓掌鼓掌热烈鼓掌~~~~~~
不知不觉中居然成了现在这个样子啊
回复 支持 反对

使用道具 举报

3

主题

28

帖子

315

积分

④见习

积分
315
发表于 2007-7-18 18:44:11 | 显示全部楼层
啊啊,谢谢D桑,终于有点明白btnwait和btnwait2的区别了……
回复 支持 反对

使用道具 举报

6

主题

21

帖子

237

积分

③业余

积分
237
发表于 2007-7-18 19:22:46 | 显示全部楼层
终于出来了....貌似和LSP有关的东西偶都是研究伪圣书学会的.
回复 支持 反对

使用道具 举报

122

主题

3954

帖子

24万

积分

超级版主

传说中的Bunny坑神~!

Rank: 8Rank: 8

积分
244543

声命组铜赏

 楼主| 发表于 2007-7-18 20:58:07 | 显示全部楼层
楼上PM的问题,用AMSP/MSP+PRINT指令可以达成,不过要注意控制每次PRINT移动的间距.
http://www.nvlmaker.net/
回复 支持 反对

使用道具 举报

6

主题

21

帖子

237

积分

③业余

积分
237
发表于 2007-7-19 13:57:46 | 显示全部楼层
谢谢大大! [s:1] 我试试
回复 支持 反对

使用道具 举报

7

主题

44

帖子

485

积分

④见习

积分
485
QQ
发表于 2007-7-19 17:15:16 | 显示全部楼层
这个!这个难道是!
出来了哈~谢谢了
制作FATE同人中,求立绘
回复 支持 反对

使用道具 举报

19

主题

842

帖子

1万

积分

⑧专业

絕望青年,一起增高吧

积分
13676
发表于 2007-7-19 18:47:07 | 显示全部楼层
很久也沒看見NS區的更新了。。。XD

為著彼岸,便要與之妥協 但為著彼岸,更不能與之妥協

回复 支持 反对

使用道具 举报

122

主题

3954

帖子

24万

积分

超级版主

传说中的Bunny坑神~!

Rank: 8Rank: 8

积分
244543

声命组铜赏

 楼主| 发表于 2007-7-19 21:59:11 | 显示全部楼层
有研究NS的就多出教程嘛,不要让我这种已经跳槽的人再回来填坑OTL
http://www.nvlmaker.net/
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 13:38 , Processed in 0.033288 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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