查看: 2181|回复: 5

[已经解决] 一个关于武器改名的问题。

[复制链接]
梦石
0
星屑
55
在线时间
111 小时
注册时间
2014-8-16
回帖
14
发表于 2014-8-24 14:54:21 | 显示全部楼层 |阅读模式

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

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

×
{:2_259:} 本人是一个刚接触XP的小菜鸟。
请问,如何在游戏中实现由玩家来自定义装备名,这个功能。
也就是玩家可以对装备进行重命名。

对我这个菜鸟来说似乎难度很高的样子……

点评

这么说我也是菜鸟?检查一下我是不是。。。。。。。。————♪好吧我是,,  发表于 2014-8-24 17:59

评分

参与人数 1星屑 +35 收起 理由
︶ㄣ牛排ぶ + 35 手动认可奖励

查看全部评分

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2014-8-24 19:56:44 | 显示全部楼层
本帖最后由 RyanBern 于 2014-8-24 20:34 编辑

使用方法:把脚本贴在main前,可能会和一些武器类的脚本冲突。其实是我仿照姓名输入界面编写的一个武器名称修改界面。
插入事件脚本:$scene = Scene_WeaponName.new(武器ID,最大输入位数)就可以调用此界面,例如需要修改1号武器铜剑的名字,最多10个字符,就写
  1. $scene = Scene_WeaponName.new(1,10)
复制代码
如果输入了实际不存在的武器ID,会报错。脚本如下:
防止出错@weapon
[pre lang="Ruby"]#==============================================================================
# ■ Window_WeaponNameEdit
#------------------------------------------------------------------------------
#  武器名称输入画面、编辑名称的窗口。
#==============================================================================

