- 注册时间
- 2004-12-19
- 最后登录
- 2006-11-15
⑤进阶
- 积分
- 930
|
有时候,我们需要创建自己的类或者扩展原有类的属性,但是rm的数据库编辑器只能识别module RPG里面默认的属性。
例如武器,我们加个防御有效度的属性pdef_factor,然后再加个双手武器的属性 two_handed
1、我们写RPG::Weapon类的扩展类,添加这两个属性
2、制作类似debug的武器编辑场景,在这个场景可以编辑$data_weapons里面的数据。
3、场景退出的时候,利用文件操作函数保存$data_weapons数据到Data\Weapons.rxdata
这样我们可以替换掉rm的武器编辑界面了,唯一麻烦的地方是输入汉字的问题,不过只是要修改数值类型的属性倒也无所谓了。
这样做的好处是游戏里面可以直接修改数据库数据,方便调试平衡性,并且我们添加一些自定义的类型,例如宠物可以保存数据了,不必再写在脚本里面了。
--------------------------------------------------------------------------------------------------
下面是测试版,写了个武器的扩展类,然后在游戏里面编辑扩展属性。其实原有属性也可以编辑,甚至可以取代rm的主程序,不过那样是个大工程,恐怕不是几天能完成的。 [s:5]
测试版使用方法:
1、创建RPG::Weapon的扩展类
2、创建Window_WeaponEditor_List类
3、创建Window_WeaponEditor_Attr类
4、创建Scene_WeaponEditor类
5、如果第一次使用,游戏里面要执行如下脚本
for ind in 1...$data_weapons.size
$data_weapons[ind].ext
end
作用就是初始化这些Weapon事例的扩展属性,否则无法保存数据
6、游戏中可以调用$scene = Scene_WeaponEditor.new进入编辑界面
7、注意:扩展属性后两个现在还不能编辑,因为要创建数组的编辑界面实在是复杂
#==============================================================================
# ■ Game_Weapon
#------------------------------------------------------------------------------
# 武器扩展定义
#==============================================================================
module RPG
class Weapon
#--------------------------------------------------------------------------
# ● 扩展数据
#--------------------------------------------------------------------------
attr_accessor :ammo_id #弹药id
attr_accessor :ammo_req #弹药消耗量
attr_accessor :two_handed #双手?
attr_accessor :str_bonus #力量加成点数
attr_accessor :dex_bonus #敏捷加成点数
attr_accessor :bonus #固定加成点数
attr_accessor :def_factor #防御有效度
attr_accessor :hp_factor #HP影响度
attr_accessor :sta_factor #状态影响度
attr_accessor :hit_factor #命中率修正
attr_accessor :class_atk_factors #职业攻击力修正
attr_accessor :class_hit_factors #职业命中率修正
#--------------------------------------------------------------------------
# ● 初始化扩展数据
#--------------------------------------------------------------------------
def ext
@ammo_id = 0
@ammo_req = 0
@two_handed = false
@str_bonus = 100
@dex_bonus = 0
@bonus = 0
@def_factor = 100
@hp_factor = 0
@sta_factor = 100
@hit_factor = 100
@class_atk_factors = []
@class_hit_factors = []
end
#--------------------------------------------------------------------------
# ● 弹药足够与否
#--------------------------------------------------------------------------
def ammo_available?
return $game_party.item_number(@ammo_id) >= @ammo_req
end
#--------------------------------------------------------------------------
# ● 弹药剩余数量
#--------------------------------------------------------------------------
def ammo_count
return $game_party.item_number(@ammo_id)
end
end
end
#==============================================================================
# ■ Window_WeaponEditor_List
#------------------------------------------------------------------------------
# 武器编辑器的列表窗口。
#==============================================================================
class Window_WeaponEditor_List < Window_Selectable
#--------------------------------------------------------------------------
# ● 初始化对像
#--------------------------------------------------------------------------
def initialize
super(0, 0, 192, 480)
self.index = 0
refresh
end
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
def refresh
if self.contents != nil
self.contents.dispose
self.contents = nil
end
@item_max = $data_weapons.size
self.contents = Bitmap.new(width - 32, @item_max * 32)
for i in 1...@item_max
text = i.to_s + " " + $data_weapons.name
self.contents.draw_text(4, i * 32 - 32, 152, 32, text)
end
end
end
#==============================================================================
# ■ Window_WeaponEditor_Attr
#------------------------------------------------------------------------------
# 武器编辑器的属性窗口。
#==============================================================================
class Window_WeaponEditor_Attr < Window_Selectable
#--------------------------------------------------------------------------
# ● 定义实例变量
#--------------------------------------------------------------------------
attr_reader :weapon # 当前武器
attr_accessor :value_list # 属性值列表
#--------------------------------------------------------------------------
# ● 初始化对像
#--------------------------------------------------------------------------
def initialize
super(192, 0, 448, 352)
self.index = -1
self.active = false
@num_window = Window_InputNumber.new(3)
@num_window.visible = false
@num_window.x = self.x + self.width / 2
@num_window.y = self.y + self.height / 2
@weapon = nil
@attr_list = ["名称", "双手?", "力量加成", "敏捷加成", "固定加成", "HP影响度",
"状态影响度", "防御有效度", "命中率修正", "弹药ID", "弹药消耗"]
# 模式 (-1:只读、0:开关、1:变量、2:列表编辑,保留)
@mode_list = [-1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]
@value_list = nil
@item_max = @attr_list.size
self.contents = Bitmap.new(width - 32, @item_max * 32)
refresh
end
#--------------------------------------------------------------------------
# ● 更新界面
#--------------------------------------------------------------------------
def update
super
if @num_window.visible
@num_window.update
#按确定,保存数据
if Input.trigger?(Input::C)
attr_change(@num_window.number)
@num_window.visible = false
@num_window.active = false
self.active = true
return
end
#按取消,放弃数据
if Input.trigger?(Input::B)
@num_window.visible = false
@num_window.active = false
self.active = true
return
end
end
end
#--------------------------------------------------------------------------
# ● 销毁
#--------------------------------------------------------------------------
def dispose
super
@num_window.dispose
end
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
def refresh
self.contents.clear
@value_list = nil
if @weapon == nil
return
end
#属性列表
@value_list = [@weapon.name, @weapon.two_handed, @weapon.str_bonus,
@weapon.dex_bonus, @weapon.bonus, @weapon.hp_factor,
@weapon.sta_factor, @weapon.def_factor, @weapon.hit_factor,
@weapon.ammo_id, @weapon.ammo_req]
for i in 0..@item_max-1
width = self.contents.text_size(@attr_list).width
self.contents.draw_text(4, i * 32, width, 32, @attr_list)
self.contents.draw_text(312, i * 32, 100, 32, @value_list.to_s)
#if @mode_list != 2
# self.contents.draw_text(312, i * 32, 100, 32, @value_list.to_s)
#else
# self.contents.draw_text(312, i * 32, 100, 32, "[编辑]")
#end
end
end
#--------------------------------------------------------------------------
# ● 模式
#--------------------------------------------------------------------------
def mode
return @mode_list[self.index]
end
#--------------------------------------------------------------------------
# ● 设置武器
# weapon : 新的武器
#--------------------------------------------------------------------------
def weapon=(weapon)
if @weapon != weapon
@weapon = weapon
refresh
end
end
#--------------------------------------------------------------------------
# ● 更新武器属性
#--------------------------------------------------------------------------
def update_attr
if @weapon == nil or @value_list == nil
return
end
#@weapon.name = @value_list[0]
@weapon.two_handed = @value_list[1]
@weapon.str_bonus = @value_list[2]
@weapon.dex_bonus = @value_list[3]
@weapon.bonus = @value_list[4]
@weapon.hp_factor = @value_list[5]
@weapon.sta_factor = @value_list[6]
@weapon.def_factor = @value_list[7]
@weapon.hit_factor = @value_list[8]
@weapon.ammo_id = @value_list[9]
@weapon.ammo_req = @value_list[10]
self.refresh
end
#--------------------------------------------------------------------------
# ● 开始输入数值
#--------------------------------------------------------------------------
def begin_num_input
if @value_list == nil
return
end
@num_window.visible = true
@num_window.active = true
@num_window.number = @value_list[self.index]
self.active = false
end
#--------------------------------------------------------------------------
# ● 改变属性值
# chg : 新数量
#--------------------------------------------------------------------------
def attr_change(chg)
if @value_list == nil
return
end
@value_list[self.index] = chg
update_attr
end
#--------------------------------------------------------------------------
# ● 反转布尔属性值
#--------------------------------------------------------------------------
def attr_reverse
if @value_list == nil
return
end
@value_list[self.index] = !@value_list[self.index]
update_attr
end
end
#==============================================================================
# ■ Scene_WeapoEditor
#------------------------------------------------------------------------------
# 武器属性编辑界面
#==============================================================================
class Scene_WeaponEditor
#--------------------------------------------------------------------------
# ● 主处理
#--------------------------------------------------------------------------
def main
# 生成窗口
@list_window = Window_WeaponEditor_List.new
@list_window.active = true
@attr_window = Window_WeaponEditor_Attr.new
@help_window = Window_Base.new(192, 352, 448, 128)
@help_window.contents = Bitmap.new(406, 96)
# 执行过渡
Graphics.transition
# 主循环
loop do
# 刷新游戏画面
Graphics.update
# 刷新输入情报
Input.update
# 刷新画面
update
# 如果画面被切换的话就中断循环
if $scene != self
break
end
end
#保存文件
file = File.open("Data/Weapons.rxdata", "wb")
Marshal.dump($data_weapons, file)
file.close
# 刷新地图
$game_map.refresh
# 装备过渡
Graphics.freeze
# 释放窗口
@list_window.dispose
@attr_window.dispose
@help_window.dispose
end
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
#刷新
@list_window.update
@attr_window.update
@help_window.update
@attr_window.weapon = $data_weapons[@list_window.index + 1]
# 列表窗口被激活的情况下: 调用 update_list
if @list_window.active
update_list
return
end
# 属性窗口被激活的情况下: 调用 update_attr
if @attr_window.active
update_attr
return
end
end
#--------------------------------------------------------------------------
# ● 刷新画面 (列表窗口被激活的情况下)
#--------------------------------------------------------------------------
def update_list
# 按下 B 键的情况下
if Input.trigger?(Input::B)
# 演奏取消 SE
$game_system.se_play($data_system.cancel_se)
# 切换到地图画面
$scene = Scene_Map.new
return
end
# 按下 C 键的情况下
if Input.trigger?(Input::C)
text1 = "← 或者 → : 编辑数据"
text2 = "C (Enter) : 改变布尔值 "
@help_window.contents.draw_text(4, 0, 406, 32, text1)
@help_window.contents.draw_text(4, 32, 406, 32, text2)
#@help_window.contents.draw_text(4, 64, 406, 32, text3)
@attr_window.weapon = $data_weapons[@list_window.index + 1]
@list_window.active = false
@attr_window.active = true
@attr_window.index = 0
end
end
#--------------------------------------------------------------------------
# ● 刷新画面 (属性窗口被激活的情况下)
#--------------------------------------------------------------------------
def update_attr
# 按下 B 键的情况下
if Input.trigger?(Input::B)
@list_window.active = true
@attr_window.active = false
@attr_window.index = -1
return
end
#数字编辑模式
if @attr_window.mode == 1
# 按下左/右键的情况下
if Input.repeat?(Input: EFT) or Input.repeat?(Input::RIGHT)
# 演奏光标 SE
$game_system.se_play($data_system.cursor_se)
# 属性值减 +1 执行数字更改和刷新
@attr_window.begin_num_input
return
end
end
#布尔值编辑模式
if @attr_window.mode == 0
# 按下 C 键的情况下
if Input.repeat?(Input::C)
# 演奏光标 SE
$game_system.se_play($data_system.cursor_se)
#执行数字更改和刷新
@attr_window.attr_reverse
return
end
end
end
end |
|