THE NVL Maker

 找回密码
 注册
搜索
楼主: 瑭谈音

[系统修改] 道具系统的点击显示以及买卖系统、合成系统的其他问题

[复制链接]

3

主题

14

帖子

0

精华

游戏开发者

积分
14
 楼主| 发表于 2015-11-26 19:58:05 | 显示全部楼层
VariableD 发表于 2015-11-26 17:21
要加message5要在macro.ks里把laycount的message层数量增加……原来是
[laycount messages=5]
要改成[layco ...

万万没想到,竟然是这样的……
在做合成系统的时候,我的设定是先在道具系统里学习配方后,合成界面才会出现相应的Button,点击后显示需要的材料和已有该种材料的数量,如果满足条件合成按钮才能点击,当然点击后就得到相应的成品。
我感觉我大体的思路十分清晰,但问题是……写程序的时候我完全不知道从哪里开始才好。
怎么样道具系统学习过的配方在合成界面里显示?我用f.item[f.选择物品编号].edu=1来表示已经学习过该种配方,大概也清楚可以用f.item[f.选择物品编号].edu == true来判断,不过后面具体应该怎么做?D大能帮忙想个思路嘛……
回复

使用道具 举报

16

主题

990

帖子

0

精华

管理员

Rank: 9Rank: 9Rank: 9

积分
1011
发表于 2015-11-28 10:42:29 | 显示全部楼层
一种思路是和道具系统一样,配方数据库类似于物品数据库,每当学习配方就等于获得一个配方。这样就可以直接用道具系统改写一套……
回复

使用道具 举报

3

主题

14

帖子

0

精华

游戏开发者

积分
14
 楼主| 发表于 2015-11-29 08:54:44 | 显示全部楼层
VariableD 发表于 2015-11-28 10:42
一种思路是和道具系统一样,配方数据库类似于物品数据库,每当学习配方就等于获得一个配方。这样就可以直接 ...

道具系统的数据读入我完全弄不明白,一旦使用悬停函数就会发生错误。提示信息是无法将void转换为object。
回复

使用道具 举报

16

主题

990

帖子

0

精华

管理员

Rank: 9Rank: 9Rank: 9

积分
1011
发表于 2015-11-29 11:58:26 | 显示全部楼层
当描绘道具列表的时候,是按玩家拥有的道具这个数组的顺序描绘的。
数组中取得某一行资料,具体用的就是数字ID。
当描绘按钮的同时指定悬停函数,同时传入当前所描绘这个按钮对应的数组数字ID。
在按钮显示出来并被玩家选中时,显示数组中对应ID的道具名称和其他资料。


如果不清楚哪里出错了请贴代码修改的地方,否则没法判断。
回复

使用道具 举报

3

主题

14

帖子

0

精华

游戏开发者

积分
14
 楼主| 发表于 2015-11-29 15:41:56 | 显示全部楼层
VariableD 发表于 2015-11-29 11:58
当描绘道具列表的时候,是按玩家拥有的道具这个数组的顺序描绘的。
数组中取得某一行资料,具体用的就是数 ...

_(:зゝ∠)_在得到D大回答前我已经用笨办法解决了这个问题,简而言之就是把recipe.intro从tjs里弄了出来,重新定义为f.recipeitro[],然后赋予解释说明直接扔到ui宏的最后面就ok了……
虽然感觉档次一下就低了,不过好歹是把问题解决了,也算是成功?
对于数据读入还是不明觉厉,我感觉我还是再去看看tjs的手册吧……
回复

使用道具 举报

3

主题

14

帖子

0

精华

游戏开发者

积分
14
 楼主| 发表于 2015-12-3 09:28:15 | 显示全部楼层
本帖最后由 瑭谈音 于 2015-12-3 17:04 编辑
VariableD 发表于 2015-11-29 11:58
当描绘道具列表的时候,是按玩家拥有的道具这个数组的顺序描绘的。
数组中取得某一行资料,具体用的就是数 ...

D大我又有新问题了_(:зゝ∠)_是道具系统按钮上文字那一部分的。
一开始我没有注意到,今天做测试的时候发现,必须把鼠标移动到按钮上才会显示物品数量,而不像是D大你给出的范例,只要打开界面就会显示数量,我自己对比了一下感觉没啥差别啊……我还是把代码贴出来D大你帮忙看一下吧……
macro_item_ui的,macro_item的我没有动。
  1. [iscript]

  2. function draw_item()
  3. {
  4.         //------【修改排版的位置】------
  5.         
  6.         //设定每页显示的物品数量
  7.         var per_num=11;
  8.         //设定按钮位置
  9.         var x=236;
  10.         var y=61;
  11.         //设定按钮间距
  12.         var line_space=38;
  13.         
  14.         //---------------------------------
  15.         
  16.         //计算物品页数
  17.         f.物品总页数=f.item.count\per_num;
  18.         if (f.item.count%per_num>0) f.物品总页数++;
  19.         
  20.         //假如物品总页数<1,说明不存在物品,那么就不继续了
  21.         if (f.物品总页数<1)
  22.         {
  23.                 f.当前物品页=0;
  24.                 return;
  25.         }
  26.         
  27.         //保证当前物品页不为0,且不超过物品总页数
  28.         if (f.当前物品页<1) f.当前物品页=1;
  29.         if (f.当前物品页>f.物品总页数) f.当前物品页=f.物品总页数;
  30.         
  31.         for (var i=0;i<per_num;i++)
  32.         {
  33.                  //准备显示的物品编号
  34.             var item_index=(int)(f.当前物品页-1)*per_num+(int)i;

  35.                     //假如超过了物品列表总数(最后一页物品已经显示完毕),跳出循环
  36.              if (item_index>=f.item.count) break;
  37.             
  38.              //假如没有超过,继续显示

  39.                         //用TJS的方式设定按钮坐标
  40.                      kag.tagHandlers.locate(%["x" => x, "y" => y+i*line_space ]);
  41.                      
  42.                      //【描绘小函数1】创建物品按钮
  43.                         draw_item_button(item_index);
  44.                      //【描绘小函数2】在物品按钮上描绘物品名称和数量
  45.                      draw_item_name(item_index);

  46.         }
  47. }
  48. [endscript]

  49. ;---------------------------------------描绘小函数1:创建单个物品按钮---------------------------------------
  50. [iscript]

  51. function draw_item_button(item_index)
  52. {
  53.          //设定物品按钮的具体属性
  54.          var mybutton=new Dictionary();
  55.          
  56.          //【修改按钮图形】
  57.          mybutton.normal="物品条1";
  58.          mybutton.over="物品条2";
  59.          
  60.          //【悬停效果函数】设定鼠标移动到物品按钮上和离开时的效果
  61.          //mybutton.onenter="draw_item_icon("+item_index+")";
  62.          //mybutton.onleave="hide_item_icon()";
  63.          
  64.          //设定按钮按下后的效果,跳转到标签 *物品数据
  65.          mybutton.target="*物品数据";
  66.          //按下后会将物品编号赋值给 f.选择物品编号 这个变数
  67.          mybutton.exp="f.选择物品编号="+item_index;
  68.          

  69.          //用tjs的方式创建按钮
  70.          kag.tagHandlers.button(mybutton);
  71.          
  72. }
  73. [endscript]
  74. ;---------------------------------------描绘小函数2:描绘物品按钮上的文字---------------------------------------
  75. [iscript]

  76. function draw_item_name(item_index)
  77. {

  78.         var mybutton=kag.current.links[kag.current.links.count-1].object;
  79.         
  80.         //字体大小
  81.         mybutton.font.height=18;
  82.         mybutton.font.face=kag.fore.messages[0].userFace;
  83.         //根据传入的编号取得物品名称
  84.         var str=f.item[item_index].name;
  85.         
  86.         //文字在按钮上的坐标
  87.         var x=18;
  88.         var y=10;
  89.         //描绘物品名称
  90.         mybutton.drawText(x,                           y, str, 0xc9c9c9);
  91.         mybutton.drawText(x+mybutton.width,              y, str, 0xc9c9c9);
  92.         mybutton.drawText(x+mybutton.width+mybutton.width, y, str, 0xc9c9c9);
  93.         
  94.         //取得物品数量
  95.         var str=f.item[item_index].num;
  96.         //文字在按钮上的坐标
  97.         var x=400;
  98.         var y=10;
  99.         //描绘物品数量
  100.         mybutton.drawText(x,                           y, str, 0xc9c9c9);
  101.         mybutton.drawText(x+mybutton.width,              y, str, 0xc9c9c9);
  102.         mybutton.drawText(x+mybutton.width+mybutton.width, y, str, 0xc9c9c9);
  103. }
  104. [endscript]
复制代码

此外还有一个问题,比如我现在系统设定的是玩家得到配方,学习配方后才能合成,我如何让配方不需要重复学习?
  1. *配方数据
  2. @backlay
  3. @image layer=15 storage="itemectbgd" visible="true"
  4. @eval exp='draw_recipe_icon(f.选择配方编号)'
  5. @eval exp="f.制作=f.recipe[f.选择配方编号].edu"
  6. @call target="*刷新配方"
  7. @s
  8. ;------------------------------------------------------------
  9. *使用配方
  10. [iscript]
  11. //在控制台输出配方名称
  12. dm("选择使用配方:"+f.recipe[f.选择配方编号].name);
  13. [endscript]
  14. ;可以在这里写一些判断
  15. ;【例如】假如物品可以学习,那么每次点击减少一个物品
  16. @if exp="f.recipe[f.选择配方编号].edu==0"
  17. @subrecipe num="1" name=&"f.recipe[f.选择配方编号].name"
  18. @eval exp="f.recipe[f.选择配方编号].edu=1"
  19. @endif
  20. @jump target="*刷新配方"
  21. @s
复制代码

这样写代码的话,程序会报错,说无法将void转变为object……
回复

使用道具 举报

16

主题

990

帖子

0

精华

管理员

Rank: 9Rank: 9Rank: 9

积分
1011
发表于 2015-12-4 18:50:22 | 显示全部楼层
1.是不是按钮太小了,描绘数量的那个文字(106行是x位置,x=400)出框了……

2.不需要重复学习就不用统计就行了……或者加一行判断如果已经学习过了就无视,没学习的再加上。
报错具体是哪一行?
没有提供刷新配方的代码,
单看下面这段感觉逻辑有点问题。
配方数据这里backlay以后image没有page=back,后面也没有trans/wt,就直接接了call刷新配方,到了使用配方这里变成了jump到之前call的一个标签……确认这么写没问题么……


回复

使用道具 举报

3

主题

14

帖子

0

精华

游戏开发者

积分
14
 楼主| 发表于 2015-12-6 11:26:09 | 显示全部楼层
本帖最后由 瑭谈音 于 2015-12-6 17:44 编辑
VariableD 发表于 2015-12-4 18:50
1.是不是按钮太小了,描绘数量的那个文字(106行是x位置,x=400)出框了……

2.不需要重复学习就不用统计 ...

@eval exp="f.recipe[f.选择配方编号].edu=1"
这一行报错的。
另外call和jump那里运行没有问题,所以没发现写的不统一。至于page=back这个是我复制粘贴的时候忘记了。刷新配方如下。
  1. *刷新配方
  2. @backlay
  3. @current layer="message4"
  4. @er
  5. @pimage layer=14 page=fore storage=配方2 visible=true dx=325 dy=71
  6. @locate x=250 y=71
  7. @button normal=材料1 over=材料2 target=*材料
  8. @locate x=400 y=71
  9. @button normal=药品1 over=药品2 target=*成品
  10. @if exp="f.制作==0"
  11. @locate x=570 y=380
  12. @button normal=使用1 over=使用2 target=*使用配方
  13. @endif
  14. ;描绘配方按钮
  15. @eval exp="draw_recipe()"
  16. ;描绘翻页按钮
  17. @recipe_page page="back"
  18. @s
复制代码

此外,D大你造怎么样能让按钮点击后保持高亮(或over状态)吗?
回复

使用道具 举报

16

主题

990

帖子

0

精华

管理员

Rank: 9Rank: 9Rank: 9

积分
1011
发表于 2015-12-8 16:46:05 | 显示全部楼层
call和jump那个地方的不是运行有没有问题的问题,是感觉你不知道自己写的这段的思路,同理出现一行多的backlay但没有对应的trans证明你没有理解这行是干嘛的所以留它在那里。这些跑起来初看可能没问题但是都是安全隐患。

@eval exp="f.recipe[f.选择配方编号].edu=1"如果这行报错你要确定的就是:
(1)f.recipe是不是个数组
(2)f.recipe[f.选择配方编号]是不是个字典
所以要先做两个判断,一个是
  1. [iscript]
  2. if (f.recipe==void) f.recipe=[];
  3. if (f.recipe[f.选择配方编号]==void) f.recipe[f.选择配方编号]=%[];
  4. [endscript]
复制代码

但这其实是治标不治本的办法,因为运行到这一步的时候初始化应该早就完成了。
会报这个错证明f.recipe本身从来没有进行过初始化,所以到底这个变数是怎么创建的?
比如道具系统创建物品数据库是通过读入TJS文件:f.item_data=Scripts.evalStorage("item_data.tjs");
而玩家拥有的道具是通过f.item=[];初始化,然后需要的时候通过f.item.add(f.item_data[index]);来初始化数组的每一行。

假设你的f.recipe是一个配方数据库,那就需要通过读入配方的TJS数据文件来初始化。
读入之后f.recipe[f.选择配方编号]早已存在为字典形式,只有f.recipe[f.选择配方编号].edu是需要操作的,这种情况下才不会报错。



点击之后让按钮保持高亮就是在描绘按钮的时候判断对应的按钮是否符合条件,符合条件的情况下创建按钮的那个.normal用的图设成和.over一样就行。

回复

使用道具 举报

16

主题

990

帖子

0

精华

管理员

Rank: 9Rank: 9Rank: 9

积分
1011
发表于 2015-12-8 17:06:03 | 显示全部楼层
总结一下思路:
(1)需要一个类似物品数据库item_data.tjs的配方数据库,EXCEL表里的生成格式应该是数组嵌套字典。
(2)在开始游戏的时候载入这个数据库,f.recipe=Scripts.evalStorage("recipe_data.tjs");
(3)进行配方界面描绘时,首先
A.循环判断f.recipe的每一行的.edu是否为1,如果是则加入到一个临时数组。
  1. [iscript]
  2. var arr=[];
  3. for (var i=0;i<f.recipe.count-1;i++)
  4. {
  5. var dic=f.recipe[i];
  6. if (dic.edu==true)
  7. {
  8. arr.add(dic);
  9. }
  10. }

  11. [endscript]
复制代码
B.根据这个临时数组描绘按钮界面,描绘按钮时,将对应的配方编号计入 f.选择配方编号
C.点击时读取f.recipe[f.选择配方编号]进行处理。
做了一个不是太完整的演示,可以看一下:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|nvlmaker

GMT+8, 2024-4-29 14:00 , Processed in 0.016129 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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