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 |