Project1
标题:
请教给所有敌人增加个在全游戏中都可调用的新属性的方法
[打印本页]
作者:
taeckle
时间:
2021-12-3 23:17
标题:
请教给所有敌人增加个在全游戏中都可调用的新属性的方法
本帖最后由 taeckle 于 2021-12-5 14:21 编辑
我想在我的工程中给所有敌人都增加一个新属性:经验值(exp_self), 类似于在数据库中给角色设置的经验值, 设置好以后最好
能像调用角色的各种属性那样
(比如调用1号角色当前的力量值是$game_Actors[1].str), 也用个比如
$game_Enemies[当前敌人的id].exp_self
就可以调用了,
请问有可能把这个新属性做出来嘛?如果有的话,具体思路是神马呢?
还请大家指点指点,多谢了!
作者:
enghao_lim
时间:
2021-12-4 15:24
添加一个新属性不难,只要对脚本学习到一定的程度就知道game_enemy和game_actor都继承于game_battler,所以实现起来根本不难。反而是楼主我建议你先习惯逻辑思维,比如说你要实现EXP,可是你说的属性却是根据等级在变化而不是EXP。我可以给出具体参考思路,但是修改楼主就自行研究:
1. 新增一个EXP属性和等级vsEXP的hash表来做升级判断
2. 新增等级
3. 把想要的其他属性和等级挂钩
PS:以上三个在Game_Actor里都有定义。
会出现的问题:敌人只会在战斗中被生成,如果生成的是不赋予等级的参数那新增等级无用,所以贯穿这个的核心就是为什么要给敌人EXP,给了之后要怎么利用,要实现这个需要怎么修改。
作者:
soulsaga
时间:
2021-12-6 22:01
楼主想用新属性做什么用?
作者:
rfvtgbzxc
时间:
2021-12-7 17:36
本帖最后由 rfvtgbzxc 于 2021-12-7 17:59 编辑
是数据拓展类问题吧?论坛里面好像已经有很多解决方案了,这里贴一个自己在用的:
部分一:
module Data_Extend
Version = 1.2
def self.update_data_all
# update_data_system
update_data_actor
# update_data_class
update_data_skill
# update_data_armor
end
end
复制代码
部分二:
=begin
添加属性:
maxhp_plus 最大生命值:使防具可以提供最大生命值
maxsp_plus 最大法力值:使防具可以提供最大法力值
sp_recover 回蓝量:开场角色恢复的蓝量
=end
module RPG
class Armor
attr_accessor :maxhp_plus
attr_accessor :maxsp_plus
attr_accessor :sp_recover
end
end
module Data_Extend
Armor_Maxhp_plus = {
}
Armor_Maxsp_plus = {
#水蓝之石
445=>120,
}
Armor_SP_recover = {
#海之奥秘
446=>40
}
def self.update_data_armor
for i in 1..$data_armors.size
armor = $data_armors[i]
next if armor.nil?
armor.maxhp_plus = Armor_Maxhp_plus.include?(i) ? Armor_Maxhp_plus[i] : 0
armor.maxsp_plus = Armor_Maxsp_plus.include?(i) ? Armor_Maxsp_plus[i] : 0
armor.sp_recover = Armor_SP_recover.include?(i) ? Armor_SP_recover[i] : 0
end
end
end
复制代码
部分三 Scene_Tilte:
# 载入数据库
$data_actors = load_data("Data/Actors.rxdata")
$data_classes = load_data("Data/Classes.rxdata")
$data_skills = load_data("Data/Skills.rxdata")
$data_items = load_data("Data/Items.rxdata")
$data_weapons = load_data("Data/Weapons.rxdata")
$data_armors = load_data("Data/Armors.rxdata")
$data_enemies = load_data("Data/Enemies.rxdata")
$data_troops = load_data("Data/Troops.rxdata")
$data_states = load_data("Data/States.rxdata")
$data_animations = load_data("Data/Animations.rxdata")
$data_tilesets = load_data("Data/Tilesets.rxdata")
$data_common_events = load_data("Data/CommonEvents.rxdata")
$data_system = load_data("Data/System.rxdata")
$data_mapnames = load_data("Data/MapInfos.rxdata")
$game_system = Game_System.new
# 刚刚的内容,加在这里
Data_Extend.update_data_all
复制代码
话说游戏内属性和数据库属性其实是有一些差异的……这一点你要区分好。比如战斗者的damage属性就是游戏内属性,一个参与计算用的变量;而角色的名称name则是数据库属性,提供给游戏随时访问的。
游戏内属性在$game_xxx里生成,数据库属性通过$data_xxxx访问。
你提到的exp_self,在理解里更偏向于数据库属性,即一早就设好了的。不论如何,第二段脚本应该可以满足你的需求。
对于游戏内属性,一般还需要一个renew_self函数,这是为了让你在用拓展数据后的游戏读旧存档时,可以把那些数据附上去以免bug,这部分需要你自己在存读档进行设计。
=begin
这里只是提供了修改的索引,说明了大致的修改内容,具体修改已经深入了每个部分,
需要以此为依据查找。
添加属性:
skill_mastery 技能熟练度:使用技能会提高熟练度,部分技能熟练度达到后会习得新技能。
trait_points 特质点数:保存了角色的加点
mp_reward xp奖励:战斗中达成某些条件后,给予的额外xp
=end
#--------------------------------------------------------------------------
# Data重定义,当访问$data_actor时可以获取这些参数
# Data处的内容可永久保存,游戏封包后作为数据写入actors.rxdata中
#--------------------------------------------------------------------------
module RPG
class Actor
end
end
#--------------------------------------------------------------------------
# Game重定义,游戏中实际访问$game_actors,因此在此处额外定义
# Game处的内容在运行时生效,数据被硬编码在脚本中
#--------------------------------------------------------------------------
class Game_Actor < Game_Battler
attr_accessor :skill_mastery
attr_accessor :mp_reward
attr_accessor :trait_points
alias setup_vin_actor setup
def setup(actor_id)
@skill_mastery = []
@mp_reward = 0
@trait_points = {}
$data_classes[$data_actors[actor_id].class_id].traits.each do |trait|
@trait_points[trait] = 0
end
setup_vin_actor(actor_id)
end
def renew_self
@name = @name.force_encoding("UTF-8")
@character_name = @character_name.force_encoding("UTF-8")
@battler_name = @battler_name.force_encoding("UTF-8")
@skill_mastery = [] if @skill_mastery.nil?
@mp_reward = 0 if @mp_reward.nil?
if @trait_points.nil?
@trait_points = {}
$data_classes[@class_id].traits.each do |trait|
@trait_points[trait] = 0
end
else
$data_classes[@class_id].traits.each do |trait|
@trait_points[trait] = 0 if @trait_points[trait].nil?
end
end
end
def reset_points
count = 0
@trait_points.each do |k, v|
count += v
@trait_points[k] = 0
end
$game_variables[self.id + LEVEL_UP_VARIABLE] += count
self.hp = [self.maxhp, self.hp].min
self.sp = [self.maxsp, self.sp].min
end
end
#--------------------------------------------------------------------------
# 数据更新,该部分落实补充$data_actors的数据
#--------------------------------------------------------------------------
module Data_Extend
def self.update_data_actor
end
end
复制代码
这个就没有写update_data_actor,因为角色的技能熟练度记录是在游戏运行过程中逐渐更新的。而技能本身的熟练度,用来指示练多少次升级,则还要在$data_skills里面再写一次。
存档时多存一个版本号信息,如果存档版本号比脚本版本号旧,就在读完档以后对每个使用了额外的游戏内属性的对象调用一次renew_self。这部分还请自行操作。
总之思路就是:
1.分清楚属性是游戏内不断更新的,还是在数据库里定好的。
2.对于会更新的游戏内数据,在Game_XXX里重写初始化;
3.对于数据库里定好的,先打开RPG模块里的对应数据结构,声明新的变量,再在基础数据库load完成后,再用你要设置的新数据数据去update对应的数据对象($data_actors/$data_skills/$data_enemies…)
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1