查看: 2921|回复: 12

[已经解决] 如何在事件菜单上分开调用普通物品和重要物品

[复制链接]
梦石
0
星屑
176
在线时间
19 小时
注册时间
2018-2-26
回帖
5
发表于 2018-2-27 19:31:38 | 显示全部楼层 |阅读模式

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

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

×
各位日安。

我本来计划用事件菜单,但日前碰到一个问题,
就像效果图显示的那样,希望的效果是可以【分别地、单独地】调用系统里的普通物品栏(:item)和重要物品栏(:key_item)
效果图.jpg
但是如果用SceneManager.call(Scene_Item)的话,调出的界面里,普通物品栏和重要物品栏是无法分离的。

后来发现喵呜喵5大大写的一个物品菜单简化的脚本
  1. =begin
  2. ===============================================================================
  3.   物品菜单简化 By喵呜喵5
  4. ===============================================================================

  5. 【说明】

  6.   按照RMVX的方式修改了默认的物品菜单,删除了分类框,默认显示持有的物品

  7.   针对懂得脚本的人,使用

  8.     M5SI20150321.call( 物品分类符号 )

  9.   来调出包含只拥有对应分类物品的界面

  10.   例如:M5SI20150321.call( :weapon ) 可以打开武器物品界面

  11. =end
  12. $m5script ||= {}; $m5script[:M5SI20150321] = 20150321
  13. module M5SI20150321
  14. #==============================================================================
  15. #  设定部分
  16. #==============================================================================

  17.   INCLUDE = true

  18.   # 物品菜单中是否包含重要物品
  19.   # 如果希望普通物品和重要物品不区分对待的话,这里设置成 true

  20.   ALL = false

  21.   # 物品菜单中是否包含所有物品(装备、护甲)
  22.   # 如果希望所有物品都显示在物品界面的话,这里设置成 true

  23.   MENU = false

  24.   # 如果希望在菜单中显示打开其他物品分类的指令的话,这里设置成 true

  25. #==============================================================================
  26. #  设定结束
  27. #==============================================================================
  28. class Scene_M5Item < Scene_Item; def m5_20150321_set; end; end
  29.   def self.call(category)
  30.     SceneManager.call(Scene_M5Item)
  31.     SceneManager.scene.m5_20150321_prepare(category)
  32.   end
  33. end
  34. class Window_ItemList
  35.   alias m5_20131108_include? include?
  36.   def include?(item)
  37.     if @category == :item
  38.       return true if ( item && M5SI20150321::ALL )
  39.       return true if ( item.is_a?(RPG::Item) && M5SI20150321::INCLUDE )
  40.     end
  41.     m5_20131108_include?(item)
  42.   end
  43. end
  44. class Scene_Item
  45.   def m5_20150321_prepare(category = :item)
  46.     @m5_20150321_category = category
  47.   end
  48.   def m5_20150321_set
  49.     m5_20150321_prepare
  50.   end
  51.   alias m5_20150321_start start
  52.   def start
  53.     m5_20150321_start
  54.     m5_20150321_set
  55.     @category_window.select_symbol(@m5_20150321_category)
  56.     @category_window.update
  57.     @category_window.deactivate
  58.     @item_window.set_handler(:cancel, method(:return_scene))
  59.     @item_window.activate
  60.     @item_window.select_last
  61.   end
  62.   alias m5_20150321_create_category_window create_category_window
  63.   def create_category_window
  64.     m5_20150321_create_category_window
  65.     @category_window.height = 0
  66.   end
  67. end
  68. class Window_MenuCommand
  69.   alias m5_20150321_add_main_commands add_main_commands
  70.   def add_main_commands
  71.     m5_20150321_add_main_commands
  72.     return unless M5SI20150321::MENU
  73.     category_window = Window_ItemCategory.new
  74.     list = category_window.instance_variable_get(:@list)
  75.     list.each do |command|
  76.       next if command[:symbol] == :item
  77.       name = "m5_20150321_#{command[:symbol]}".to_sym
  78.       add_command(command[:name], name ,main_commands_enabled)
  79.       @handler ||= {}
  80.       set_handler(name, Proc.new{ M5SI20150321.call(command[:symbol])})
  81.     end
  82.     category_window.dispose
  83.   end
  84. end
复制代码


里面有一个这样的功能:
  针对懂得脚本的人,使用
    M5SI20150321.call( 物品分类符号 )
  来调出包含只拥有对应分类物品的界面


但是在测试的时候,会出现这样的错误:
error.jpg
即使在一个全新的游戏工程里也会出现这个提示框。

