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

Project1

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

[已经解决] 请教一个继承了Window_Selectable父类的窗口左右键无效的原因

[复制链接]

Lv4.逐梦者

梦石
0
星屑
9128
在线时间
463 小时
注册时间
2015-5-8
帖子
865
跳转到指定楼层
1
发表于 2021-8-7 09:22:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 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

Lv4.逐梦者

梦石
0
星屑
9128
在线时间
463 小时
注册时间
2015-5-8
帖子
865
2
 楼主| 发表于 2021-8-7 09:29:12 | 只看该作者
想让左右键起作用也不是没办法,只要在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
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23963
在线时间
3338 小时
注册时间
2011-7-8
帖子
3925

开拓者

3
发表于 2021-8-7 09:54:42 | 只看该作者
你应该定义一个窗口类继承Windows_Selectable,你这里使用了Scene_Storage继承是错误的

评分

参与人数 2星屑 +50 +1 收起 理由
RyanBern + 50 认可答案
taeckle + 1 我现在总算明白了!

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9128
在线时间
463 小时
注册时间
2015-5-8
帖子
865
4
 楼主| 发表于 2021-8-7 17:05:00 | 只看该作者
本帖最后由 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"才算窗口类吗?

点评

是的,按照我的帖子做就是对的  发表于 2021-8-8 18:58
大神我又看了遍你的存储箱脚本帖子,难道要像你脚本里面的第114行做个Window_Menu才算是建立个窗口类?  发表于 2021-8-8 16:58
看帖子里的第4节  发表于 2021-8-7 18:49
最初的是Window类,继承自任意窗口类的类型都是窗口类。名字无关,只是大家都喜欢用Window开头  发表于 2021-8-7 18:49
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7946
在线时间
1182 小时
注册时间
2007-7-29
帖子
2055
5
发表于 2021-8-7 18:51:18 | 只看该作者
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由于没有纵行是无法对应左右按键的操作的。

而你自己添加的则是让场景类对应左右按键而非窗口类。

评分

参与人数 1星屑 +50 收起 理由
RyanBern + 50 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9128
在线时间
463 小时
注册时间
2015-5-8
帖子
865
6
 楼主| 发表于 2021-8-8 16:05:29 | 只看该作者
本帖最后由 taeckle 于 2021-8-8 16:52 编辑
enghao_lim 发表于 2021-8-7 18:51
窗口本身是Window,只是代码没有在脚本里头,是RGSS内嵌,所以在脚本可以找到最基本的窗口时继承了Window ...


好的,多谢大神指点,

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


还有请问下在Window_Command类中怎么设置对应左右键的操作的呢?

点评

问题解决了,根本就不是Window_Command和Window_Selectable的问题, 只要在我脚本里的def update下面紧接着增加一句"@commands.update" 就行了!  发表于 2021-8-9 04:26
问题就在这里,Window_Command不也继承了Window_Seletable,然而我用Window_Command创建了一个那个@commands窗口后左右键却不起作用了  发表于 2021-8-9 01:54
因为window_selectable本来就支持所有的方向键和翻页键  发表于 2021-8-9 00:57
@menu_window = Window_Selectable.new(0, 64, 640, 64  发表于 2021-8-9 00:47
难道是我的继承方式不对?要 ": : <"才是继承, "<"不算继承?  发表于 2021-8-9 00:35
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9128
在线时间
463 小时
注册时间
2015-5-8
帖子
865
7
 楼主| 发表于 2021-8-9 04:30:07 | 只看该作者
本帖最后由 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



回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-20 16:39

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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