Project1
标题: 我想重新定义一下角色的属性,新人刚学脚本 [打印本页]
作者: 阿薯救世主 时间: 2013-12-24 15:40
标题: 我想重新定义一下角色的属性,新人刚学脚本
我的意思是,角色不止需要攻击力、防御力等属性,还有比如友好度、其他攻击类型的攻击力等。
是不是涉及到数据库的范畴?我只看过va的新人教程,并不能灵活运用,所以请教下该如何为角色新增属性。
作者: fux2 时间: 2013-12-24 16:16
这个只能在脚本里给角色新增属性,增加之后就不能在数据库里编辑了,只能在脚本里编辑,当然可以通过某些取巧的方法比如读取注释之类的方法来写。
普通的数值还好,如果是攻击力那种参与各种计算的东西- -你还是自己琢磨吧。
作者: 阿薯救世主 时间: 2013-12-24 16:21
fux2 发表于 2013-12-24 16:16 
这个只能在脚本里给角色新增属性,增加之后就不能在数据库里编辑了,只能在脚本里编辑,当然可以通过某些取 ...
我应该怎么做?
我的想法是,新增一个角色属性类,里面的实例变量就是新属性,以角色ID作为主键关联每个角色。但是那些属性该如何保存到数据中?
作者: taroxd 时间: 2013-12-24 16:25
本帖最后由 taroxd 于 2013-12-26 06:40 编辑
首先不推荐没事增加属性,用起来肯定是没有官方给定的属性简单的。
以下无环境瞎扯,添加一个非常简单的属性,有帮助就看看吧。
假设要增加一个属性,叫友好度
首先定义友好度
class Game_BattlerBase
attr_accessor :fri #友好度
alias fri_initialize initialize
def initialize
fri_initialize
@fri = 50
end #默认的友好度为50
end
然后在想要改变某角色(在此称为actor)的友好度的地方写
actor.fri = x # x是变成的数值,支持+=、-=等运算符
举例:在事件中运行脚本 $game_actors[1].fri += 5
在需要用到该角色的友好度时,可以用 actor.fri
比如在技能的伤害公式里写 a.fri - b.def 什么的
继续举例:每升一级友好度+1
在class Game_BattlerBase中继续添加
alias fri_level_up level_up
def level_up
fri_level_up
@fri += 1 #这里当然可以用更复杂的表达式,看你的需要。
end
-----------------------以上是超超超简易版本---------------------
如果需要装备,状态等能增加属性,那就不要这样比较好,推荐模仿原来的系统定义新属性。以下考虑敌人也有该属性的情况。
大概是这样(再次重申:没环境没测试,有问题很正常!)
class Game_BattlerBase
def fri
(fri_base + fri_plus) * fri_rate #(基础值 + 装备添加值)* 状态对该属性的影响
end
end
装备添加值和状态变化率都是可以定义的,可以通过装备和状态的注释来实现
基础值也是要自己定义的,可以设计成等级的函数之类的,这可以依赖职业的注释来实现。
举个例子
class RPG::EquipItem #没环境,拼错了不要怪我。为了方便其实也可以直接在RPG::BaseItem里定义
def fri
@note =~ /<FRI\s+(-*\d+)>/i ? $1.to_i : 0 #这里用到了正则表达式,大概意思是只要在装备处注释"<fri x>"就可以实现该装备提升x点友好度。
end
end
class Game_BattlerBase
attr_reader :fri_plus
alias fri_initialize initialize
def initialize #把友好度的附加值初始化为0
fri_initialize
@fri_plus = 0
end
def add_fri(value) #有了这个方法,就能在事件里增减能力值了。例: $game_actors[1].add_fri(1)。value可以为负数
@fri_plus += value
refresh
end
end
class Game_Actor
def fri_plus
equips.compact.inject(super) {|r, item| r + item.fri } #再增加装备的附加值
end
end
附加值部分差不多就是上面这一部分
对于基础值,可以这样
class Game_BattlerBase
def fri_base
return 0 #填一个防止出错
end
end
class Game_Actor
def fri_base
@level * 2 + 1 #填入对角色的计算公式。这里可以使用@level等数据,也可以使用职业、角色等各种地方填的注释
end
end
class Game_Enemy
def fri_base
#填入对敌人的计算公式。这里当然推荐使用敌人的注释啦~ 方法同“装备增加友好度”,可查F1。
end
end
同样的方法定义状态对该属性的影响,善用状态的注释。为了防止出错先写一下吧。
class Game_BattlerBase
def fri_rate
return 1 #依据实际情况更改!
end
end
然后需要改写菜单显示这个属性,这个模仿原来的属性窗口就行了,不多作解释。
最后,你就可以在技能公式栏里运用这个属性了。 差不多就这点吧……
作者: 阿薯救世主 时间: 2013-12-24 16:48
taroxd 发表于 2013-12-24 16:25 
首先不推荐没事增加属性,用起来肯定是没有官方给定的属性简单的。
以下无环境瞎扯,添加一个非常简单的属 ...
多谢你的回答!我会去试试的。
作者: taroxd 时间: 2013-12-24 17:50
本帖最后由 taroxd 于 2013-12-26 06:41 编辑
按照第二种方式写的话,最后未完成的结果如下(删去冗长的注释,可自行补加):
class RPG::BaseItem
def fri
@note =~ /<FRI\s+(-*\d+)>/i ? $1.to_i : 0
end
end
class Game_BattlerBase
attr_reader :fri_plus
def fri
(fri_base + fri_plus) * fri_rate
end
alias fri_initialize initialize
def initialize
fri_initialize
@fri_plus = 0
end
def add_fri(fri) #用于事件中增减属性
@fri_plus += fri
refresh
end
def fri_base
return 0
end
def fri_rate
return 1 #根据实际情况更改!
end
end
class Game_Actor
def fri_base
[url=home.php?mod=space&uid=22147]@level[/url] * 2 + 1 #根据实际情况更改!
#多余的东西不要看,你懂的
end
def fri_plus
equips.compact.inject(super) {|r, item| r + item.fri }
end
end
class Game_Enemy
def fri_base
enemy.fri
end
end
class RPG::BaseItem
def fri
@note =~ /<FRI\s+(-*\d+)>/i ? $1.to_i : 0
end
end
class Game_BattlerBase
attr_reader :fri_plus
def fri
(fri_base + fri_plus) * fri_rate
end
alias fri_initialize initialize
def initialize
fri_initialize
@fri_plus = 0
end
def add_fri(fri) #用于事件中增减属性
@fri_plus += fri
refresh
end
def fri_base
return 0
end
def fri_rate
return 1 #根据实际情况更改!
end
end
class Game_Actor
def fri_base
[url=home.php?mod=space&uid=22147]@level[/url] * 2 + 1 #根据实际情况更改!
#多余的东西不要看,你懂的
end
def fri_plus
equips.compact.inject(super) {|r, item| r + item.fri }
end
end
class Game_Enemy
def fri_base
enemy.fri
end
end
没有环境,有错误请指正
作者: 阿薯救世主 时间: 2013-12-25 12:19
taroxd 发表于 2013-12-24 17:50 
按照第二种方式写的话,最后未完成的结果如下(删去冗长的注释,可自行补加):
class RPG::BaseItem
我想问下RPG::EquipItem 这种写法(命名方式?)是什么意思?
作者: taroxd 时间: 2013-12-25 12:35
阿薯救世主 发表于 2013-12-25 12:19 
我想问下RPG::EquipItem 这种写法(命名方式?)是什么意思?
你可以简单理解为就是一个类,这是一个游戏内建的类(参见F1)
------------------------以下可以无视---------------------
和下面是一样的,EquipItem可以看成RPG模块的一个常量
module RPG
class EquipItem
#def methods
end
end
作者: 阿薯救世主 时间: 2013-12-25 13:12
taroxd 发表于 2013-12-25 12:35 
你可以简单理解为就是一个类,这是一个游戏内建的类(参见F1)
------------------------以下可以无视--- ...
我设想:
因为我不想动元脚本的东西,所以我新建一个类继承了Game_Actor,然后这个类就是处理新增属性的东西。然后使用$game_actor这个全局变量就可以在事件的脚本中调用了吗?
比如说,那个事件脚本是空白的,我想让这个事件将我的角色斩切攻击力提升2点,于是我就写上
$game_actors[0].atk_brade += 2 这一句就行了?
注:atk_brade已经在新类中定义好了
作者: 国产吃货 时间: 2013-12-25 13:48
楼主的办法有些纰漏、
好感度是一个相对属性,仅仅一个变量不足以完整的标示好感度。
好感度应该是一个hash(hash还好点)
hash的主键应该为Actor的ID
hash的值应该为对该角色的好感度。
作者: saturnfjh 时间: 2013-12-25 14:05
定义一个Hash作为全局变量,参照 $game_party, 就这么简单。
作者: fux2 时间: 2013-12-25 14:05
阿薯救世主 发表于 2013-12-25 13:12 
我设想:
因为我不想动元脚本的东西,所以我新建一个类继承了Game_Actor,然后这个类就是处理新增 ...
这样是可以的。
另外模块在游戏制作里的用途你可以理解为命名空间- -
作者: 国产吃货 时间: 2013-12-25 14:16
本帖最后由 国产吃货 于 2013-12-25 14:18 编辑
hash 哈希表
作用类同于一个二维数组。
A={"吴莉嘉"=>10,"班尼特"=15}
我定义了一个叫A的hash表,表内有两个数据。
如果我调用,A["班尼特"],那么会返回 15
同理,调用A["吴莉嘉],则会返回10
如果我调用A["伊尔维亚"],由于A里面没有叫伊尔维亚的主键,所以就会返回默认的nil(空)
新增属性其实很简单,只不过RM编辑器只和默认的脚本兼容。
你新增的属性要么自己在脚本里赋值,要么想其他的办法赋值。
比如 好感度。
class Game_Actor < Game_Battler
attr_accessor :friend
alias old_initialize initialize
def initialize(actor_id)
old_initialize(actor_id)
[url=home.php?mod=space&uid=69816]@friend[/url] = {}
end
end
class Game_Actor < Game_Battler
attr_accessor :friend
alias old_initialize initialize
def initialize(actor_id)
old_initialize(actor_id)
[url=home.php?mod=space&uid=69816]@friend[/url] = {}
end
end
这样就给Actor类添加了一个新的属性,当然这只是创建了一个属性,还没有处理它的方法,
就算这样,他也具备工作能力了。
比如
# 获取好感度
name=$game_actors[2].name # 第二个角色的名字
$game_actors[1].friend[name] # 返回一号角色对二号角色的好感度
$game_actors[1].friend[name]=0 if $game_actors[1].friend[name]==nil
# 设置好感度
name=$game_actors[2].name # 第二个角色的名字
p $game_actors[1].friend[name]+=10 # 设置一号角色对二号角色为0
# 获取好感度
name=$game_actors[2].name # 第二个角色的名字
$game_actors[1].friend[name] # 返回一号角色对二号角色的好感度
$game_actors[1].friend[name]=0 if $game_actors[1].friend[name]==nil
# 设置好感度
name=$game_actors[2].name # 第二个角色的名字
p $game_actors[1].friend[name]+=10 # 设置一号角色对二号角色为0
作者: 阿薯救世主 时间: 2013-12-26 16:56
啊,这一步终于过了!
结果还是觉得t酱说的重写比新增类要方便得多。
这个问题可以关了?
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |