Project1

标题: 选择奖励窗口的制作问题 [打印本页]

作者: acv255    时间: 2015-8-18 12:29
标题: 选择奖励窗口的制作问题
还是昨天的问题。是想做到“能在选择时看到奖励物品的属性”并且“选择后获得物品”;
昨天纠结了一天今天发现好像跟shop的window有点类似就拿shopbuy来改,结果改得是一头雾水
我的Scene部分是这么写的
RUBY 代码复制
  1. class Scene_Chooseaward < Scene_MenuBase
  2.  
  3.   def start
  4.     creat_choose_window
  5.     super
  6.   end
  7.  
  8.   def creat_choose_window
  9.     @choose_window=Window_Chooseaward.new(0,0,200,100)
  10.     @choose_window.set_handler(:ok,method(:gain_ok))
  11.     @choose_window.set_handler(:cancel,method(:return_scene))
  12.   end
  13.  
  14.   def gain_ok
  15.     $game_party.gain_item(item,1)
  16.     return_scene
  17.   end
  18.  
  19. end


然后Window_Chooseaward就是选择性抄改Window_ShopBuy
RUBY 代码复制
  1. class Window_Chooseaward < Window_Selectable
  2.  
  3.   def initialize(x, y, width, height)
  4.     super
  5.     refresh
  6.   end
  7.  
  8.   def refresh
  9.     make_item_list
  10.     create_contents
  11.     draw_all_items
  12.   end
  13.  
  14.   def item_max
  15.     @data ? @data.size : 1
  16.   end
  17.  
  18.   def item
  19.     @data[index]
  20.   end  
  21.  
  22.   def make_item_list
  23.     @data = []
  24.     item = $data_weapons[1] #其实我希望这里的道具种类和ID能通过参数指定,但不知道怎么写
  25.     @data.push(item)
  26.   end
  27.  
  28.   def draw_item(index)
  29.     item = @data[index]
  30.     rect = item_rect(index)
  31.     draw_item_name(item, rect.x, rect.y)
  32.     rect.width -= 4
  33.   end
  34. end


进去终于显示出物品了,但是背景是全黑的,而且无论是选择物品还是Esc窗口都没有反应,return_scene完全不起作用...

这中间还发生了许多我无法理解的乱七八糟的bug,说来全是泪,已经快崩溃了。

所以谁能解释一下这是为什么,再告诉我到底要怎样做这个窗口?
作者: 喵呜喵5    时间: 2015-8-18 12:42
@choose_window.activate
作者: acv255    时间: 2015-8-18 13:08
喵呜喵5 发表于 2015-8-18 12:42
@choose_window.activate

感谢,终于可以正常进入退出了
但现在问题又来了,在scene部分里加了create_help_window,光标移到物品上还是没办法看到信息栏,是怎么回事?我对创建窗口的正常流程没有一个系统的认识,看的几篇教程贴好像都没说系统思路,所以我总是不知道缺了哪一步......
另外,怎么做到把在事件脚本里写的物品种类和ID参数传递到窗口中?
作者: 喵呜喵5    时间: 2015-8-18 22:23
acv255 发表于 2015-8-18 13:08
感谢,终于可以正常进入退出了
但现在问题又来了,在scene部分里加了create_help_window,光标移到物品上 ...

你自己都说了你是选择性抄改 Window_ShopBuy ,你把人家更新帮助窗口内容的代码选择性无视掉了自然啥都看不到了

事件脚本里写的物品种类和ID参数传递到窗口中,比较简单的方法,直接事件脚本赋值给一个变量 $game_variables[123] ,然后再窗口中读取 $game_variables[123] 即可
作者: acv255    时间: 2015-8-18 23:30
喵呜喵5 发表于 2015-8-18 22:23
你自己都说了你是选择性抄改 Window_ShopBuy ,你把人家更新帮助窗口内容的代码选择性无视掉了自然啥都看 ...