所以想请教一下各位,这个问题要怎么解决?
因为实在摸索几天时间了,毫无头绪,也没能在游戏的脚本库里找到调用的方法,
也想请问,有没有相关的思路可以启发一下,我好有个方向去探索学习。

谢谢各位。
土下座。
梦石
0
星屑
3850
在线时间
925 小时
注册时间
2017-10-30
回帖
343
发表于 2018-2-27 19:41:09 | 显示全部楼层
本帖最后由 MireniamuYuki 于 2018-2-27 19:42 编辑

你没有加上他的基础脚本,(建议)插入到所有插件脚本之上就可以用啦
点击展开/收起[pre lang="ruby"]#==============================================================================
# ■ 基础脚本
#------------------------------------------------------------------------------
#   请将基础脚本放在我的所有脚本之上。
#
#   Tips: 什么是基础脚本?
#
#     这个基础脚本包含我自己的脚本中经常使用的一些【完全相同】的代码
#     虽然不能保证百分百兼容,但是基础脚本中所有的代码都能与大部分脚本和谐共处
#     相应的,如果基础脚本中的某些代码与其他脚本发生了冲突
#     只能证明,我脚本的【思路】和那个脚本【必定会发生冲突】
#     这种情况下,即使我将脚本改写成一个不需要基础脚本的版本,冲突仍然会发生
#
#==============================================================================

$m5script ||= {}; $m5script[:ScriptData] ||= {}
$m5script[:M5Base] = 20170304
#--------------------------------------------------------------------------
# ● 版本检查
#
#     M5script.version(ver) 检查脚本版本是否高于指定版本
#--------------------------------------------------------------------------
module M5script
  def self.version(ver,name="基础",key=:M5Base)
    version = $m5script[key.to_sym] || $m5script[key.to_s] ||
      fail("需要喵呜喵5#{name}脚本的支持")
    fail("喵呜喵5#{name}脚本版本过低") if (ver > version)
  end
end
#--------------------------------------------------------------------------
# ● 读取备注、匹配文本
#
#     M5script::M5note.match_text(text, note[, option, &block])
#     匹配文本的基本指令
#
#     text   : 文本内容(String)
#     note   : 需要匹配的文字(String)
#     option : 匹配文本的设置的哈希表
#       :default 缺省值(nil)
#       :value   待匹配文字是否包含内容(true)
#       :list    是否返回全部匹配结果的数组(nil)
#     &block : 成功匹配时执行的回调
#
#     M5script::M5note.map_note(map, note[, option, &block])
#     读取地图备注
#
#     M5script::M5note.event_note(map, id, note[, option, &block])
#     读取活动事件页的第一条指令,如果为注释则进行匹配
#
#--------------------------------------------------------------------------
module M5script; module M5note; class << self
  def match_text(text, note, *option, &block)
    config = option[0].is_a?(Hash) ?
      [option[0][:default], option[0][:value], option[0][:list]] : option
    default, value, list =  *config
    value = true if value.nil?
    return list ? [] : default if text.empty?
    all_result = []
    text.each_line do |line|
      line.chomp!
      if value
        result = /^\s*<\s*#{note}\s+(\S+)\s*>\s*$/ =~ line ? $1 : nil
        next unless result
        yield(result) if block_given?
        return result unless list
        all_result << result
      else
        return true if /^\s*<\s*#{note}\s*>\s*$/ =~ line
      end
    end
    return false unless value
    list ? all_result : default
  end
  def map_note(map, *args)
    text = load_data(sprintf("Data/Map%03d.rvdata2", map)).note
    match_text(text, *args)
  end
  def event_note(map, id, *args)
    begin
      if map == $game_map.map_id then page = $game_map.events[id]
      else
        ev = load_data(sprintf("Data/Map%03d.rvdata2", map)).events[id]
        (page = Game_Event.new(map,ev)).refresh
      end
      page.empty? ? raise : ev_list = page.list
    rescue then return match_text('', *args)
    end
    text = ''
    ev_list.each do |c|
      c.code == 108 || c.code == 408 || break
      text += c.parameters[0] + "\n"
    end
    match_text(text, *args)
  end
end; end; end
#--------------------------------------------------------------------------
# ● 读取物品备注
#--------------------------------------------------------------------------
class RPG::BaseItem
  def m5note *a,&b; M5script::M5note.match_text(@note,*a,&b); end
