pimp1234 发表于 2007-3-7 18:15:26

[求助]如何计算文字框的大小&所希望放置的位置的坐标

1,如何计算文字框的大小&所希望放置的位置的坐标呢,如何编排文字才不会超出框外?

2,有制作标题(就是一开始的那些"开始游戏""读取进度"的东西...)的教程吗...太乱...找不到..看过有一个...但太全面...所以看不懂(全面导致解释不全... )

谢谢~

dcx_310 发表于 2007-3-7 18:59:14

那个教程不是很清楚了嘛:

语法使用:
 setwindow
( 设定讯息视窗)
 使用此命令后 以后的文字显示均用「讯息视窗」表示
 「setwindow」是用来表示讯息视窗的位置、大小、文字的设定。

首先是刚开始的四个数字。
setwindow30,320,22,4,26,26,0,2,20,1,1,#5599dd,20,310,619,450
「第一个数字30」和「第二个数字320」是表示「文字显示开始的座标X、Y」。
「第三个数字22」和「第四个数字4」是表示「讯息框长以及宽可以容纳几个文字」。
如果往后的显示文字的时候超出「讯息框可容纳的字数」将会跑出错误讯息,也请多加注意这点

再来、NScripter的画面固定为640×480像素。
画面的左上端的座标是(0,0)、则画面的右下角的座标为(639,439)
(因为右下角还有一个的视窗灰框围绕著NScripter)

再来的四个数字。
 setwindow 30,320,22,4,26,26,0,2,20,1,1,#5599dd,20,310,619,450
「第一个数字26」和「第二个数字26」是表示「文字的大小(FontSize)X Y 「第三个数字0和「第四个数字2」是表示「字与字的间格X以及Y(就是与右边的字间格大小以及下面一行的字间格大小」。
 请依照你的喜好进行设定,不过最好请把第一个和第二个字形大小设为相同!
 例如:要设定17大小的字形,就请你设定为17,17

接下来的4个数字。
 setwindow 30,320,22,4,26,26,0,2,20,1,1,#5599dd,20,310,619,450
 第一个数字是「文字讯息表示速度」。
 第二个「粗体字开关」。(0代表没有粗体,1代表有粗体)
 第三个是「阴影开关」
第四个是「视窗颜色(半透明)」采用HTML的颜色标记,请您详细研读上节,上节有详细的说明

最后的四个数字
setwindow 30,320,22,4,26,26,0,2,20,1,1,#5599dd,20,310,619,450
第一个和第二个是「文字讯息框的左上端座标X、Y」。
第三个和第四个是「文字讯息框的右下角座标X、Y」






太全面怎么办?缩句吗?

pimp1234 发表于 2007-3-7 20:24:57

感谢~

ER...第2个问题....我的意思是那篇教程涉及内容太多...所以没细节解释很难懂..囧

dcx_310 发表于 2007-3-8 19:08:15

慢慢地、耐心地看,基础的东西是不能走捷径的

眷恋 发表于 2007-3-8 20:46:02

可是怎么制作开始的标题呢?(就是在开始游戏时“开始游戏”“继续进度”“CG”)
谢谢!!

dcx_310 发表于 2007-3-8 21:29:09

可以通过在图片上确定一块按钮区域来实现嘛。

自定义系统设定及存取菜单的按钮既可以设定成在文字框附近一直出现,也可以设定成点击鼠标右键后出现。这里我们以前者为例进行说明。
首先是*text_lb部分的设定:

*text_lb
erasetextwindow 0
lsp 1,":c/2,0,3;data\\img\\sysbtn.bmp",530,320,120
lsp 6,":c/2,0,3;data\\img\\autobtn.bmp",330,460,120
lsp 7,":c/2,0,3;data\\img\\lkbkbtn.bmp",430,460,120
lsph 8,":c/2,0,3;data\\img\\skipbtn.bmp",530,460,120
lsph 9,":c,0,3;data\\img\\autobtnon.bmp",330,460,120
if %179==1 vsp 9,1:vsp 6,0
if %179==0 vsp 6,1:vsp 9,0
print 1
gosub *sysbtn

这部分的设定主要是将事先做好的菜单按钮显示到相应的文字框附近。其中6号和9号sp是自动模式按钮开启和关闭的两个状态,通过变量%179来用vsp指令控制其显示状态。

接着是*sysbtn的设定:

*sysbtn
spbtn 1,1
spbtn 6,6
spbtn 7,7
spbtn 8,8
return

*sysbtn的位置在*text_lb之前,return到*text_lb后自动执行下一条指令:

*textbtnloop
if %179==1 vsp 9,1:vsp 6,0
if %179==0 vsp 6,1:vsp 9,0

print 1

if %178!=2000 && %178!=3000 && %178!=4000 && %178!=5000 && %178!=6000 mov %178,3000
if %179==1 btntime %178
if %179==0 btntime -1
textbtnwait %0
repaint
if %0==-2 goto *end_textbtn
if %0==-1 vsp 1,0:vsp 6,0:vsp 7,0:vsp 8,0:vsp 9,0:print 1:systemcall windowerase:goto *text_lb
if %0==1 goto *systembtn
if %0==0 goto *end_textbtn
if %0==6 && %179==0 mov %179,1:goto *textbtnloop
if %0==6 && %179==1 mov %179,0:goto *text_lb
if %0==7 systemcall lookback:goto *text_lb
if %0==8 systemcall skip:goto *text_lb

if %0==100 goto *systembtn

goto *textbtnloop

这 个就是菜单按钮的主循环事件。其中%178用于控制自动模式的点击时间间隔,btntime -1表示手动模式。sysbtn是按钮“SYSTEM”,包括了“save”、“load”、“option”、“exit”四个弹出菜单按钮。 “lookback”为回想按钮,“skip”为跳过对话按钮。

其中,%0==0,即鼠标左键单击除按钮外的其他地方时,执行*end_textbtn:

*end_textbtn
texec
saveon
erasetextwindow 1
return

这个“return”会执行下一条指令,表现在AVG中就是继续进行下面的对话,刚好符合制作需要,相当巧妙。

然后是system的弹出菜单:

*systembtn
lsph 2,":c/2,0,3;data\\img\\savebtn.bmp",530,240,120
lsph 3,":c/2,0,3;data\\img\\loadbtn.bmp",530,260,120
lsph 4,":c/2,0,3;data\\img\\optbtn.bmp",530,280,120
lsph 5,":c/2,0,3;data\\img\\exitbtn.bmp",530,300,120

spbtn 2,2
spbtn 3,3
spbtn 4,4
spbtn 5,5

vsp 2,1
vsp 3,1
vsp 4,1
vsp 5,1
print 10,200
btnwait %0
if %0<=1 csp 2:csp 3:csp 4:csp 5:lsp 1,":c/2,0,3;data\\img\\sysbtn.bmp",530,320,120:goto *text_lb
if %0==2 csp 2:csp 3:csp 4:csp 5:goto *savesub:goto *text_lb
if %0==3 csp 2:csp 3:csp 4:csp 5:goto *textloadsub:goto *text_lb
if %0==4 csp 2:csp 3:csp 4:csp 5:goto *optionsub:goto *text_lb
if %0==5 csp 2:csp 3:csp 4:csp 5:goto *gamereset
纯粹的设定按钮位置和跳转事件而已,不予赘述。

之 后就是一系列的系统按钮设定,其主要思路就是通过按钮改变变量,再由变量设定系统参数,从而改变系统的音乐音效音量、自动模式点击时间间隔、窗口及全屏状 态等等。由于比较起其他部分来确实难度较小,加之代码较长,就不贴出来了。注意事先要用btndef ""清除按钮设定。

以下是很重要的自定义存档系统界面:

*savesub

btndef ""
csp -1
repaint

lsph 39,":c,0,3;data\\bg\\slbg.jpg",0,0
lsph 38,":a/2,0,3;data\\img\\exitbtn2.bmp",530,420

lsph 21,":a/2,0,3;data\\img\\slbtn.bmp",60,85
lsph 22,":a/2,0,3;data\\img\\slbtn.bmp",60,128
lsph 23,":a/2,0,3;data\\img\\slbtn.bmp",60,171
lsph 24,":a/2,0,3;data\\img\\slbtn.bmp",60,214
lsph 25,":a/2,0,3;data\\img\\slbtn.bmp",60,257
lsph 26,":a/2,0,3;data\\img\\slbtn.bmp",60,300
lsph 27,":a/2,0,3;data\\img\\slbtn.bmp",60,343
lsph 28,":a/2,0,3;data\\img\\slbtn.bmp",60,386


spstr "P38P39"
spstr "P21P22P23P24P25P26P27P28"

print 10,200


goto *savesub0

*savesub中主要设定了界面及按钮,这里根据界面和按钮的大小设定了8个存档位置。

*savesub0

lsp 13,":s/24,24,0;#ffffff$211",60,85
lsp 14,":s/24,24,0;#ffffff$212",60,128
lsp 15,":s/24,24,0;#ffffff$213",60,171
lsp 16,":s/24,24,0;#ffffff$214",60,214
lsp 17,":s/24,24,0;#ffffff$215",60,257
lsp 18,":s/24,24,0;#ffffff$216",60,300
lsp 19,":s/24,24,0;#ffffff$217",60,343
lsp 20,":s/24,24,0;#ffffff$218",60,386



repaint

goto *savesub1

存档信息的显示。注意用不同的变量独立记录各存档的信息,以免造成混乱。

*savesub1

spbtn 38,38

spbtn 21,1
spbtn 22,2
spbtn 23,3
spbtn 24,4
spbtn 25,5
spbtn 26,6
spbtn 27,7
spbtn 28,8

goto *savesub2

以上是8个存档位置按钮的定义。

dcx_310 发表于 2007-3-8 21:31:58

*savesub2

btnwait2 %0

if %0<=0 goto *savesub2
if %0==38 goto *saveexit

if %0==1 mov %21,60:mov %22,90:mov %23,13
if %0==2 mov %21,60:mov %22,138:mov %23,14
if %0==3 mov %21,60:mov %22,186:mov %23,15
if %0==4 mov %21,60:mov %22,234:mov %23,16
if %0==5 mov %21,60:mov %22,282:mov %23,17
if %0==6 mov %21,60:mov %22,330:mov %23,18
if %0==7 mov %21,60:mov %22,378:mov %23,19
if %0==8 mov %21,60:mov %22,426:mov %23,20


savefileexist %1,%0
if %1==0 btndef "":savegame %0:goto *savesub3
if %1==1 btndef "":goto *savecover
goto *savesub3

点击存档按钮的事件设定。用变量记录点击按钮的坐标位置用于之后显示存档信息。对存档是否存在进行判断后决定直接存档还是询问是否覆盖。



*savesub3
savefileexist %1,%0
if %1==0 mov $1,"[ 未使用 ]"
if %1==1 goto *savestr
goto *savesub4

存档情况的判断,之后决定存档信息的采用。$1用于记录存档信息。这里只是先记录,并不包括显示。

dcx_310 发表于 2007-3-8 21:34:00

*savecover

btndef ""
lsph 8,":c,0,3;data\\img\\mbscover.jpg",170,100,255
lsph 6,":l/2,0,3;data\\img\\mbyes.bmp",240,220
lsph 7,":l/2,0,3;data\\img\\mbno.bmp",380,220
spstr "P6P7P8"
print 10,200
goto *savecover1

*savecover1

spbtn 6,1
spbtn 7,2
btnwait %3
if %3==-1 btndef "":spstr "C6C7C8":repaint:goto *savesub1
if %3==0 goto *savecover1
if %3==1 spstr "C6C7C8":repaint:savegame %0:goto *savesub3
if %3==2 btndef "":spstr "C6C7C8":repaint:goto *savesub1

goto *savesub1

覆盖存档的询问和处理。mb就是messagebox的缩写。这里,save的编号和按钮的编号是一致的,做起来比较方便。

*savestr
savetime %0,%11,%12,%13,%14:mov $1,$4:itoa $2,%11:add $1,$2:add $1,"\\":itoa $2,%12:add $1,$2:add $1," ":itoa $2,%13:add $1,$2:add $1,":":itoa $2,%14
if %14<10 add $1,"0"
add $1,$2:add $1,"  "
goto *savesub4

存档信息的制作,包括存档的时间和其他信息。其他信息包括在$4中,需要在AVG进程中的不同阶段进行更新。

*savesub4
csp %23
if %23==13 mov $211,$1:lsp %23,":s/24,24,0;#ffffff$211",%21,%22
if %23==14 mov $212,$1:lsp %23,":s/24,24,0;#ffffff$212",%21,%22
if %23==15 mov $213,$1:lsp %23,":s/24,24,0;#ffffff$213",%21,%22
if %23==16 mov $214,$1:lsp %23,":s/24,24,0;#ffffff$214",%21,%22
if %23==17 mov $215,$1:lsp %23,":s/24,24,0;#ffffff$215",%21,%22
if %23==18 mov $216,$1:lsp %23,":s/24,24,0;#ffffff$216",%21,%22
if %23==19 mov $217,$1:lsp %23,":s/24,24,0;#ffffff$217",%21,%22
if %23==20 mov $218,$1:lsp %23,":s/24,24,0;#ffffff$218",%21,%22
repaint
goto *savesub0

*saveexit
btndef ""
csp -1
print 10,50
goto *text_lb

存档信息的代入和更新。退出存档系统后清除按钮定义。


读取进度和储存进度的制作原理是基本相同的,这里就不再贴出长长的代码了。但是要注意标题画面的读取和进程中的读取要分别独立制作。

*gamereset

btndef ""
lsph 42,":c,0,3;data\\img\\mbreset.jpg",170,100,200
lsph 41,":l/2,0,3;data\\img\\mbyes.bmp",240,220,200
lsph 40,":l/2,0,3;data\\img\\mbno.bmp",380,220,200
spstr "P40P41P42"
print 10,200
goto *gamereset1

*gamereset1

spbtn 41,1
spbtn 40,2
btnwait %0
if %0==-1 csp -1:repaint:goto *text_lb
if %0==0 goto *gamereset1
if %0==1 csp -1:texec:erasetextwindow 1:saveon:repaint:goto *title0
if %0==2 csp -1:repaint:goto *text_lb

goto *text_lb

点击system按钮下的exit按钮后的确认及返回标题画面。

pimp1234 发表于 2007-3-9 12:03:25

.....那个...LS是在翻译公主线吗...

pimp1234 发表于 2007-3-9 12:19:08

....有个不厚道的请求....可以截几张图看看吗...
页: [1] 2
查看完整版本: [求助]如何计算文字框的大小&所希望放置的位置的坐标