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 编辑

按照第二种方式写的话,最后未完成的结果如下(删去冗长的注释,可自行补加):

RUBY 代码复制
  1. class RPG::BaseItem
  2.   def fri
  3.     @note =~ /<FRI\s+(-*\d+)>/i ? $1.to_i : 0
  4.   end
  5. end
  6.  
  7. class Game_BattlerBase
  8.  
  9.   attr_reader  :fri_plus
  10.  
  11.   def fri
  12.     (fri_base + fri_plus) * fri_rate
  13.   end
  14.  
  15.   alias fri_initialize initialize
  16.   def initialize
  17.     fri_initialize
  18.     @fri_plus = 0
  19.   end   
  20.  
  21.   def add_fri(fri) #用于事件中增减属性
  22.     @fri_plus += fri
  23.     refresh
  24.   end
  25.  
  26.   def fri_base
  27.     return 0
  28.   end
  29.  
  30.   def fri_rate
  31.     return 1        #根据实际情况更改!
  32.   end
  33. end
  34.  
  35. class Game_Actor
  36.  
  37.   def fri_base
  38.     [url=home.php?mod=space&uid=22147]@level[/url] * 2 + 1  #根据实际情况更改!
  39.     #多余的东西不要看,你懂的
  40.   end
  41.  
  42.   def fri_plus
  43.     equips.compact.inject(super) {|r, item| r + item.fri }
  44.   end
  45. end
  46.  
  47. class Game_Enemy
  48.   def fri_base
  49.     enemy.fri
  50.   end
  51. 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编辑器只和默认的脚本兼容。
你新增的属性要么自己在脚本里赋值,要么想其他的办法赋值。

比如 好感度。
RUBY 代码复制
  1. class Game_Actor < Game_Battler
  2.   attr_accessor :friend
  3.   alias old_initialize initialize
  4.   def initialize(actor_id)
  5.     old_initialize(actor_id)
  6.     [url=home.php?mod=space&uid=69816]@friend[/url] = {}
  7.   end
  8. end

这样就给Actor类添加了一个新的属性,当然这只是创建了一个属性,还没有处理它的方法,
就算这样,他也具备工作能力了。
比如
RUBY 代码复制
  1. # 获取好感度
  2. name=$game_actors[2].name    # 第二个角色的名字
  3. $game_actors[1].friend[name] # 返回一号角色对二号角色的好感度
  4. $game_actors[1].friend[name]=0 if  $game_actors[1].friend[name]==nil
  5. # 设置好感度
  6. name=$game_actors[2].name    # 第二个角色的名字
  7. p $game_actors[1].friend[name]+=10 # 设置一号角色对二号角色为0


作者: 阿薯救世主    时间: 2013-12-26 16:56
啊,这一步终于过了!
结果还是觉得t酱说的重写比新增类要方便得多。
这个问题可以关了?




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1