Project1

标题: 请教一个继承了Window_Selectable父类的窗口左右键无效的原因 [打印本页]

作者: taeckle    时间: 2021-8-7 09:22
标题: 请教一个继承了Window_Selectable父类的窗口左右键无效的原因
本帖最后由 taeckle 于 2021-8-7 09:32 编辑

看了诸位大神的脚本后,咱决定自己写一个存储箱脚本,刚写了没几行就发现了一个问题:

我已经让我想写的存储箱的class继承了Window_Selectable, 可为啥在测试的时候发现左右键不起作用呢?附上目前为止完工的代码:




class Scene_Storage < Window_Selectable
  def initialize(menu_index = 0)
    @menu_index = menu_index
  end  
  
  def main
   
   # 生成动作窗口
   @commands = Window_Command.new(450, ["存入物品", "取出物品", "离开"], 2)  
   @commands.index = @menu_index
   
    @commands.visible = true
    @commands.active = true
   
    @commands.x = 160
    @commands.y = 10
    @commands.opacity = 0
    @commands.back_opacity = 0   
   
   @menu_com = Sprite.new
   @menu_com.bitmap = RPG::Cache.picture("存储箱.png")

   Graphics.transition
   # 主循环
   loop do
     # 刷新游戏画面
     Graphics.update
     # 刷新输入信息
     Input.update
     # 刷新画面
     update
     # 如果画面切换的话就中断循环
     if $scene != self
       break
     end
   end     
   
    # 准备过渡
    Graphics.freeze
    @commands.dispose   
    @menu_com.bitmap.dispose
    @menu_com.dispose
   
  end

  def update
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 切换的地图画面
      $scene = Scene_Map.new
      return
    end  

  end
  
end


作者: taeckle    时间: 2021-8-7 09:29
想让左右键起作用也不是没办法,只要在def main 里设置下 if Input.repeat?(Input::RIGHT) 还有if Input.repeat?(Input::LEFT) 就行了,只是咱就想知道,既然是继承了Window_Selectable,为啥左右键还不起作用呢? , 下面是又让左右键起作用的代码:


    # 方向键右被按下的情况下
    if Input.repeat?(Input::RIGHT)      
      if @commands.index < 2
            # 光标向右移动
            $game_system.se_play($data_system.cursor_se)
            @commands.index += 1
      else
            # 光标移向开始
            $game_system.se_play($data_system.cursor_se)
            @commands.index = 0
      end
    end   
    # 方向键左被按下的情况下      
    if Input.repeat?(Input::LEFT)
      if @commands.index > 0
            # 光标向左移动
            $game_system.se_play($data_system.cursor_se)
            @commands.index -= 1
      else
            # 光标移向末尾
            $game_system.se_play($data_system.cursor_se)
            @commands.index = 2
      end
    end

作者: guoxiaomi    时间: 2021-8-7 09:54
你应该定义一个窗口类继承Windows_Selectable,你这里使用了Scene_Storage继承是错误的
作者: taeckle    时间: 2021-8-7 17:05
本帖最后由 taeckle 于 2021-8-7 17:08 编辑
guoxiaomi 发表于 2021-8-7 09:54
你应该定义一个窗口类继承Windows_Selectable,你这里使用了Scene_Storage继承是错误的 ...


大神可以举个例子啥是窗口类呢? 比如在你的那个存储箱脚本教程中哪个类算是窗口类呢?(https://rpg.blue/thread-486514-1-1.html) 还有新定义的类名字中含有"Window"才算窗口类吗?
作者: enghao_lim    时间: 2021-8-7 18:51
taeckle 发表于 2021-8-7 17:05
大神可以举个例子啥是窗口类呢? 比如在你的那个存储箱脚本教程中哪个类算是窗口类呢?(https://rpg.blue ...


窗口本身是Window,只是代码没有在脚本里头,是RGSS内嵌,所以在脚本可以找到最基本的窗口时继承了Window的Window_Base,也就是说Window_Base是认知中窗口的父类,Window_Selectable也是继承了Window_Base。

Window_Command < Window_Selectable < Window_Base < Window

窗口脚本通常只会负责该窗口的事项刷新处理,而你的脚本书写看就是场景类而非窗口类,场景类在XP不需要继承。

而从你的脚本判断我并没有发现你创建了一个继承Window_Selectable而是使用了已经继承Window_Selectable的Window Command。

Window_Command由于没有纵行是无法对应左右按键的操作的。

而你自己添加的则是让场景类对应左右按键而非窗口类。
作者: taeckle    时间: 2021-8-8 16:05
本帖最后由 taeckle 于 2021-8-8 16:52 编辑
enghao_lim 发表于 2021-8-7 18:51
窗口本身是Window,只是代码没有在脚本里头,是RGSS内嵌,所以在脚本可以找到最基本的窗口时继承了Window ...


好的,多谢大神指点,

我在脚本一开始不就写了Scene_Storage < Window_Selectable嘛,这样难道不算继承Window_Selectable吗?


还有请问下在Window_Command类中怎么设置对应左右键的操作的呢?
作者: taeckle    时间: 2021-8-9 04:30
本帖最后由 taeckle 于 2021-8-9 04:43 编辑
enghao_lim 发表于 2021-8-7 18:51
窗口本身是Window,只是代码没有在脚本里头,是RGSS内嵌,所以在脚本可以找到最基本的窗口时继承了Window ...


问题解决了, 根本就不是Window_Command和Window_Selectable的问题, 只要在Window_Command类中把那个def draw_item还有def initialize 改成这样:


  def initialize(width, commands,type = 0)
    @type = type
    # 由命令的个数计算出窗口的高
    case type
    when 0                                                    #默认的纵版界面设置
     super(0, 0, width, commands.size * 32 + 32)
     @column_max = 1
    when 1
     super(0, 0, width, 400)
     @column_max = [commands.size,8].min   #横版的主菜单栏界面设置
    when 2
     super(0, 0, width*1, 400)
     @column_max = [commands.size,8].min   #横版的存储箱界面设置
    end
    @item_max = commands.size
    @commands = commands
   
    case type
    when 0
     self.contents = Bitmap.new(width - 32, @item_max * 32)
    when 1
     self.contents = Bitmap.new(width - 32, @item_max * 32)
    when 2
     self.contents = Bitmap.new(width - 32, @item_max * 32)
    end   
   
    refresh
    self.index = 0
  end



  def draw_item(index, color, size= 22)
    self.contents.font.color = color
    self.contents.font.size = size
    if $scene.is_a?(Scene_Menu)   
     rect = Rect.new(76 * index + 5,  0, 80, 28) #横版的主菜单栏界面
    elsif $scene.is_a?(Scene_Storage)
     rect = Rect.new(160 * index + 22,  0, 80, 28) #横版的存储箱界面
    else
     rect = Rect.new(4, 32 * index, self.contents.width - 8, 32) #默认的纵版界面
    end
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    self.contents.draw_text(rect, @commands[index])
  end


然后在我一楼class Scene_Storage脚本里的def update下面紧接着添加一句"@commands.update"后左右键就起作用了:

  def update
   
@commands.update
   
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 切换的地图画面
      $scene = Scene_Map.new
      return
    end     
  end








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