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

Project1

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

[已经解决] 请教战斗开始时先运行战斗事件页(0回合)再跑CP集气条的方法

[复制链接]

Lv3.寻梦者

梦石
0
星屑
4919
在线时间
445 小时
注册时间
2011-3-26
帖子
101
1
发表于 2022-1-1 12:40:34 | 显示全部楼层
本帖最后由 rfvtgbzxc 于 2022-1-2 20:30 编辑

印象里条件设置为回合1+0x就可以在跑进度条的时候触发,但是cp那个时候已经分配完毕了。这个时候可以在事件里加脚本:
  1. $game_party.actors.each do | actor |
  2.   actor.cp = 65535 if actor.state?(xxx)
  3. end
复制代码


Scene_Battle自带一个事件解释器,执行事件使用如下指令:
RUBY 代码复制
  1. # 装载事件
  2. common_event = $data_common_events[event_id]
  3. $game_system.battle_interpreter.setup(common_event.list, event_id)
  4. # 立刻执行事件
  5. $game_system.battle_interpreter.update


如果你不在setup以后立刻update的话,系统会在随后的进度里update,不过那个时候是在战斗中cp初始化完成以后。

这怎么会抢先一步呢,你也抢在执行面前不就好了。
RUBY 代码复制
  1. #========================================================================
  2. # □ Scene_Battle_CP
  3. #========================================================================
  4. class Scene_Battle_CP
  5.   #----------------------------------------------------------------------
  6.   # ○ 公開インスタンス変数
  7.   #----------------------------------------------------------------------
  8.   attr_accessor :stop # CP加算ストップ
  9.   #----------------------------------------------------------------------
  10.   # ○ オブジェクトの初期化
  11.   #----------------------------------------------------------------------
  12.   def initialize  
  13.     @battlers = []
  14.     @cancel = false
  15.     @stop = false
  16.     @str_total = 0
  17.     @dex_total = 0   
  18.     @agi_total = 0
  19.     @int_total = 0   
  20.     # 配列 count_battlers を初期化
  21.     count_battlers = []
  22.     # 将enemy添加到数组count_battlers
  23.     for enemy in $game_troop.enemies
  24.       count_battlers.push(enemy)
  25.     end
  26.     # 将actor添加到数组count_battlers
  27.     for actor in $game_party.actors
  28.       count_battlers.push(actor)
  29.     end
  30.     for battler in count_battlers
  31.       @str_total = [@str_total,battler.str].max      
  32.       @dex_total = [@dex_total,battler.dex].max
  33.       @agi_total = [@agi_total,battler.agi].max
  34.       @int_total = [@int_total,battler.int].max      
  35.     end
  36.  
  37.  
  38.  
  39.  
  40.     # 装载事件
  41.     common_event = $data_common_events[event_id]
  42.     $game_system.battle_interpreter.setup(common_event.list, event_id)
  43.     # 立刻执行事件
  44.     $game_system.battle_interpreter.update
  45.  
  46.  
  47.  
  48.  
  49.  
  50.     for battler in count_battlers
  51.       battler.cp = 0        
  52.     end   
  53.     for battler in $game_party.actors   #         
  54.      if battler.state?(100)
  55.        battler.cp+=65535
  56.        battler.xp2_damage="我先出手!"
  57.        battler.xp2_damage_pop=true
  58.      end
  59.     end
  60.     #下面就是困扰我很久的bug,只有先运行数据库队伍战斗事件触发条件为0回合的事件页然后再开始跑CP集气条的话才能解决这个bug   
  61.     for battler in $game_troop.enemies  
  62.      if battler.state?(100)
  63.        battler.cp+=65535
  64.        battler.xp2_damage="我先出手! "
  65.        battler.xp2_damage_pop=true
  66.      end
  67.     end        
  68.   end
  69.   #----------------------------------------------------------------------
  70.   # ○ CP计数
  71.   #----------------------------------------------------------------------
  72.   def update
  73.     # 如果停止就返回
  74.     return if @stop
  75.     for battler in $game_party.actors + $game_troop.enemies
  76.       # 如果行动不能忽视
  77.       if battler.dead? == true
  78.         battler.cp = 0
  79.         next
  80.       end
  81.       cp_a=0.6
  82.       cp_b=0.4
  83.       cp_c=0.3
  84.       cp_d=0.08     
  85.       battler.cp = [[battler.cp + BATTLE_SPEED * 4000 * (cp_a*battler.agi+cp_b*battler.dex+cp_c*battler.int+cp_d*battler.str) /(0.6*@agi_total+0.4*@dex_total+0.3*@int_total+0.08*@str_total), 0].max, 65535].min
  86.     end
  87.   end
  88.   #----------------------------------------------------------------------
  89.   # ○ 开始CP计数
  90.   #----------------------------------------------------------------------
  91.   def stop
  92.     @cancel = true
  93.     if @cp_thread != nil then
  94.       @cp_thread.join
  95.       @cp_thread = nil
  96.     end
  97.   end
  98. end

点评

wwwwww~  发表于 2022-1-2 20:48
我知道问题在哪了,我那个 # 立刻执行事件$game_system.battle_interpreter.update没有写出来...  发表于 2022-1-2 20:41
只要涉及到battle_interpreter.setup的都会被那个CP集气Scene_Battle_CP.new抢前一步,我待会来新建个工程在详细描述一下  发表于 2022-1-2 20:04
本层更新的内容能帮上忙吗?加在initialize里。  发表于 2022-1-2 19:53
不是不论什么时候,就战斗开始的第一下,简称先手,目前我方actor已经有这个效果了,就是敌方enemy有这个状态时没有这个效果..  发表于 2022-1-2 19:46

评分

参与人数 1星屑 +300 +1 收起 理由
RyanBern + 300 + 1 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4919
在线时间
445 小时
注册时间
2011-3-26
帖子
101
2
发表于 2022-1-2 21:28:06 | 显示全部楼层
本帖最后由 rfvtgbzxc 于 2022-1-3 18:08 编辑
taeckle 发表于 2022-1-2 20:57
大神你在看我下面我自己想出来的解决方案:
①先在Class Scene_Battle 的 def main里面设置两个开关:
     ...


你这样每场战斗都要加$game_switches[1] = true了。
这实际上不是时序问题,更像是初始化行为的不完善。可以考虑用之前提到的数据拓展脚本,给enemy一个数据库属性“initial_states”或者"offensive"(先手),设定好开局状态属性或者先手属性以后在代码里处理。
如果要给特定的少量战斗添加敌方先手,可以事件里直接把敌人cp条加满。
RUBY 代码复制
  1. =begin
  2. 添加属性:
  3.   initial_states:刚开局,怪物身上就有的状态
  4. =end
  5. module RPG
  6.   class Enemy
  7.     attr_accessor :initial_states
  8.   end
  9. end
  10. #--------------------------------------------------------------------------
  11. # 数据更新,该部分落实补充$data_enemies的数据
  12. #--------------------------------------------------------------------------                                            
  13. module Data_Extend
  14.   # 初始状态
  15.   # enemy_id => [...states]                                                      
  16.   Enemy_initial_states = {
  17.    # 小恶魔, [强力]
  18.    13 => [13]
  19.   }
  20.   def self.update_data_enemy
  21.     for i in 1..$data_enemies.size
  22.       enemy = $data_enemies[i]
  23.       next if enemy.nil?
  24.       enemy.initial_states = Enemy_initial_states.include?(i) ? Enemy_initial_states[i] : []
  25.     end
  26.   end
  27. end
  28.  
  29.  
  30. # 开战后,再一个个上状态
  31. $game_troop.enemies.each do |enemy|
  32.   enemy.initial_states.each do |state_id|
  33.     enemy.add_state(state_id)
  34.   end
  35. end
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4919
在线时间
445 小时
注册时间
2011-3-26
帖子
101
3
发表于 2022-1-4 12:11:19 | 显示全部楼层
taeckle 发表于 2022-1-4 08:56
大神你看这是我在rpg maker xp默认脚本基础上按照你在6楼给我的脚本自己写的, 具体步骤为:
①把从第13行m ...

1.Game_Enemy不需要initial_states属性,因为在游戏过程中这个值不会更新,是数据库属性,只有RPG::Enemy有这个属性,通过$data_enemies.initial_states访问。
2.初始化部分,我没考虑对……不应该用self,应该用enemy。
RUBY 代码复制
  1. #==============================================================================
  2. # ■ Game_Enemy
  3. #------------------------------------------------------------------------------
  4. #  处理敌人的类。本类在 Game_Troop 类 ($game_troop) 的
  5. # 内部使用。
  6. #==============================================================================
  7.  
  8. class Game_Enemy < Game_Battler
  9.   #--------------------------------------------------------------------------
  10.   # ● 初始化对像
  11.   #     troop_id     : 循环 ID
  12.   #     member_index : 循环成员的索引
  13.   #--------------------------------------------------------------------------
  14.   def initialize(troop_id, member_index)
  15.     super()
  16.     @troop_id = troop_id
  17.     @member_index = member_index
  18.     troop = $data_troops[@troop_id]
  19.     @enemy_id = troop.members[@member_index].enemy_id
  20.     enemy = $data_enemies[@enemy_id]
  21.     @battler_name = enemy.battler_name
  22.     @battler_hue = enemy.battler_hue
  23.     @hp = maxhp
  24.     @sp = maxsp
  25.     @hidden = troop.members[@member_index].hidden
  26.     @immortal = troop.members[@member_index].immortal
  27.  
  28.  
  29.     enemy.initial_states.each do |state_id|
  30.             self.add_state(state_id)
  31.     end
  32.  
  33.   end
  34. end

3.补充的数据没有被载入数据库,在Scene_Title加:
RUBY 代码复制
  1. # 战斗测试的情况下
  2.     if $BTEST
  3.       battle_test
  4.       return
  5.     end
  6.     # 载入数据库
  7.     $data_actors        = load_data("Data/Actors.rxdata")
  8.     $data_classes       = load_data("Data/Classes.rxdata")
  9.     $data_skills        = load_data("Data/Skills.rxdata")
  10.     $data_items         = load_data("Data/Items.rxdata")
  11.     $data_weapons       = load_data("Data/Weapons.rxdata")
  12.     $data_armors        = load_data("Data/Armors.rxdata")
  13.     $data_enemies       = load_data("Data/Enemies.rxdata")
  14.     $data_troops        = load_data("Data/Troops.rxdata")
  15.     $data_states        = load_data("Data/States.rxdata")
  16.     $data_animations    = load_data("Data/Animations.rxdata")
  17.     $data_tilesets      = load_data("Data/Tilesets.rxdata")
  18.     $data_common_events = load_data("Data/CommonEvents.rxdata")
  19.     $data_system        = load_data("Data/System.rxdata")
  20.  
  21.  
  22.  
  23.     # 数据补充
  24.     Data_Extend.update_data_enemy
  25.  
  26.  
  27.  
  28.  
  29.     # 生成系统对像
  30.     $game_system = Game_System.new

在战斗测试部分,还需要加:
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 战斗测试
  3.   #--------------------------------------------------------------------------
  4.   def battle_test
  5.     # 载入数据库 (战斗测试用)
  6.     $data_actors        = load_data("Data/BT_Actors.rxdata")
  7.     $data_classes       = load_data("Data/BT_Classes.rxdata")
  8.     $data_skills        = load_data("Data/BT_Skills.rxdata")
  9.     $data_items         = load_data("Data/BT_Items.rxdata")
  10.     $data_weapons       = load_data("Data/BT_Weapons.rxdata")
  11.     $data_armors        = load_data("Data/BT_Armors.rxdata")
  12.     $data_enemies       = load_data("Data/BT_Enemies.rxdata")
  13.     $data_troops        = load_data("Data/BT_Troops.rxdata")
  14.     $data_states        = load_data("Data/BT_States.rxdata")
  15.     $data_animations    = load_data("Data/BT_Animations.rxdata")
  16.     $data_tilesets      = load_data("Data/BT_Tilesets.rxdata")
  17.     $data_common_events = load_data("Data/BT_CommonEvents.rxdata")
  18.     $data_system        = load_data("Data/BT_System.rxdata")
  19.  
  20.     # 数据补充
  21.     Data_Extend.update_data_enemy
  22.  
  23.  
  24.     # ...其他代码...


   

评分

参与人数 1+1 收起 理由
taeckle + 1 大神威武!我们要申请精华帖!.

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-18 02:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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