THE NVL Maker

 找回密码
 注册
搜索
查看: 13750|回复: 7

[系统修改] 在使用独立姓名栏姓名框的时候的立绘切换问题

[复制链接]

3

主题

8

帖子

0

精华

游戏开发者

积分
8
发表于 2019-8-15 19:46:18 | 显示全部楼层 |阅读模式
如图
参考了之前D大提供的steam上的一个版本的nvlmaker,对3.87_sim的版本做了修改后做出的独立姓名栏姓名框。但是在实际测试中发现,如果在对话时使用“显示人物”这一指令进行立绘的添加,那么姓名框的部分会先消失再重新出现,而下半部分的对话内容框则不会有这个问题的发生。
如果使用的是“载入图片”这一指令,姓名框和对话框都不会发生问题。
用steam上那个版本的nvlmaker测试发现有同样的问题。
我仔细对比了姓名框部分的语句和原先对话框部分的语句的区别,发现姓名框部分似乎是先载入里页然后再用crossfade显示出来的(?)而原先对话框部分是直接显示的(?),然后“显示人物”这一指令也是要先载入里页然后再用crossfade显示出来的(?),所以用了这个指令就产生问题了?
我不是很确定,并且也没有修改的思路,请问如何才能做到使用“显示人物”这个指令也不拖累独立姓名框呢?我不想一直都用“载入图片”来显示人物o(╥﹏╥)o
回复

使用道具 举报

16

主题

1003

帖子

0

精华

管理员

Rank: 9Rank: 9Rank: 9

积分
1024
发表于 2019-8-18 13:53:57 | 显示全部楼层
我查了一下nameframe的代码,按说是不会有这个问题,
但是我发现现在的版本[w]里面带有[clname]会在每次对话结束的[w]的时候就自动把姓名框清掉……
不过因为不知道版本改了多少所以我把姓名栏又处理了一下,然后提供一下现在用的代码吧。



  1. ;-------------------------------------------------------------------------------------------
  2. ;★独立姓名框
  3. ;-------------------------------------------------------------------------------------------
  4. [iscript]
  5. function drawNameFrame(id,page,color)
  6. {
  7.         var dic=f.config_dia.nameframe;

  8.         var layer;

  9.         if (page!="back") layer=kag.fore.layers[9];
  10.         else layer=kag.back.layers[9];

  11.         //使用文字层默认字体
  12.         if (dic.face!=void) layer.font.face=dic.face;
  13.         else layer.font.face=kag.fore.messages[0].userFace;

  14.         layer.font.height=dic.textsize;//设定字体大小
  15.         layer.font.italic=dic.italic;//是否斜体
  16.         layer.font.bold=dic.bold;//是否粗体

  17.         var x;
  18.         var y;

  19.         //设置姓名
  20.         var str=id;
  21.         if (id=='主角') str=f.姓+f.名;

  22.         //计算文字长宽
  23.         var width=layer.font.getTextWidth(str);
  24.         var height=layer.font.getTextHeight(str);

  25.         //描绘文字
  26.         if (dic.anchorc==true)
  27.         {
  28.                 x=(layer.width-width)/2;
  29.                 y=(layer.height-height)/2;
  30.         }
  31.         else
  32.         {
  33.                 x=(int)dic.textx;//设定按钮上文字位置的地方
  34.                 y=(int)dic.texty;
  35.         }
  36.        
  37.                 var psetting=%[];
  38.                 psetting.layer="9";
  39.                 if (page!=void) psetting.page=page;
  40.                
  41.                 //设定其他参数
  42.                 psetting.text=str;
  43.                 psetting.x=x;
  44.                 psetting.y=y;
  45.                 psetting.size=dic.textsize;

  46.                 //颜色为空,传入历史记录颜色
  47.                 if (color==void) color=history_color("【"+str+"】");
  48.                 //
  49.                 psetting.color=color;

  50.                 //字体样式
  51.                 psetting.italic=dic.italic;//是否斜体
  52.                 psetting.bold=dic.bold;//是否粗体

  53.                 psetting.edge=dic.edge;
  54.                 psetting.edgecolor=dic.edgecolor;
  55.                 psetting.shadow=dic.shadow;
  56.                 psetting.shadowcolor=dic.shadowcolor;

  57.                 //字体
  58.                 if (dic.face!=void) psetting.face=dic.face;
  59.                 else psetting.face=kag.fore.messages[0].userFace;

  60.                 //ptext进行描绘
  61.                 kag.tagHandlers.ptext(psetting);

  62. }
  63. [endscript]

  64. ;显示姓名栏
  65. [macro name=nameframe]
  66. ;描绘图片框
  67. [image layer=9 storage=&f.config_dia.nameframe.frame left=&f.config_dia.nameframe.left top=&f.config_dia.nameframe.top visible="true" page=%page]
  68. ;描绘文字
  69. [eval exp="drawNameFrame(mp.id,mp.page,mp.color)"]
  70. [if exp="mp.id=='主角'"]
  71. [htext text=&("【"+f.姓+f.名+"】")]
  72. [else]
  73. [htext text=&("【"+mp.id+"】")]
  74. [endif]
  75. [hr]
  76. [endmacro]

  77. ;消除姓名栏
  78. [macro name=clname]
  79. [freeimage layer=9 page=%page|fore]
  80. [endmacro]
复制代码

回复

使用道具 举报

16

主题

1003

帖子

0

精华

管理员

Rank: 9Rank: 9Rank: 9

积分
1024
发表于 2019-8-18 13:54:21 | 显示全部楼层

  1. ;-------------------------------------------------------------------------------------------
  2. ;★普通文字姓名
  3. ;-------------------------------------------------------------------------------------------
  4. [macro name=nametext]

  5. [nowait]

  6. ;修改姓名显示相对位置的地方
  7. ;去掉下面这行的;,就可以用了,坐标可以为负值
  8. ;【记得后面还有要把对话文字位置改回来的地方】
  9. ;[locate x=-50 y=0]

  10. ;使用人名默认颜色
  11. [eval exp="setfont()"]

  12. ;假如特别设定了颜色,使用传入的颜色值
  13. [font color=%color]

  14. ;非主角
  15. [if exp="mp.id!='主角'"]
  16. 【[emb exp="mp.id"]】
  17. [endif]

  18. ;为主角,没姓名时不显示
  19. [if exp="mp.id=='主角'"]
  20. [ch text="【" cond="f.姓!=void || f.名!=void"]
  21. [emb exp="f.姓"][emb exp="f.名"]
  22. [ch text="】" cond="f.姓!=void || f.名!=void"]
  23. [endif]

  24. [resetfont]

  25. [r]
  26. [endnowait]

  27. ;可以这里再把显示位置改回来
  28. ;[locate x=0 y=0]

  29. [endmacro]
复制代码
回复

使用道具 举报

16

主题

1003

帖子

0

精华

管理员

Rank: 9Rank: 9Rank: 9

积分
1024
发表于 2019-8-18 13:54:41 | 显示全部楼层
  1. ;-------------------------------------------------------------------------------------------
  2. ;★人名显示基础
  3. ;-------------------------------------------------------------------------------------------
  4. [macro name=npc]

  5. [layopt layer="message0" visible="true"]
  6. [current layer="message0"]
  7. [er]

  8. ;根据情况使用不同的姓名样式
  9. [if exp="f.config_dia.nameframe==void || f.config_dia.nameframe.use==false"]
  10. [nametext color=%color id=%id]
  11. [endif]

  12. ;附加显示
  13. [backlay]

  14. [if exp="f.config_dia.nameframe!=void"]
  15. [nameframe color=%color id=%id page="back" cond="f.config_dia.nameframe.use==true"]
  16. [endif]

  17. ;头像
  18. [if exp="mp.face!=void"]
  19. [image layer=8 page="back" storage=%face visible="true"]
  20. ;left/top位置可以自己调整,可以用数字,这里是根据编辑器设定的值,按底边中点对齐
  21. [layopt layer=8 page="back" left=&"(int)f.config_dia.face.left-kag.back.layers[8].width\2" top=&"(int)f.config_dia.face.top-kag.back.layers[8].height"]
  22. [endif]
  23. ;立绘
  24. [if exp="mp.fg!=void"]
  25. ;在原位置显示图片
  26. [eval exp="mp.layer='0'" cond="mp.layer==''"]
  27. [eval exp="mp.left=kag.fore.layers[mp.layer].left"]
  28. [eval exp="mp.top=kag.fore.layers[mp.layer].top"]
  29. [image layer=%layer page="back" storage=%fg left=%left top=%top visible="true"]
  30. [endif]
  31. [trans method="crossfade" time=100]
  32. [wt]

  33. [endmacro]
复制代码

回复

使用道具 举报

16

主题

1003

帖子

0

精华

管理员

Rank: 9Rank: 9Rank: 9

积分
1024
发表于 2019-8-18 13:55:54 | 显示全部楼层
  1. ;------------------------------------------------------------------
  2. ;★等待
  3. ;------------------------------------------------------------------
  4. [macro name=lr]
  5. [l][r]
  6. [endmacro]

  7. [macro name=w]
  8. ;可在这里加入等待语音播放完毕的指令
  9. [endvo]
  10. [p]
  11. [stopse buf="1"]
  12. ;使用下面这行的话姓名框会在对话结束时自动清掉,不使用则需要手动在脚本里插入清除
  13. ;[clname]
  14. [hr]
  15. [endmacro]
复制代码
回复

使用道具 举报

3

主题

8

帖子

0

精华

游戏开发者

积分
8
 楼主| 发表于 2019-8-18 17:18:42 | 显示全部楼层

非常感谢!就是那行[clname]惹得祸!真是很神奇,因为用显示图片之类的指令它就是没有这个毛病我真是百思不得其解OTL
另外我还想问一个问题,endlist的界面,从上一页到下一页的刷新时间是哪些语句定义的?我看不太懂,我每次从上一页到下一页都会有近一秒的时间,感觉不流畅想调整。麻烦您了!
回复

使用道具 举报

16

主题

1003

帖子

0

精华

管理员

Rank: 9Rank: 9Rank: 9

积分
1024
发表于 2019-8-20 17:59:29 | 显示全部楼层
刷新页面多了个
;避免按键太快,等待100毫秒
[wait time=100]
大概是这个的锅?
可以改成少点的等待时间。
------------------------------------------
用显示图片指令不是没有这个问题,只是没有trans时间,导致看不出来(。
回复

使用道具 举报

3

主题

8

帖子

0

精华

游戏开发者

积分
8
 楼主| 发表于 2019-8-21 17:49:27 | 显示全部楼层
VariableD 发表于 2019-8-20 17:59
刷新页面多了个
;避免按键太快,等待100毫秒
[wait time=100]

这个我试过,但实际效果是改成1和100没有什么体感上的区别,似乎低于500以后体验都是一样的,就像掉了帧一般的切换...
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|nvlmaker

GMT+8, 2024-5-29 04:41 , Processed in 0.009038 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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