toz 发表于 2005-7-26 16:16:33

ns学习心得——计时选项

;虽然是出于帮cexo san解决问题的动机写的,但还是按一贯的学习心得格式加上了详细的注释,方便初学的朋友学习。
;这个计时问答的基本思路是:不是以btntime来计时而是以循环配合内部时钟来计时,btntime是用来解决btnwait之后程序会停下来等待点击这个问题的。


*define


game

*start
setwindow 40,380,26,4,22,22,0,2,20,0,0,#6666aa,10,360,630,470
bg white,10,1000

以下为心理测试,请在时限内凭第一反应选择一个选项:\

lsp 1,":s/22,22,0;#999999#ff6666第一个选项",260,200
lsp 2,":s/22,22,0;#999999#ff6666第二个选项",260,230
lsp 3,":s/22,22,0;#999999#ff6666第三个选项",260,260
lsp 4,":s/30,26,2;#999999计时器",60,105
lsp 0,":s/20,20,0;#999999剩余时间  秒",160,150
prnum 0,10,215,150,20,20,#dd4060
bar 0,10000,160,100,320,40,10000,#eeee88
bar 1,0,160,100,320,40,10000,#ee6688
print 10,100


spbtn 1,1
spbtn 2,2
spbtn 3,3



;----------****重点开始分割线****---------


resettimer
;resettimer使内部时钟归零,开始计时

;预定问题的时限是10秒,这个循环的次数,至少要大于100次,因为每次btntime时间为100毫秒,什么都不点的话要循环100次才能走满10秒.100以上的数字可以随意写,反正也不指望靠它结束循环.
;btntime时间为100毫秒的理由是……要使bar的变化看上去像是动画,每秒刷新十次以上是基本吧?呵呵,也只不过是个人爱好啦……

for %10=0 to 1000
mov %1,0
mov %2,0

*bw

;下面这几个变量倒来倒去是为了解决每次goto *bw时btntime重新开始计时的问题.
mov %1,%1+%2
btntime 100-%1
btnwait %0
getbtntimer %2
;getbtntimer是用来取得btnwait至点击经过的时间的命令,书写格式是:
;getbtntimer 数字变量

if %1>=100 goto *nx
;这句虽然看似废话,但不写的话就会出现某种类似bug的东西,唉……说不清楚(实际上我也不明白是怎么回事),大家可以把这句删了然后试试用鼠标狂点空白处……然后谁来告诉我到底发生了什么事……
if %0=0 goto *bw
if %0=-1 goto *bw
if %0=-2 goto *nx
if %0=3 goto *s3
if %0=2 goto *s2
if %0=1 goto *s1

*nx
;这个才是真正的计时器
gettimer %3
;取得从resettimer开始至此经过的时间,是ns里最精确的计时方法,书写格式为:
;gettimer 数字变量

bar 1,%3,160,100,320,40,10000,#ff6688
mov %4,10000-%3+900;这个+900只是为了让倒计时看上去比较符合人的心理期待,最后一瞬间看到0,要的这个效果。
prnum 0,%4/1000,215,150,20,20,#dd4060
print 1
if %3>=10000 goto *s4
next



;----------****重点结束分割线****---------



;不知为何我无法用barclear来清除bar……应该是和prnumclear同样的用法吧?明明prnumclear都很好使的啊……只好先这样凑活了……
*s1
csp -1
prnumclear
bar 0,0,160,100,320,40,10000,#ffff88
bar 1,0,160,100,320,40,10000,#ff6688
print 10,100

选择了第一项的您,是个性坦率容易相处的人。\
goto *end



*s2
csp -1
prnumclear
bar 0,0,160,100,320,40,10000,#ffff88
bar 1,0,160,100,320,40,10000,#ff6688
print 10,100

选择了第二项的您,是温和体贴会照顾别人的人。\
goto *end



*s3
csp -1
prnumclear
bar 0,0,160,100,320,40,10000,#ffff88
bar 1,0,160,100,320,40,10000,#ff6688
print 10,100

选择了第三项的您,是思维活跃讨人喜欢的人。\
goto *end



*s4
csp -1
prnumclear
bar 0,0,160,100,320,40,10000,#ffff88
bar 1,0,160,100,320,40,10000,#ff6688
print 10,100

时间到……@
什么都没选的您……应该是个……@反应迟钝的人。XD@
或者您在测试我的计时系统。XD\
goto *end

*end
……@……@……\
以上文字均为虚构,如有雷同纯属巧合。\
结束\

end

月了心蓝 发表于 2005-7-26 19:16:31

这样做起来就很有紧迫感了

CountD 发表于 2005-7-26 21:15:10

惭愧DI自我反省ING...最近都没什么贡献.
toz桑辛苦的说.

cexo 发表于 2005-7-26 21:50:17

orz……感激不尽……
继续闭关修炼……辛苦toz sama了……
再次感激ing……
曾经尝试把bar和btntime对接……失败到无语……

月了心蓝 发表于 2005-7-28 13:28:57

就知道会被加精华,toz很刻苦的说,整天把自己的NS经验带给我们。

拉克薇尔 发表于 2005-7-31 05:15:26

这似乎也是目前ns里唯一能实现的计时选项方法
好处就不说了,坏处是如果时间定义的过短或者电脑配制不怎么地的话会出现点上去没反应的情况,另一个bug是计时中如果狂按enter的话计时会中断,原因不明……

toz 发表于 2005-7-31 09:25:10

那个鼠标狂点导致程序停滞的问题,虽然我也不明白是怎么回事,但是在循环里加了这一句后if %1>=100 goto *nx,似乎是解决了……

之前没加那句的时候我开调试窗口监视变量,发现连续点击速度过快的时候,可能是程序来不及运行到if %0=-2 goto *nx这句就不断地被打断,那个%1会迅速超过100,结果导致btntime成为负数,程序无法进行……大概是这样吧,我猜测……所以加了那么一句……

[此贴子已经被作者于2005-7-31 9:28:18编辑过]

Advance 发表于 2005-7-31 21:19:32

其实没有这种说法的,WINDOWS在向程序发送WM_KEYDOWN消息的时候,总是先将按键扫描码PUSH到WPARAM里面,然后等待该程序的回调函数PeekMessage。NSCR应该不会在执行每一句脚本之后都检查缓冲区是否有WM_KEYDOWN消息——这样做会丢失有用信息,而且使脚本处理速度变慢
所以大概是BUG吧……
页: [1]
查看完整版本: ns学习心得——计时选项