end
#--------------------------------------------------------------------------
# ● 与旧版基础脚本的兼容
#--------------------------------------------------------------------------
class << M5script
  def match_text *a,&b;      M5script::M5note.match_text *a,&b; end
  def read_map_note *a,&b;   M5script::M5note.map_note *a,&b;   end
  def read_event_note *a,&b; M5script::M5note.event_note *a,&b; end
end
#--------------------------------------------------------------------------
# ● 精灵 Sprite_M5_Base / Sprite_M5
#--------------------------------------------------------------------------
class Sprite_M5_Base < Sprite
  def dispose
    dispose_bitmap
    super
  end
  def dispose_bitmap; end
end
class Sprite_M5 < Sprite_M5_Base; end
#--------------------------------------------------------------------------
# ● 显示端口 Viewport_M5
#--------------------------------------------------------------------------
class Viewport_M5 < Viewport; end
#--------------------------------------------------------------------------
# ● 精灵组 Spriteset_M5
#--------------------------------------------------------------------------
class Spriteset_M5
  def update; end
  def dispose; end
end
#--------------------------------------------------------------------------
# ● 自动更新释放精灵以及显示端口
#--------------------------------------------------------------------------
class Scene_Base
  alias m5_20141113_update_basic update_basic
  def update_basic
    m5_20141113_update_basic
    instance_variables.each do |varname|
      ivar = instance_variable_get(varname)
      ivar.update if ivar.is_a?(Sprite_M5) && !ivar.disposed?
      ivar.update if ivar.is_a?(Spriteset_M5)
    end
  end
  alias m5_20141113_terminate terminate
  def terminate
    m5_20141113_terminate
    instance_variables.each do |varname|
      ivar = instance_variable_get(varname)
      ivar.dispose if ivar.is_a?(Sprite_M5_Base)
      ivar.dispose if ivar.is_a?(Spriteset_M5)
      ivar.dispose if ivar.is_a?(Viewport_M5)
    end
  end
end
#--------------------------------------------------------------------------
# ● 获取控制符的参数(这个方法会破坏原始数据)
#
#     m5_obtain_escape_param(text)
#--------------------------------------------------------------------------
class Window_Base
  def m5_obtain_escape_param(text)
    text.slice!(/^\[.*?\]/)[1..-2] rescue ""
  end
end
#--------------------------------------------------------------------------
# ● 字体大小调整
#
#     include M5script::M5_Window_FontSize
#
#     m5_font_width       默认文字宽度
#     m5_font_height      默认文字高度
#     m5_font_size_change 调整文字大小
#--------------------------------------------------------------------------
module M5script; module M5_Window_FontSize
  def m5_font_size_change(width = m5_font_width, height = m5_font_height)
    contents.font.size = 40
    contents.font.size -= 1 while text_size("口").width > width if width
    contents.font.size -= 1 while text_size("口").height > height if height
  end
  def m5_font_width;  return nil; end
  def m5_font_height; return nil; end
end;end
class Window_Base
  alias m5_20140728_reset_font_settings reset_font_settings
  def reset_font_settings
    m5_20140728_reset_font_settings
    m5_font_size_change if respond_to?(:m5_font_size_change)
  end
  alias m5_20140728_create_contents create_contents
  def create_contents
    m5_20140728_create_contents
    m5_font_size_change if respond_to?(:m5_font_size_change)
  end
end
#--------------------------------------------------------------------------
# ● M5script::Window_Cal
#
#     计算一段文字大小时使用的临时窗口
#
#     cal_all_text_height(text) 计算总高度
#     cal_all_text_width(text)  计算最大宽度
#     calc_line_width(text)     计算单行宽度
#     m5_contents               要描绘目标文字的contents
#     line_height               设置每行文字的高度
#--------------------------------------------------------------------------
module M5script; class Window_Cal < Window_Base
  attr_writer :line_height, :m5_contents
  def initialize
    super(0, 0, Graphics.width, Graphics.height)
    self.visible = false
    @text = ""
    @line_height = nil
    @m5_contents = nil
  end
  def line_height
    return @line_height if @line_height
    super
  end
  def initialize_contents
    if @m5_contents
      self.contents.dispose
      self.contents = @m5_contents.clone
    end
  end
  def cal_all_text_height(text)
    initialize_contents
    reset_font_settings
    @text = text.clone
    all_text_height = 1
    convert_escape_characters(@text).each_line do |line|
      all_text_height += calc_line_height(line, false)
    end
    @m5_contents = nil
    return all_text_height
  end
  def cal_all_text_width(text)
    initialize_contents
    reset_font_settings
    @text = text.clone
    all_text_width = 1
    convert_escape_characters(@text).each_line do |line|
      all_text_width = [all_text_width,calc_line_width(line,false)].max
    end
    @m5_contents = nil
    return all_text_width
  end
  def calc_line_width(target, need_refresh = true)
    initialize_contents if need_refresh
    reset_font_settings
    text = target.clone
    pos = {:x => 0, :y => 0, :new_x => 0, :height => Graphics.height}
    process_character(text.slice!(0, 1), text, pos) until text.empty?
    @m5_contents = nil if need_refresh
    return pos[:x]
  end
  def process_new_line(text, pos);end
  def draw_text(*args);end