class Window_WeaponNameEdit < Window_Base
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_reader   :name                     # 名称
  attr_reader   :index                    # 光标位置
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     weapon   : 武器
  #     max_char : 最大字数
  #--------------------------------------------------------------------------
  def initialize(weapon, max_char)
    super(0, 0, 640, 128)
    self.contents = Bitmap.new(width - 32, height - 32)
    @weapon = weapon
    @name = weapon.name
    @max_char = max_char
    # 控制名字在最大字数以内
    name_array = @name.split(//)[0...@max_char]
    @name = ""
    for i in 0...name_array.size
      @name += name_array
    end
    @default_name = @name
    @index = name_array.size
    refresh
    update_cursor_rect
  end
  #--------------------------------------------------------------------------
  # ● 还原为默认的名称
  #--------------------------------------------------------------------------
  def restore_default
    @name = @default_name
    @index = @name.split(//).size
    refresh
    update_cursor_rect
  end
  #--------------------------------------------------------------------------
  # ● 添加文字
  #     character : 要添加的文字
  #--------------------------------------------------------------------------
  def add(character)
    if @index < @max_char and character != ""
      @name += character
      @index += 1
      refresh
      update_cursor_rect
    end
  end
  #--------------------------------------------------------------------------
  # ● 删除文字
  #--------------------------------------------------------------------------
  def back
    if @index > 0
      # 删除一个字
      name_array = @name.split(//)
      @name = ""
      for i in 0...name_array.size-1
        @name += name_array
      end
      @index -= 1
      refresh
      update_cursor_rect
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    # 描绘名称
    name_array = @name.split(//)
    for i in 0...@max_char
      c = name_array
      if c == nil
        c = "_"
      end
      x = 320 - @max_char * 14 + i * 28
      self.contents.draw_text(x, 32, 28, 32, c, 1)
    end
    # 描绘图形
    bitmap = RPG::Cache.icon(@weapon.icon_name)
    self.contents.blt(320 - @max_char * 14 - 40, 32, bitmap, Rect.new(0,0,24,24))
  end
  #--------------------------------------------------------------------------
  # ● 刷新光标矩形
  #--------------------------------------------------------------------------
  def update_cursor_rect
    x = 320 - @max_char * 14 + @index * 28
    self.cursor_rect.set(x, 32, 28, 32)
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    super
    update_cursor_rect
  end
end
#==============================================================================
# ■ Scene_WeaponName
#------------------------------------------------------------------------------
#  处理武器名称输入画面的类。
#==============================================================================

class Scene_WeaponName
  # 初始化
  def initialize(weapon_id, max_char)
    @weapon = $data_weapons[weapon_id]
    @max_char = max_char
  end
  #--------------------------------------------------------------------------
  # ● 主处理
  #--------------------------------------------------------------------------
  def main
    $game_temp.name_max_char = @max_char
    # 生成窗口
    @edit_window = Window_WeaponNameEdit.new(@weapon, @max_char)
    @input_window = Window_NameInput.new
    # 执行过渡
    Graphics.transition
    # 主循环
    loop do
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 刷新信息
      update
      # 如果画面切换就中断循环
      if $scene != self
        break
      end
    end
    # 准备过渡
    Graphics.freeze
    # 释放窗口
    @edit_window.dispose
    @input_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    # 刷新窗口
    @edit_window.update
    @input_window.update
    # 按下 B 键的情况下
    if Input.repeat?(Input::B)
      # 光标位置为 0 的情况下
      if @edit_window.index == 0
        return
      end
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 删除文字
      @edit_window.back
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 光标位置为 [确定] 的情况下
      if @input_window.character == nil
        # 名称为空的情况下
        if @edit_window.name == ""
          # 还原为默认名称
          @edit_window.restore_default
          # 名称为空的情况下
          if @edit_window.name == ""
            # 演奏冻结 SE
            $game_system.se_play($data_system.buzzer_se)
            return
          end
          # 演奏确定 SE
          $game_system.se_play($data_system.decision_se)
          return
        end
        # 储存
        $game_system.weapon_names = {} if $game_system.weapon_names == nil
        if @edit_window.name == @weapon.ori_name
          $game_system.weapon_names.delete(@weapon.id)
        else
          $game_system.weapon_names[@weapon.id] = @edit_window.name
        end
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到地图画面
        $scene = Scene_Map.new
        return
      end
      # 光标位置为最大的情况下
      if @edit_window.index == $game_temp.name_max_char
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 文字为空的情况下
      if @input_window.character == ""
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 添加文字
      @edit_window.add(@input_window.character)
      return
    end
  end
end
class Game_System
  attr_accessor :weapon_names
  alias weapon_name_initialize initialize
  def initialize
    @weapon_names = {}
    weapon_name_initialize
  end
end
class RPG::Weapon
  def name
    if $game_system.weapon_names == nil || $game_system.weapon_names[@id] == nil
      return @name
    end
    return $game_system.weapon_names[@id]
  end
  def ori_name
    @name
  end
end[/pre]   

评分

参与人数 2星屑 +30 梦石 +1 收起 理由
︶ㄣ牛排ぶ + 1 认可答案
kuerlulu + 30 塞糖

查看全部评分

回复

使用道具 举报

梦石
0
星屑
55
在线时间
111 小时
注册时间
2014-8-16
回帖
14
 楼主| 发表于 2014-8-25 08:14:38 | 显示全部楼层
RyanBern 发表于 2014-8-24 19:56
使用方法:把脚本贴在main前,可能会和一些武器类的脚本冲突。其实是我仿照姓名输入界面编写的一个武器名称 ...

非常感谢前辈。
现遇到几个问题:
                       1.脚本21行出错 SyntaxError
                       2.关于中文输入的问题。现用中文字表解决。如果要使用键盘输入的话,需要准备全键盘脚本,字库。。  还需要要怎么修改脚本?
                       3.如果要在游戏中能选择需要改名的武器的话,需要怎么修改?
{:2_253:}希望前辈能指导我一下……
回复

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2014-8-25 08:26:13 | 显示全部楼层
蝶月 发表于 2014-8-25 08:14
非常感谢前辈。
现遇到几个问题:
                       1.脚本21行出错 SyntaxError


21行属于论坛BUG,变量名被错误解析了,把21行改成
@weapon=weapon
以后看到这种url都这样改。
如果是直接输入的话,好像应该用输入法脚本吧,这个我不太确定。
在游戏中需要武器改名的话,更改Scene_Item里面的update方法。注意修改的部分。
  1. class Scene_Item
  2.   def update_item
  3.     # 按下 B 键的情况下
  4.     if Input.trigger?(Input::B)
  5.       # 演奏取消 SE
  6.       $game_system.se_play($data_system.cancel_se)
  7.       # 切换到菜单画面
  8.       $scene = Scene_Menu.new(0)
  9.       return
  10.     end
  11.     # 按下 C 键的情况下
  12.     if Input.trigger?(Input::C)
  13.       # 获取物品窗口当前选中的物品数据
  14.       @item = @item_window.item
  15.       # 武器改名
  16.       if @item.is_a?(RPG::Weapon)
  17.         $game_system.se_play($data_system.decision_se)
  18.         # 切换武器名称修改画面,默认输入长度为10个
  19.         $scene = Scene_WeaponName.new(@item.id, 10)
  20.         return
  21.       end
  22.       ####
  23.       # 不使用物品的情况下
  24.       unless @item.is_a?(RPG::Item)
  25.         # 演奏冻结 SE
  26.         $game_system.se_play($data_system.buzzer_se)
  27.         return
  28.       end
  29.       # 不能使用的情况下
  30.       unless $game_party.item_can_use?(@item.id)
  31.         # 演奏冻结 SE
  32.         $game_system.se_play($data_system.buzzer_se)
  33.         return
  34.       end
  35.       # 演奏确定 SE
  36.       $game_system.se_play($data_system.decision_se)
  37.       # 效果范围是我方的情况下
  38.       if @item.scope >= 3
  39.         # 激活目标窗口
  40.         @item_window.active = false
  41.         @target_window.x = (@item_window.index + 1) % 2 * 304
  42.         @target_window.visible = true
  43.         @target_window.active = true
  44.         # 设置效果范围 (单体/全体) 的对应光标位置
  45.         if @item.scope == 4 || @item.scope == 6
  46.           @target_window.index = -1
  47.         else
  48.           @target_window.index = 0
  49.         end
  50.       # 效果在我方以外的情况下
  51.       else
  52.         # 公共事件 ID 有效的情况下
  53.         if @item.common_event_id > 0
  54.           # 预约调用公共事件
  55.           $game_temp.common_event_id = @item.common_event_id
  56.           # 演奏物品使用时的 SE
  57.           $game_system.se_play(@item.menu_se)
  58.           # 消耗品的情况下
  59.           if @item.consumable
  60.             # 使用的物品数减 1
  61.             $game_party.lose_item(@item.id, 1)
  62.             # 再描绘物品窗口的项目
  63.             @item_window.draw_item(@item_window.index)
  64.           end
  65.           # 切换到地图画面
  66.           $scene = Scene_Map.new
  67.           return
  68.         end
  69.       end
  70.       return
  71.     end
  72.   end
  73. end
复制代码
回复

使用道具 举报

梦石
0
星屑
55
在线时间
111 小时
注册时间
2014-8-16
回帖
14
 楼主| 发表于 2014-8-25 08:52:59 | 显示全部楼层
RyanBern 发表于 2014-8-25 08:26
21行属于论坛BUG,变量名被错误解析了,把21行改成
@weapon=weapon
以后看到这种url都这样改。

似乎是加了   
# 武器改名
      if @item.is_a?(RPG::Weapon)
        $game_system.se_play($data_system.decision_se)
        # 切换武器名称修改画面,默认输入长度为10个
        $scene = Scene_WeaponName.new(@item.id, 10)
        return
      end
      ####
这一段是吗?
实测无效……就像不可使用的物品一样..

点评

我这边没有问题,是不是和别的脚本冲突?  发表于 2014-8-25 09:09
回复

使用道具 举报

梦石
0
星屑
55
在线时间
111 小时
注册时间
2014-8-16
回帖
14
 楼主| 发表于 2014-8-25 09:13:50 | 显示全部楼层
RyanBern 发表于 2014-8-25 08:26
21行属于论坛BUG,变量名被错误解析了,把21行改成
@weapon=weapon
以后看到这种url都这样改。

0.0 可以用了……
非常感谢帮助
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部