传递那个我弄好了,
但是我把window的更新帮助的部分也复制进去了,还是找不着啊...愁
  1. class Scene_Chooseaward < Scene_MenuBase
  2.   
  3.   def start
  4.     super
  5.     create_choose_window
  6.     create_help_window
  7.   end
  8.   
  9.   def create_choose_window
  10.     @choose_window=Window_Chooseaward.new(0,0,200,100)
  11.     @choose_window.activate
  12.     @choose_window.viewport = @viewport
  13.     @choose_window.set_handler(:ok,method(:gain_ok))
  14.     @choose_window.set_handler(:cancel,method(:return_scene))
  15.     @choose_window.help_window = @help_window
  16.   end
  17.   
  18.   def gain_ok
  19.     @item = @choose_window.item
  20.     $game_party.gain_item(@item,1)
  21.     return_scene
  22.   end
  23.   
  24. end

  25. class Window_Chooseaward < Window_Selectable
  26.   attr_reader   :status_window
  27.   def initialize(x, y, width, height)
  28.     super
  29.     refresh
  30.   end
  31.   
  32.   def refresh
  33.     make_item_list
  34.     create_contents
  35.     draw_all_items
  36.   end

  37.   def item_max
  38.     @data ? @data.size : 1
  39.   end

  40.   def item
  41.     @data[index]
  42.   end  
  43.   
  44.   def make_item_list
  45.     @data = []
  46.     $wupincanshu.each do |goods|
  47.       case goods[0]
  48.       when 0;  item = $data_items[goods[1]]
  49.       when 1;  item = $data_weapons[goods[1]]
  50.       when 2;  item = $data_armors[goods[1]]
  51.       end
  52.       if item
  53.         @data.push(item)
  54.       end
  55.     end
  56.   end
  57.    
  58.   def draw_item(index)
  59.     item = @data[index]
  60.     rect = item_rect(index)
  61.     draw_item_name(item, rect.x, rect.y)
  62.     rect.width -= 4
  63.   end
  64.   
  65.   #--------------------------------------------------------------------------
  66.   # ● 设置状态窗口    #连这个应该没什么关系的设置我都一起复制进来了
  67.   #--------------------------------------------------------------------------
  68.   def status_window=(status_window)
  69.     @status_window = status_window
  70.     call_update_help
  71.   end
  72.   #--------------------------------------------------------------------------
  73.   # ● 更新帮助内容
  74.   #--------------------------------------------------------------------------
  75.   def update_help
  76.     @help_window.set_item(item) if @help_window
  77.     @status_window.item = item if @status_window
  78.   end
  79. end
复制代码

作者: 喵呜喵5    时间: 2015-8-18 23:45
acv255 发表于 2015-8-18 23:30
传递那个我弄好了,
但是我把window的更新帮助的部分也复制进去了,还是找不着啊...愁 ...

既然你说你是模仿 Scene_Shop 的,那我直接拿 Scene_Shop 的代码举例吧:
def create_buy_window 方法下有这么一句:
  1. @buy_window.help_window = @help_window
复制代码
请自己再研究一下默认脚本,看看这一句代码的意义

作者: acv255    时间: 2015-8-18 23:51
喵呜喵5 发表于 2015-8-18 23:45
既然你说你是模仿 Scene_Shop 的,那我直接拿 Scene_Shop 的代码举例吧:
def create_buy_window 方法下 ...

虽然不是很明白这句的具体意思但我也是注意到并且模仿着加了的,在我贴的第15行...
感觉用法应该跟它一样了吧,还是没用啊
作者: acv255    时间: 2015-8-19 00:20
喵呜喵5 发表于 2015-8-18 23:45
既然你说你是模仿 Scene_Shop 的,那我直接拿 Scene_Shop 的代码举例吧:
def create_buy_window 方法下 ...


看了半天只能通过
  1.   def help_window=(help_window)
  2.     @help_window = help_window
  3.     call_update_help
  4.   end
