设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3849|回复: 9
打印 上一主题 下一主题

[有事请教] 关于菜单中的层级选择关系的请教

[复制链接]

Lv2.观梦者

梦石
0
星屑
269
在线时间
24 小时
注册时间
2017-11-1
帖子
15
跳转到指定楼层
1
发表于 2018-3-10 17:20:19 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

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

x

目的:实现从      菜单——>物品——>物品界面的选择      (系统是    菜单——>物品——>选择目录——>物品界面的选择)

问题:改脚本的过程中我想通过去掉
JAVASCRIPT 代码复制
  1. createCategoryWindow
这个环节,但是发现如果取消这一部分会遇到在物品界面“卡机”的情况,如图:

(图中左窗口是物品栏,右窗口是解释窗口,这么做是为了省去选择目录这一环节)
然后就发现在这个界面执行不了任何操作,我暂且认为是我缺失了一些功能的绑选。

我想请教一下这么一个机理问题:当我们打开菜单的时候,系统是怎么默认光标选择第一项的,那么又是通过什么在打开物品时光标落在选择目录栏上,是否可以更改成直接落在物品栏的物品上?





以上就是我的问题,希望各位前辈能不吝赐教,万分感谢。

Lv2.观梦者

梦石
0
星屑
269
在线时间
24 小时
注册时间
2017-11-1
帖子
15
10
 楼主| 发表于 2018-3-11 19:24:19 | 只看该作者
ekmomo 发表于 2018-3-10 23:41
第一个问题,本质上讲没区别,都是把一个对象存在一个地方以备调用。但仔细观察不难发现addWindow是Scene_i ...

十分感谢,以后可能也多有叨饶,希望您也能给予我些指点。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3414
在线时间
461 小时
注册时间
2013-12-7
帖子
333
9
发表于 2018-3-10 23:41:16 | 只看该作者
本帖最后由 ekmomo 于 2018-3-10 23:42 编辑

第一个问题,本质上讲没区别,都是把一个对象存在一个地方以备调用。但仔细观察不难发现addWindow是Scene_item调用的(粗略的讲,实际上是此原型构造的对象调用的),它用以把窗口添加到场景中去。而setHelpWindow方法是让道具列表窗口“认识”帮助窗口,这样道具列表自己就能和帮助窗口交流而不需要通过场景。
第二个问题,this._xxxx是this的一个属性(类似于一个变量),这里这个方法就是把"Item"存进道具列表窗口的一个属性(Window_ItemList._categrory)里,以便道具列表筛选道具。千万注意this在不同地方指代不同对象。
第三个问题比较复杂,delete 操作符用以删除对象的一个属性或方法,当原型不存在一个方法而该方法又被调用的话,对象会去它的原型链上找。因为1.6版本加入了对分类窗口的刷新,这个是我们不需要的,所以把该方法删除。

另,我现在在火车上确实不方便,回答的不够细的地方可以等周二回来再开个帖子解释。
回复 支持 1 反对 0

使用道具 举报

Lv2.观梦者

梦石
0
星屑
269
在线时间
24 小时
注册时间
2017-11-1
帖子
15
8
 楼主| 发表于 2018-3-10 23:11:40 | 只看该作者

感谢。运行十分完美,私人仍有一些小问题:
①setHelpWindow和addWindow的作用有什么区别,可以不要其中一个吗?
②this._itemWindow.setCategory("item")这个函数的功能怎么解释?
③delete Scene_Item.prototype.update;这句话有何作用?
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3414
在线时间
461 小时
注册时间
2013-12-7
帖子
333
7
发表于 2018-3-10 21:19:26 | 只看该作者
仅供参考

  1.         Scene_Item.prototype.create = function() {
  2.                 Scene_ItemBase.prototype.create.call(this);
  3.                 this.createHelpWindow();
  4.                 this.createItemWindow();
  5.                 this.createActorWindow();
  6.         };
  7.         Scene_Item.prototype.createItemWindow = function() {
  8.                 var h = this._helpWindow.height;
  9.                 this._itemWindow = new Window_ItemList(0, h,  Graphics.boxWidth, Graphics.boxHeight - h);
  10.                 this._itemWindow.setHelpWindow(this._helpWindow);
  11.                 this._itemWindow.setHandler('ok',     this.onItemOk.bind(this));
  12.                 this._itemWindow.setHandler('cancel', this.popScene.bind(this));
  13.                 this.addWindow(this._itemWindow);
  14.                 this._itemWindow.setCategory('item');
  15.                 this._itemWindow.selectLast();
  16.                 this._itemWindow.activate();
  17.         };
  18.         delete Scene_Item.prototype.update;
复制代码
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
269
在线时间
24 小时
注册时间
2017-11-1
帖子
15
6
 楼主| 发表于 2018-3-10 19:42:30 | 只看该作者