end; end
#--------------------------------------------------------------------------
# ● 自动计算大小和位置并包含背景的信息显示窗口
#
#     M5script::Window_Var
#
#     cal    计算窗口大小使用的临时窗口,M5script::Window_Cal 的实例
#     config 窗口设置的哈希表,使用了以下键值:
#            :X :X2 :Y :Y2 :Z :BACK :SX :SY
#--------------------------------------------------------------------------
module M5script; class Window_Var < Window_Base
  def initialize(config, cal = nil)
    get_config(config)
    @dispose_flag = true unless cal
    @size_window = cal || M5script::Window_Cal.new
    super(0,0,0,0)
    self.arrows_visible = false
    self.z = @config[:Z]
    self.openness = 0
    create_back_sprite
  end
  def get_config(config)
    @config = config.clone
    @config[:SX] ||= 0
    @config[:SY] ||= 0
    @config[:Z] ||= 0
  end
  def create_back_sprite
    return unless @config[:BACK]
    self.opacity = 0
    bitmap = Cache.system(@config[:BACK]) rescue nil
    return unless bitmap
    @background_sprite = Sprite.new
    @background_sprite.x, @background_sprite.y = @config[:SX], @config[:SY]
    @background_sprite.z = self.z - 1
    @background_sprite.bitmap = bitmap
  end
  def update_placement
    if @config[:X] && @config[:X2]
      self.width = (@config[:X2] - @config[:X]).abs
    else
      @size_window.m5_contents = self.contents
      self.width  = @size_window.cal_all_text_width(@word)
      self.width += standard_padding * 2
    end
    if @config[:Y] && @config[:Y2]
      self.height = (@config[:Y2] - @config[:Y]).abs
    else
      @size_window.m5_contents = self.contents
      self.height = @size_window.cal_all_text_height(@word)
      self.height += standard_padding * 2
    end
    create_contents
  end
  def update_position
    if    @config[:X]  then self.x = @config[:X]
    elsif @config[:X2] then self.x = @config[:X2] - self.width
    else                    self.x = 0
    end
    if    @config[:Y]  then self.y = @config[:Y]
    elsif @config[:Y2] then self.y = @config[:Y2] - self.height
    else                    self.y = 0
    end
  end
  def dispose
    super
    @size_window.dispose if @dispose_flag
    @background_sprite.dispose if @background_sprite
  end
end; end
#--------------------------------------------------------------------------
# ● 生成TXT
#
#     M5script.creat_text(name,word,type)
#--------------------------------------------------------------------------
module M5script
  def self.creat_text(name,word,type = 'w')
    content = File.open("#{name}",type)
    content.puts word
    content.close
  end
end
#--------------------------------------------------------------------------
# ● 打开地址
#
#     M5script.open_url(addr)
#--------------------------------------------------------------------------
module M5script
  def self.open_url(addr)
    api = Win32API.new('shell32.dll','ShellExecuteA','pppppi','i')
    api.call(0,'open',addr,0, 0, 1)
  end
end
#--------------------------------------------------------------------------
# ● 读取、写入Game.ini
#
#     M5script::M5ini.get(key, default_value[, section])
#     M5script::M5ini.write(key, value[, section])
#--------------------------------------------------------------------------
module M5script; module M5ini; class << self
  def filename; './Game.ini'; end
  def default_section; 'M5script'; end
  def get(key, default_value, section = default_section)
    buffer = [].pack('x256')
    api = Win32API.new('kernel32','GetPrivateProfileString','ppppip', 'i')
    l = api.call(section, key, default_value, buffer, buffer.size, filename)
    return buffer[0, l]
  end
  def write(key, value, section = default_section)
    api = Win32API.new('kernel32','WritePrivateProfileString','pppp', 'i')
    api.call(section, key, value.to_s, filename)
  end
end; end; end[/pre]

评分

参与人数 1赞 +1 收起 理由
樱笋年光 + 1 塞糖

查看全部评分

回复

使用道具 举报

梦石
0
星屑
176
在线时间
19 小时
注册时间
2018-2-26
回帖
5
 楼主| 发表于 2018-2-27 20:03:50 | 显示全部楼层
MireniamuYuki 发表于 2018-2-27 19:41
你没有加上他的基础脚本,(建议)插入到所有插件脚本之上就可以用啦
[fold]#============================ ...

你好。

我用全新的游戏工程尝试了一下,发现原来的错误还是会出现
error.jpg

我去他的空间找了一下最新版本的基础脚本,
却出现了新的问题:
error2.jpg

这些错误都是在按下测试的时候出现的,根本进不去标题的那种。

谢谢。

点评

可以发工程看看吗?你是不是还改了原脚本的部分……我这边2个都插是没问题的  发表于 2018-2-27 20:04
回复

使用道具 举报

梦石
0
星屑
3850
在线时间
925 小时
注册时间
2017-10-30
回帖
343
发表于 2018-2-27 20:13:51 | 显示全部楼层
这是我测试的工程,在不加其他插件脚本和不改变原脚本的情况下

Project8.rar

1.33 MB, 下载次数: 48

评分

参与人数 1赞 +1 收起 理由
樱笋年光 + 1 认可答案

查看全部评分

回复 1 0

使用道具 举报

梦石
0
星屑
176
在线时间
19 小时
注册时间
2018-2-26
回帖
5
 楼主| 发表于 2018-2-27 20:24:15 | 显示全部楼层
为了避免其他改动带来的干扰,我都是用全新的工程来测试这两个脚本的,所以应该不是因为原脚本的问题。

怕是我之前瞎摸索把VA给弄坏了,所以刚刚卸载了重装,还是出现了同样的错误提示,所以应该也不是VA版本的问题(……?)

我也摸不着头脑,不好意思麻烦你了。

Project1.zip (1.43 MB, 下载次数: 60)
回复

使用道具 举报

梦石
0
星屑
176
在线时间
19 小时
注册时间
2018-2-26
回帖
5
 楼主| 发表于 2018-2-27 20:29:45 | 显示全部楼层
MireniamuYuki 发表于 2018-2-27 20:13
这是我测试的工程,在不加其他插件脚本和不改变原脚本的情况下

不好意思啊,发上面那条前没刷新出这个回复。

QAQ我我我我也不知道为什么,同样的插入顺序,我的愣是不能用,但你这个工程能用。

不过总算解决了,非常谢谢!!!

点评

刚刚测试了一下文本好像也没问题就是用不了,惊了……另外这个不会是VA的版本问题的  发表于 2018-2-27 20:34
回复

使用道具 举报

梦石
1
星屑
23241
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2018-2-27 21:09:15 | 显示全部楼层
这个物品菜单脚本并不需要插入我的基础脚本也能使用
报错的原因单看报错提示感觉像是复制脚本的时候复制了一些看不出来的问题字符,
有空我测测看你的范例

点评

呸呸呸说错了不是未定义……自己眼神不好看错了(戳  发表于 2018-2-27 21:29
这样啊……我看到未定义第一反应以为是没插基础脚本  发表于 2018-2-27 21:27

评分

参与人数 1赞 +1 收起 理由
樱笋年光 + 1 惊现原作者,感谢后续帮助Σ( ° △ °|||).

查看全部评分

回复

使用道具 举报

梦石
1
星屑
23241
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2018-2-28 09:52:18 | 显示全部楼层
测试了一下,确实是复制脚本的时候复制了一些看不出来的空白问题字符导致的问题
你可以尝试从下面几个地址重新复制一遍脚本看看问题是否存在
https://rpg.blue/home.php?mod=sp ... o=blog&id=12247
http://miaowm5.coding.me/script- ... cmI=&rm6r=12247

评分

参与人数 1赞 +1 收起 理由
樱笋年光 + 1 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
176
在线时间
19 小时
注册时间
2018-2-26
回帖
5
 楼主| 发表于 2018-2-28 10:17:32 | 显示全部楼层
喵呜喵5 发表于 2018-2-28 09:52
测试了一下,确实是复制脚本的时候复制了一些看不出来的空白问题字符导致的问题
你可以尝试从下面几个地址 ...

嗯嗯我试了一下,第一个网址的还是会跳出错误提示,第二个网址的不会。
可能是网页的问题?

不过问题已经解决了,谢谢两位。
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部