Project1

标题: XP中该如何制作一个新的状态……附上心路历程若干…… [打印本页]

作者: 阿竹天    时间: 2016-1-13 19:56
标题: XP中该如何制作一个新的状态……附上心路历程若干……
首先假设基本伤害如下:
     在game_battle 3中
      # 计算基本伤害
      atk = 1.0* [attacker.hit / self.pdef ].max    (顺便问一下 .MAX是什么作用呢……)
      self.damage = 1.0* atk * (20 + attacker.str) / 20

此时,我希望角色装备单手剑以后命中增加为:(STR+DEX)/2,双手剑命中增加 STR*1 ……就是不同的武器类型所增加的命中判定条件不同。

那么我首先想到的实现方式是:判断所装备武器的调用动画来锁定武器类型,再根据武器类型来带入不同的公式,然后我就觉得这是个大工程……

另觅出路后,我觉得结合事件来做可能比较容易实现,可能是会繁琐一点,但是对我可能比较容易实现。- -0
1、“变更装备”不同的装备打开不同的开关。
2、根据开关来设定对应的“增加状态”
3、通过脚本增加一个状态。(我觉得通过数据库增加的状态中,好像不能设置“命中 =100+(STR+DEX)/2”这种状态)

问题就是,我通过F1查找“状态”找到了 $data_states 这家伙
然后在脚本中查找 $data_states  觉得应该是game_battle 2或game_battle 1中,然后就……迷路了……找不到参照物来定义一个新的“状态,我现在也就是照猫画虎修修补补的LV……苦-0-

于是就来请求帮助了……到底该如何制作一个状态呢?
作者: RyanBern    时间: 2016-1-13 21:56
推荐使用下面的方法。
1. 新建[属性],表示武器的类型。在这里,使用的是[属性],而不是[状态],这是因为武器没有[自动状态]这个特性。
例如,你可以在属性里添加名为“单手剑”,“双手剑”的属性,然后在数据库设置的时候勾选即可。
2. 更改命中判定。
在Game_Battler3中,里面有两个方法非常重要,一个是attack_effect,一个是skill_effect。
其中,attack_effect表示受到普通攻击的效果,skill_effect表示受到特技攻击的效果。
看样子楼主是想修改attack_effect,那么我就继续说一下该怎么修改。
在attack_effect定义内,attacker表示攻击方,self表示被攻击方。
首先,获取武器可以用$data_weapons[attacker.weapon_id]进行获取,返回的是一个武器对象。要注意,如果attacker是敌人,那么敌人是没有weapon_id这个属性的,因此最好这样写:
RUBY 代码复制
  1. weapon = attacker.is_a?(Game_Actor) ? $data_weapons[attacker.weapon_id] : nil

上面这句话是说,如果攻击方是主角,那么获取他所持武器,否则返回nil。注意,如果主角身上没有装备武器,也会返回nil。
然后,获取武器的属性,这个可以用weapon.element_set来获取(当weapon为nil时,不能这样获取,需要额外处理即可)。
element_set是一个ID数组,里面包含了所有该武器的属性。假如你的“单手剑”属性ID为8,那么判断该武器是不是单手剑,可以用下面的代码:
RUBY 代码复制
  1. if weapon != nil && weapon.element_set.include?(8)
  2.   # do something
  3. end

在if里面写上你想要的特殊效果就行了。
作者: 阿竹天    时间: 2016-1-14 00:56
RyanBern 发表于 2016-1-13 21:56
推荐使用下面的方法。
1. 新建[属性],表示武器的类型。在这里,使用的是[属性],而不是[状态],这是因为武 ...


Game_battle 3 55 行 发生了NoMethoderror错误,undefined method 'hit'=for #<Game_Actor:0x2ec9ca8>

代码如下……


去查了下:
ruby 1.7 特性: 若调用了未定义的方法时,就会引发该异常.

self.bar
=> -:1: undefined method `bar' for #<Object:0x401a6c40> (NoMethodError)
但对我==天书

我一度以为:因为@hit是个默认的定值无法这样直接计算……但换成attacter.pdef,也会报错,我就没搞明白为什么了……
再次请求帮助……在下实在是愚钝……喂到嘴边都吞不下……5555

PS:如果将if...end换成case...end
RUBY 代码复制
  1. case weapon != nil && weapon.element_set.include?(i)
  2.      when 8  
  3.           #效果
  4.      when 9
  5.           #效果
  6. end

这样写是否可以达到增添多个武器属性的目的呢?

感谢@cinderelmini的指点
作者: RyanBern    时间: 2016-1-14 01:10
本帖最后由 RyanBern 于 2016-1-14 09:45 编辑
阿竹天 发表于 2016-1-14 00:56
Game_battle 3 55 行 发生了NoMethoderror错误,undefined method 'hit'=for #

代码如下……


attacker的hit属性只能读取但是不能赋值的,所以写成attacker.hit=XXX是不对的。另外,楼主这样写是无法达到效果的,因为你把命中率修正写在了命中判定的后面,所以这样做是没有效果的。
解决的办法有两种。
第一种是写成
RUBY 代码复制
  1. hit_rate = 100 + (attacker.str + attacker.dex) / 2

之后所有的判定命中与否用hit变量即可,这个地方放在attack_effect的# 第一命中判定 之前即可。
第二种方法是直接在Game_Actor中定义hit,由于Game_Actor里面已经继承了Game_Battler的hit方法,此处实际上是覆盖了原有的方法。如果采用这种办法,需要将武器的判定也改到hit的定义中去,这样就无需在attack_effect里面再次定义。由于是在Game_Actor下定义,所以不需要判定攻击方是否为Game_Actor。
因此可以在Game_Actor中追加定义如下:
RUBY 代码复制
  1. def hit
  2.   n = 100
  3.   # 获取武器,这里注意@weapon_id就是当前对象的武器ID
  4.   weapon = $data_weapons[@weapon_id]
  5.   # 如果武器持有 8 号属性
  6.   if weapon != nil && weapon.element_set.include?(8)
  7.     # 修改命中率
  8.     n += (self.str + self.dex) / 2
  9.   end
  10.   # 计算状态对命中率的影响
  11.   for i in @states
  12.     n *= $data_states[i].hit_rate / 100.0
  13.   end
  14.   return Integer(n)
  15. end





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