设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2267|回复: 3
打印 上一主题 下一主题

[已经解决] 请教给所有敌人增加个在全游戏中都可调用的新属性的方法

[复制链接]

Lv4.逐梦者

梦石
0
星屑
9163
在线时间
466 小时
注册时间
2015-5-8
帖子
866
跳转到指定楼层
1
发表于 2021-12-3 23:17:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 taeckle 于 2021-12-5 14:21 编辑

我想在我的工程中给所有敌人都增加一个新属性:经验值(exp_self), 类似于在数据库中给角色设置的经验值, 设置好以后最好能像调用角色的各种属性那样(比如调用1号角色当前的力量值是$game_Actors[1].str), 也用个比如$game_Enemies[当前敌人的id].exp_self就可以调用了,

请问有可能把这个新属性做出来嘛?如果有的话,具体思路是神马呢?

还请大家指点指点,多谢了!

Lv4.逐梦者

梦石
0
星屑
7981
在线时间
1183 小时
注册时间
2007-7-29
帖子
2055
2
发表于 2021-12-4 15:24:42 | 只看该作者
添加一个新属性不难,只要对脚本学习到一定的程度就知道game_enemy和game_actor都继承于game_battler,所以实现起来根本不难。反而是楼主我建议你先习惯逻辑思维,比如说你要实现EXP,可是你说的属性却是根据等级在变化而不是EXP。我可以给出具体参考思路,但是修改楼主就自行研究:

1. 新增一个EXP属性和等级vsEXP的hash表来做升级判断
2. 新增等级
3. 把想要的其他属性和等级挂钩
PS:以上三个在Game_Actor里都有定义。

会出现的问题:敌人只会在战斗中被生成,如果生成的是不赋予等级的参数那新增等级无用,所以贯穿这个的核心就是为什么要给敌人EXP,给了之后要怎么利用,要实现这个需要怎么修改。

评分

参与人数 1+1 收起 理由
taeckle + 1 精品文章

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
36442
在线时间
10800 小时
注册时间
2009-3-15
帖子
4814
3
发表于 2021-12-6 22:01:46 | 只看该作者
楼主想用新属性做什么用?
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4194
在线时间
504 小时
注册时间
2011-3-26
帖子
110
4
发表于 2021-12-7 17:36:56 | 只看该作者
本帖最后由 rfvtgbzxc 于 2021-12-7 17:59 编辑

是数据拓展类问题吧?论坛里面好像已经有很多解决方案了,这里贴一个自己在用的:
部分一:
  1. module Data_Extend
  2.   Version = 1.2
  3.   def self.update_data_all
  4.    # update_data_system
  5.     update_data_actor
  6.    # update_data_class
  7.     update_data_skill
  8.    # update_data_armor
  9.   end
  10. end
复制代码

部分二:
  1. =begin
  2. 添加属性:
  3.   maxhp_plus 最大生命值:使防具可以提供最大生命值
  4.   maxsp_plus 最大法力值:使防具可以提供最大法力值
  5.   sp_recover 回蓝量:开场角色恢复的蓝量
  6. =end
  7. module RPG
  8.   class Armor
  9.     attr_accessor :maxhp_plus
  10.     attr_accessor :maxsp_plus
  11.     attr_accessor :sp_recover
  12.   end
  13. end

  14. module Data_Extend
  15.   Armor_Maxhp_plus = {
  16.   }
  17.   Armor_Maxsp_plus = {
  18.   #水蓝之石
  19.   445=>120,
  20.   }
  21.   Armor_SP_recover = {
  22.   #海之奥秘
  23.   446=>40
  24.   }
  25.   def self.update_data_armor
  26.     for i in 1..$data_armors.size
  27.       armor = $data_armors[i]
  28.       next if armor.nil?
  29.       armor.maxhp_plus = Armor_Maxhp_plus.include?(i) ? Armor_Maxhp_plus[i] : 0
  30.       armor.maxsp_plus = Armor_Maxsp_plus.include?(i) ? Armor_Maxsp_plus[i] : 0
  31.       armor.sp_recover = Armor_SP_recover.include?(i) ? Armor_SP_recover[i] : 0
  32.     end
  33.   end
  34. end

复制代码

部分三 Scene_Tilte:
  1. # 载入数据库
  2.     $data_actors        = load_data("Data/Actors.rxdata")
  3.     $data_classes       = load_data("Data/Classes.rxdata")
  4.     $data_skills        = load_data("Data/Skills.rxdata")
  5.     $data_items         = load_data("Data/Items.rxdata")
  6.     $data_weapons       = load_data("Data/Weapons.rxdata")
  7.     $data_armors        = load_data("Data/Armors.rxdata")
  8.     $data_enemies       = load_data("Data/Enemies.rxdata")
  9.     $data_troops        = load_data("Data/Troops.rxdata")
  10.     $data_states        = load_data("Data/States.rxdata")
  11.     $data_animations    = load_data("Data/Animations.rxdata")
  12.     $data_tilesets      = load_data("Data/Tilesets.rxdata")
  13.     $data_common_events = load_data("Data/CommonEvents.rxdata")
  14.     $data_system        = load_data("Data/System.rxdata")
  15.     $data_mapnames      = load_data("Data/MapInfos.rxdata")
  16.     $game_system        = Game_System.new
  17.    # 刚刚的内容,加在这里
  18.     Data_Extend.update_data_all