复制代码
勉强把xx_window.help_window = @help_window理解成“把与xx_window平行的帮助窗口实例赋值给xx_window自己的‘子’帮助栏”,大概就是把xx_window的帮助信息显示在这个平行等级的帮助栏中?

实在太绕了,真没法理解下去了......就我目前的理解好像还是无法对让窗口现形产生帮助......
作者: 喵呜喵5    时间: 2015-8-19 00:24
acv255 发表于 2015-8-19 00:20
看了半天只能通过勉强把xx_window.help_window = @help_window理解成“把与xx_window平行的帮助窗口实例 ...

现在,你再回头看看你赋值给xx_window的@help_window是一个帮助窗口的实例吗?

如果不能确定的话,用 p @help_window 来协助你进行判断
作者: acv255    时间: 2015-8-19 00:45
喵呜喵5 发表于 2015-8-19 00:24
现在,你再回头看看你赋值给xx_window的@help_window是一个帮助窗口的实例吗?

如果不能确定的话,用 p  ...

我把p "#{@help_window}"和p "#{@help_window}+hehe"分别放在scene_equip和我自己的scene下的生成窗口方法末尾

第一行是调用失败时显示的
第二行是在装备界面下成功调用时显示的

怎么感觉没什么区别....

QQ截图20150819004005.jpg (134.21 KB, 下载次数: 36)

QQ截图20150819004005.jpg

作者: 喵呜喵5    时间: 2015-8-19 00:51
acv255 发表于 2015-8-19 00:45
我把p "#{@help_window}"和p "#{@help_window}+hehe"分别放在scene_equip和我自己的scene下的生成窗口方 ...
  1. a=1
  2. b=a
  3. a=2
  4. p a
复制代码
  1. a=2
  2. b=a
  3. p a
复制代码
请看这两段代码,然后思考两段代码b的值为什么不同,然后再回头思考你自己的这个回复

作者: acv255    时间: 2015-8-19 01:14
本帖最后由 acv255 于 2015-8-19 01:16 编辑

编辑   
作者: acv255    时间: 2015-8-19 01:16
标题: RE: 选择奖励窗口的制作问题
喵呜喵5 发表于 2015-8-19 00:51
请看这两段代码,然后思考两段代码b的值为什么不同,然后再回头思考你自己的这个回复
...

我看来看去怎么都觉得两边执行流程没有区别啊...
求你讲明白点吧...想这问题想到这么晚又困又睡不着...脑子不清醒更想不明白更睡不着 太难受了

QQ截图20150819011148.jpg (81.33 KB, 下载次数: 26)

QQ截图20150819011148.jpg

作者: 喵呜喵5    时间: 2015-8-19 07:36
acv255 发表于 2015-8-19 01:16
我看来看去怎么都觉得两边执行流程没有区别啊...
求你讲明白点吧...想这问题想到这么晚又困又睡不着...脑 ...

先执行
create_help_window
再执行
create_choose_window

不想和你说原因了,给你解释原因的代码你觉得太简单所以根本没去分析


作者: acv255    时间: 2015-8-19 10:16
喵呜喵5 发表于 2015-8-19 07:36
先执行
create_help_window
再执行

create顺序我昨晚睡前发现了,然而调换之后还是不行。
你的例子意思就是一个是通过a给b一个值,再单独给a一个值;另一个是只通过a给了b一个值
我看来看去只能看出来前两行大概是在指代
@help_window=Window_Help.new和
xx_window.help_window=@help_window
但第三行的给a重新赋值我是没找到类似的环节,
我真的不是没有认真想,只是你的启发式教育实在超过我的理解范围,我还是希望能够得到一个明确的解决方案让我自己去研究问题出在哪......
作者: acv255    时间: 2015-8-19 11:31
喵呜喵5 发表于 2015-8-19 07:36
先执行
create_help_window
再执行

已解决,是我粗心没去翻帮助信息脚本。那里面有段重定义update_help的语句没复制过去。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1