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

Project1

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

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
55
在线时间
111 小时
注册时间
2014-8-16
帖子
19
跳转到指定楼层
1
发表于 2014-8-24 14:54:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

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

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

点评

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

评分

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

查看全部评分

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

2
发表于 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
RUBY 代码复制
  1. #==============================================================================
  2. # ■ Window_WeaponNameEdit
  3. #------------------------------------------------------------------------------
  4. #  武器名称输入画面、编辑名称的窗口。
  5. #==============================================================================
  6.  
  7. class Window_WeaponNameEdit < Window_Base
  8.   #--------------------------------------------------------------------------
  9.   # ● 定义实例变量
  10.   #--------------------------------------------------------------------------
  11.   attr_reader   :name                     # 名称
  12.   attr_reader   :index                    # 光标位置
  13.   #--------------------------------------------------------------------------
  14.   # ● 初始化对像
  15.   #     weapon   : 武器
  16.   #     max_char : 最大字数
  17.   #--------------------------------------------------------------------------
  18.   def initialize(weapon, max_char)
  19.     super(0, 0, 640, 128)
  20.     self.contents = Bitmap.new(width - 32, height - 32)
  21.     [url=home.php?mod=space&uid=36793]@weapon[/url] = weapon
  22.     @name = weapon.name
  23.     @max_char = max_char
  24.     # 控制名字在最大字数以内
  25.     name_array = @name.split(//)[0...@max_char]
  26.     @name = ""
  27.     for i in 0...name_array.size
  28.       @name += name_array[i]
  29.     end
  30.     @default_name = @name
  31.     @index = name_array.size
  32.     refresh
  33.     update_cursor_rect
  34.   end
  35.   #--------------------------------------------------------------------------
  36.   # ● 还原为默认的名称
  37.   #--------------------------------------------------------------------------
  38.   def restore_default
  39.     @name = @default_name
  40.     @index = @name.split(//).size
  41.     refresh
  42.     update_cursor_rect
  43.   end
  44.   #--------------------------------------------------------------------------
  45.   # ● 添加文字
  46.   #     character : 要添加的文字
  47.   #--------------------------------------------------------------------------
  48.   def add(character)
  49.     if @index < @max_char and character != ""
  50.       @name += character
  51.       @index += 1
  52.       refresh
  53.       update_cursor_rect
  54.     end
  55.   end
  56.   #--------------------------------------------------------------------------
  57.   # ● 删除文字
  58.   #--------------------------------------------------------------------------
  59.   def back
  60.     if @index > 0
  61.       # 删除一个字
  62.       name_array = @name.split(//)
  63.       @name = ""
  64.       for i in 0...name_array.size-1
  65.         @name += name_array[i]
  66.       end
  67.       @index -= 1
  68.       refresh
  69.       update_cursor_rect
  70.     end
  71.   end
  72.   #--------------------------------------------------------------------------
  73.   # ● 刷新
  74.   #--------------------------------------------------------------------------
  75.   def refresh
  76.     self.contents.clear
  77.     # 描绘名称
  78.     name_array = @name.split(//)
  79.     for i in 0...@max_char
  80.       c = name_array[i]
  81.       if c == nil
  82.         c = "_"
  83.       end
  84.       x = 320 - @max_char * 14 + i * 28
  85.       self.contents.draw_text(x, 32, 28, 32, c, 1)
  86.     end
  87.     # 描绘图形
  88.     bitmap = RPG::Cache.icon(@weapon.icon_name)
  89.     self.contents.blt(320 - @max_char * 14 - 40, 32, bitmap, Rect.new(0,0,24,24))
  90.   end
  91.   #--------------------------------------------------------------------------
  92.   # ● 刷新光标矩形
  93.   #--------------------------------------------------------------------------
  94.   def update_cursor_rect
  95.     x = 320 - @max_char * 14 + @index * 28
  96.     self.cursor_rect.set(x, 32, 28, 32)
  97.   end
  98.   #--------------------------------------------------------------------------
  99.   # ● 刷新画面
  100.   #--------------------------------------------------------------------------
  101.   def update
  102.     super
  103.     update_cursor_rect
  104.   end
  105. end
  106. #==============================================================================
  107. # ■ Scene_WeaponName
  108. #------------------------------------------------------------------------------
  109. #  处理武器名称输入画面的类。
  110. #==============================================================================
  111.  
  112. class Scene_WeaponName
  113.   # 初始化
  114.   def initialize(weapon_id, max_char)
  115.     @weapon = $data_weapons[weapon_id]
  116.     @max_char = max_char
  117.   end
  118.   #--------------------------------------------------------------------------
  119.   # ● 主处理
  120.   #--------------------------------------------------------------------------
  121.   def main
  122.     $game_temp.name_max_char = @max_char
  123.     # 生成窗口
  124.     @edit_window = Window_WeaponNameEdit.new(@weapon, @max_char)
  125.     @input_window = Window_NameInput.new
  126.     # 执行过渡
  127.     Graphics.transition
  128.     # 主循环
  129.     loop do
  130.       # 刷新游戏画面
  131.       Graphics.update
  132.       # 刷新输入信息
  133.       Input.update
  134.       # 刷新信息
  135.       update
  136.       # 如果画面切换就中断循环
  137.       if $scene != self
  138.         break
  139.       end
  140.     end
  141.     # 准备过渡
  142.     Graphics.freeze
  143.     # 释放窗口
  144.     @edit_window.dispose
  145.     @input_window.dispose
  146.   end
  147.   #--------------------------------------------------------------------------
  148.   # ● 刷新画面
  149.   #--------------------------------------------------------------------------
  150.   def update
  151.     # 刷新窗口
  152.     @edit_window.update
  153.     @input_window.update
  154.     # 按下 B 键的情况下
  155.     if Input.repeat?(Input::B)
  156.       # 光标位置为 0 的情况下
  157.       if @edit_window.index == 0
  158.         return
  159.       end
  160.       # 演奏取消 SE
  161.       $game_system.se_play($data_system.cancel_se)
  162.       # 删除文字
  163.       @edit_window.back
  164.       return
  165.     end
  166.     # 按下 C 键的情况下
  167.     if Input.trigger?(Input::C)
  168.       # 光标位置为 [确定] 的情况下
  169.       if @input_window.character == nil
  170.         # 名称为空的情况下
  171.         if @edit_window.name == ""
  172.           # 还原为默认名称
  173.           @edit_window.restore_default
  174.           # 名称为空的情况下
  175.           if @edit_window.name == ""
  176.             # 演奏冻结 SE
  177.             $game_system.se_play($data_system.buzzer_se)
  178.             return
  179.           end
  180.           # 演奏确定 SE
  181.           $game_system.se_play($data_system.decision_se)
  182.           return
  183.         end
  184.         # 储存
  185.         $game_system.weapon_names = {} if $game_system.weapon_names == nil
  186.         if @edit_window.name == @weapon.ori_name
  187.           $game_system.weapon_names.delete(@weapon.id)
  188.         else
  189.           $game_system.weapon_names[@weapon.id] = @edit_window.name
  190.         end
  191.         # 演奏确定 SE
  192.         $game_system.se_play($data_system.decision_se)
  193.         # 切换到地图画面
  194.         $scene = Scene_Map.new
  195.         return
  196.       end
  197.       # 光标位置为最大的情况下
  198.       if @edit_window.index == $game_temp.name_max_char
  199.         # 演奏冻结 SE
  200.         $game_system.se_play($data_system.buzzer_se)
  201.         return
  202.       end
  203.       # 文字为空的情况下
  204.       if @input_window.character == ""
  205.         # 演奏冻结 SE
  206.         $game_system.se_play($data_system.buzzer_se)
  207.         return
  208.       end
  209.       # 演奏确定 SE
  210.       $game_system.se_play($data_system.decision_se)
  211.       # 添加文字
  212.       @edit_window.add(@input_window.character)
  213.       return
  214.     end
  215.   end
  216. end
  217. class Game_System
  218.   attr_accessor :weapon_names
  219.   alias weapon_name_initialize initialize
  220.   def initialize
  221.     @weapon_names = {}
  222.     weapon_name_initialize
  223.   end
  224. end
  225. class RPG::Weapon
  226.   def name
  227.     if $game_system.weapon_names == nil || $game_system.weapon_names[@id] == nil
  228.       return @name
  229.     end
  230.     return $game_system.weapon_names[@id]
  231.   end
  232.   def ori_name
  233.     @name
  234.   end
  235. end
   

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

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

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

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

4
发表于 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
复制代码
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
111 小时
注册时间
2014-8-16
帖子
19
5
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

Lv1.梦旅人

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

0.0 可以用了……
非常感谢帮助
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-19 00:28

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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