复制代码

话说游戏内属性和数据库属性其实是有一些差异的……这一点你要区分好。比如战斗者的damage属性就是游戏内属性,一个参与计算用的变量;而角色的名称name则是数据库属性,提供给游戏随时访问的。
游戏内属性在$game_xxx里生成,数据库属性通过$data_xxxx访问。
你提到的exp_self,在理解里更偏向于数据库属性,即一早就设好了的。不论如何,第二段脚本应该可以满足你的需求。

对于游戏内属性,一般还需要一个renew_self函数,这是为了让你在用拓展数据后的游戏读旧存档时,可以把那些数据附上去以免bug,这部分需要你自己在存读档进行设计。

  1. =begin
  2. 这里只是提供了修改的索引,说明了大致的修改内容,具体修改已经深入了每个部分,
  3. 需要以此为依据查找。

  4. 添加属性:
  5.   skill_mastery 技能熟练度:使用技能会提高熟练度,部分技能熟练度达到后会习得新技能。
  6.   trait_points 特质点数:保存了角色的加点
  7.   mp_reward xp奖励:战斗中达成某些条件后,给予的额外xp
  8. =end

  9. #--------------------------------------------------------------------------
  10. # Data重定义,当访问$data_actor时可以获取这些参数
  11. # Data处的内容可永久保存,游戏封包后作为数据写入actors.rxdata中
  12. #--------------------------------------------------------------------------
  13. module RPG
  14.   class Actor
  15.   end
  16. end

  17. #--------------------------------------------------------------------------
  18. # Game重定义,游戏中实际访问$game_actors,因此在此处额外定义
  19. # Game处的内容在运行时生效,数据被硬编码在脚本中
  20. #--------------------------------------------------------------------------
  21. class Game_Actor < Game_Battler
  22.   attr_accessor :skill_mastery
  23.   attr_accessor :mp_reward
  24.   attr_accessor :trait_points
  25.   alias setup_vin_actor setup
  26.   def setup(actor_id)
  27.     @skill_mastery = []
  28.     @mp_reward = 0
  29.     @trait_points = {}
  30.     $data_classes[$data_actors[actor_id].class_id].traits.each do |trait|
  31.       @trait_points[trait] = 0
  32.     end
  33.     setup_vin_actor(actor_id)
  34.   end
  35.   def renew_self
  36.     @name = @name.force_encoding("UTF-8")
  37.     @character_name = @character_name.force_encoding("UTF-8")
  38.     @battler_name = @battler_name.force_encoding("UTF-8")
  39.     @skill_mastery = [] if @skill_mastery.nil?
  40.     @mp_reward = 0 if @mp_reward.nil?
  41.     if @trait_points.nil?
  42.       @trait_points = {}
  43.       $data_classes[@class_id].traits.each do |trait|
  44.         @trait_points[trait] = 0
  45.       end
  46.     else
  47.       $data_classes[@class_id].traits.each do |trait|
  48.         @trait_points[trait] = 0 if @trait_points[trait].nil?
  49.       end
  50.     end
  51.   end
  52.   def reset_points
  53.     count = 0
  54.     @trait_points.each do |k, v|
  55.       count += v
  56.       @trait_points[k] = 0
  57.     end
  58.     $game_variables[self.id + LEVEL_UP_VARIABLE] += count
  59.     self.hp = [self.maxhp, self.hp].min
  60.     self.sp = [self.maxsp, self.sp].min
  61.   end
  62. end

  63. #--------------------------------------------------------------------------
  64. # 数据更新,该部分落实补充$data_actors的数据
  65. #--------------------------------------------------------------------------
  66. module Data_Extend
  67.   def self.update_data_actor
  68.   end
  69. end

复制代码

这个就没有写update_data_actor,因为角色的技能熟练度记录是在游戏运行过程中逐渐更新的。而技能本身的熟练度,用来指示练多少次升级,则还要在$data_skills里面再写一次。
存档时多存一个版本号信息,如果存档版本号比脚本版本号旧,就在读完档以后对每个使用了额外的游戏内属性的对象调用一次renew_self。这部分还请自行操作。

总之思路就是:
1.分清楚属性是游戏内不断更新的,还是在数据库里定好的。
2.对于会更新的游戏内数据,在Game_XXX里重写初始化;
3.对于数据库里定好的,先打开RPG模块里的对应数据结构,声明新的变量,再在基础数据库load完成后,再用你要设置的新数据数据去update对应的数据对象($data_actors/$data_skills/$data_enemies…)

评分

参与人数 2星屑 +100 +2 收起 理由
taeckle + 1 大神威武!多谢了!
RyanBern + 100 + 1 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-25 11:40

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表