ekmomo 发表于 2018-3-10 18:32
Window_ItemList的makeItemList用以创建命令列表,而makeItemList依赖的includes方法(用于筛选不同分类的 ...

刚刚进行了尝试,发现在创建itemWindow里加入了
  1.     this._itemWindow.selectLast();
  2.     this._itemWindow.activate();
复制代码

之后可以无障碍运行了,但是又伴随着一个新问题,现在捡取物品后打开物品栏不显示物品......

不知道又是什么原因,求教前辈。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
269
在线时间
24 小时
注册时间
2017-11-1
帖子
15
5
 楼主| 发表于 2018-3-10 19:19:12 | 只看该作者
ekmomo 发表于 2018-3-10 18:32
Window_ItemList的makeItemList用以创建命令列表,而makeItemList依赖的includes方法(用于筛选不同分类的 ...

感谢关于include的告知。

我尝试将您的这句this._itemWindow.setCategory("item")放在createItemWindow下,但不知道是由于我使用错误还是方法不行,导致我测试结果没有什么变化。如果您方便,能否帮我看看我这拙劣的代码是否有本质问题;烦扰您的话,也请谅解。无论如何,对您之前能回复我一再感谢。

  1. Scene_Item.prototype.create = function() {
  2.     Scene_ItemBase.prototype.create.call(this);
  3.     this.createHelpWindow();
  4.     //this.createCategoryWindow();
  5.     this.createItemWindow();
  6.     this.createActorWindow();
  7. };

  8. Scene_MenuBase.prototype.createHelpWindow = function() {
  9.     this._helpWindow = new Window_Help();
  10.     this.addWindow(this._helpWindow);
  11. };

  12. Window_Help.prototype.initialize = function(numLines) {
  13.     var width = Graphics.boxWidth/2 ;
  14.     var height = this.fittingHeight(numLines || 2);
  15.     Window_Base.prototype.initialize.call(this, Graphics.boxWidth/2, 0, width, Graphics.height);
  16.     this._text = '';
  17. };
  18. Scene_Item.prototype.onItemCancel = function() {
  19.     this._itemWindow.deselect();
  20.     //this._categoryWindow.activate();
  21. };
  22. Scene_Item.prototype.createItemWindow = function() {
  23.     this._categoryWindow = new Window_ItemCategory();
  24.     this._categoryWindow.setHelpWindow(this._helpWindow);
  25.     this._categoryWindow.y = this._helpWindow.height;
  26.     var wy = this._categoryWindow.y ;
  27.     var wh = Graphics.boxHeight ;//- wy;
  28.     this._itemWindow = new Window_ItemList(0, 0, Graphics.boxWidth/2, wh);
  29.     this._itemWindow.setCategory("item");
  30.     this._itemWindow.setHelpWindow(this._helpWindow);
  31.     this._itemWindow.setHandler('ok',     this.onItemOk.bind(this));
  32.     this._itemWindow.setHandler('cancel', this.popScene.bind(this));
  33.     this.addWindow(this._itemWindow);
  34.     //this._categoryWindow.setItemWindow(this._itemWindow);
  35.    
  36. };

  37. Window_ItemList.prototype.maxCols = function() {
  38.     return 1;
  39. };
复制代码
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3414
在线时间
461 小时
注册时间
2013-12-7
帖子
333
4
发表于 2018-3-10 18:32:47 | 只看该作者
Window_ItemList的makeItemList用以创建命令列表,而makeItemList依赖的includes方法(用于筛选不同分类的道具)依赖于Window_ItemList的_category属性。你在Scene创建_itemWindow的时候执行下this._itemWindow.setCategory("item")试试(不等同于this._itemWindow._category = "item")
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
269
在线时间
24 小时
注册时间
2017-11-1
帖子
15
3
 楼主| 发表于 2018-3-10 18:22:31 | 只看该作者
ekmomo 发表于 2018-3-10 17:50
要setCategory。或者自己makeItemList。
机理类似_helpWindow.在createItemWindow时this._categoryWindow.s ...

谢谢。

  1. Window_ItemList.prototype.setCategory = function(category) {
  2.     if (this._category !== category) {
  3.         this._category = category;
  4.         this.refresh();
  5.         this.resetScroll();
  6.     }
  7. };
复制代码

您所指的是否是这个?但是我对这个函数有什么作用理解不了,能否请您解释一下?

还有,既然要修改setCategory,是否也就是说仍要创建一个categoryWindow,这样我怎么解决去掉categoryWindow这个问题呢?

我现在是在对自己写功能慢慢摸索,对js理解尚且有些吃力,烦您谅解。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3414
在线时间
461 小时
注册时间
2013-12-7
帖子
333
2
发表于 2018-3-10 17:50:16 | 只看该作者
本帖最后由 ekmomo 于 2018-3-10 17:54 编辑

要setCategory。或者自己makeItemList。
机理类似_helpWindow.在createItemWindow时this._categoryWindow.setItemWindow(this._itemWindow);;
在_categoryWindow刷新时_categoryWindow._itemWindow.setCategory(this.currentSymbol());
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-16 06:20

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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