Project1
标题: 关于等级与经验的问题 [打印本页]
作者: qw707869242 时间: 2013-1-29 14:47
标题: 关于等级与经验的问题
怎么让等级越高获得的经验越少?比如:角色1级打一只史莱姆 经验1000,角色2级打一只史莱姆900经验?
作者: Sion 时间: 2013-1-29 17:39
升第2级跟升第3级的经验本来就不一样,通过参数的设置很容易做到打低等级怪升级很慢。你这样设置不觉得有些画蛇添足?
作者: 判约之轮 时间: 2013-1-29 18:21
Game_Troop脚本页中的这段:
#--------------------------------------------------------------------------
# ● 计算经验值的总数
#--------------------------------------------------------------------------
def exp_total
dead_members.inject(0) {|r, enemy| r += enemy.exp }
end
#--------------------------------------------------------------------------
# ● 计算经验值的总数
#--------------------------------------------------------------------------
def exp_total
dead_members.inject(0) {|r, enemy| r += enemy.exp }
end
而代表着双方角色等级的变量是:
当前所遇敌群的编号变量是:
那么再来看看Ruby中inject函数的用法:
[2,4,6,8].inject(0) { |sum,element| sum + element } 输出结果:20
[2,4,6,8].inject(1) { |product,element| product * element } 输出结果:384
当inject有参数时,inject后面的block第一次执行时,sum或product的值被设置为参数的值,而element的值被设置为集合中第一个元素的值。接下来每次再执行block时,sum或product的值被设置为上次调用block时的返回值,element即为集合中下一个元素的值。inject的最终结果是最后一次调用block的返回值。
[2,4,6,8].inject(0) { |sum,element| sum + element } 输出结果:20
[2,4,6,8].inject(1) { |product,element| product * element } 输出结果:384
当inject有参数时,inject后面的block第一次执行时,sum或product的值被设置为参数的值,而element的值被设置为集合中第一个元素的值。接下来每次再执行block时,sum或product的值被设置为上次调用block时的返回值,element即为集合中下一个元素的值。inject的最终结果是最后一次调用block的返回值。
简而言之,就是 r 是一个储存经验值的临时变量,而 enemy 就是组成 dead_members 这个复合数组的结构单元,其作用就是把 dead_members 中所有 enemy 对象中的 exp 属性叠加求和。
之后又涉及了一个脚本的基础用法:
def exp_effect
i = 0
until i >= n do
if @troop_id == m
return $game_actors[x] / 10 + 4
end
end
end
def exp_effect
i = 0
until i >= n do
if @troop_id == m
return $game_actors[x] / 10 + 4
end
end
end
之后的部分明白就是明白,不明白我也没办法了……
修改函数在脚本技术里可是基础= =
作者: qw707869242 时间: 2013-1-30 10:52
判约之轮 发表于 2013-1-29 18:21
Game_Troop脚本页中的这段:
#---------------------------------------------------------------------- ...
其实吧。。。我有点不懂,教教我吧!
作者: 判约之轮 时间: 2013-1-30 12:12
qw707869242 发表于 2013-1-30 10:52
其实吧。。。我有点不懂,教教我吧!
虽然很想照着原先的思路走……但似乎已经找到了一个更容易说明的方法,顺着这个思路走就好:
1.你想要修改的是胜利之后获得的经验值,所以搜索关键字“胜利”
2.胜利后的处理更加符合情况,所以定位目标
3.其中找到关于经验值变化的函数 gain_exp,然后继续搜索
4.那么经验值增加原理一目了然,也就是对于每个 actor 对象,都执行 actor.gain_exp(exp)函数
5.那么继续定位到第三步中的另一个函数,是否在上一步看到了呢?
6.然后再搜索第五步函数中用到的 change_exp,意外惊喜呢,找到了直接存储着等级信息的 @level 变量
7.综合以上所搜索到的信息来看,要想更改经验值获得,只能修改第五步中所找到的函数
#--------------------------------------------------------------------------
# ● 获得经验值(判断经验获取加成)
#--------------------------------------------------------------------------
def gain_exp(exp)
change_exp(self.exp + (exp * final_exp_rate).to_i, true)
end
#--------------------------------------------------------------------------
# ● 获得经验值(判断经验获取加成)
#--------------------------------------------------------------------------
def gain_exp(exp)
change_exp(self.exp + (exp * final_exp_rate).to_i, true)
end
那么分析过程就这么完成了
获得经验值的公式是 exp + (exp * final_exp_rate).to_i (注:n.to_i 是向下取整,比如n = 3.7,那么n.to_i = 3 )
如果希望获得经验和等级相关联,可以利用@level来获取当前所计算角色的等级
而如果公式太复杂,你也可以额外定义一个变量型函数,就像这样:
def self.temp
@level / 123
end
def self.temp
@level / 123
end
当你的计算公式只是很简单的算式的时候,这个函数可用
当你的计算式涉及到各种复合变量、数组、函数,建议参照传统的函数定义模式,即在函数中定义一个最低级别的临时变量,计算完毕后用"return n"语句返回变量的值
就像这样:
def self.temp
n = @level / 123
return n
end
def self.temp
n = @level / 123
return n
end
最后的工作,就是把这个变量型函数加入到公式中,也就是:
#--------------------------------------------------------------------------
# ● 获得经验值(判断经验获取加成)
#--------------------------------------------------------------------------
def gain_exp(exp)
change_exp(self.exp + (exp * final_exp_rate * temp).to_i, true)
end
#--------------------------------------------------------------------------
# ● 获得经验值(判断经验获取加成)
#--------------------------------------------------------------------------
def gain_exp(exp)
change_exp(self.exp + (exp * final_exp_rate * temp).to_i, true)
end
作者: qw707869242 时间: 2013-1-30 13:06
判约之轮 发表于 2013-1-30 12:12
虽然很想照着原先的思路走……但似乎已经找到了一个更容易说明的方法,顺着这个思路走就好:
1.你想要修 ...
错误了。。。。
作者: qw707869242 时间: 2013-1-30 14:19
好吧!我还是去rmxp去混一段时间吧!
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |