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

Project1

 找回密码
 注册会员
搜索
查看: 2005|回复: 4

[已经解决] 【已解决】为什么技能暗转后MOG的Scope_EX动画会播放多个?

[复制链接]

Lv2.观梦者

梦石
0
星屑
832
在线时间
188 小时
注册时间
2019-4-11
帖子
56
发表于 2021-2-15 19:17:45 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 sxjkjly8010 于 2021-2-16 00:28 编辑

RUBY 代码复制
  1. =begin
  2.       RGSS3
  3.       
  4.    ★ スキル発動時バトルバック暗転 ★
  5.  
  6.       スキル発動時に、バトルバックを暗く変化させることで、雰囲気アップ。
  7.       
  8.       ● 使い方 ●========================================================
  9.       スキルのメモ欄に「背景暗転」という文字列を含ませてください。
  10.       ====================================================================
  11.       
  12.       ver1.00
  13.       
  14.       Last Update : 2015/04/30
  15.       4/30 : RGSS2にあったものを移植
  16.       
  17.       ろかん   [url]http://kaisou-ryouiki.sakura.ne.jp/[/url]
  18. =end
  19.  
  20. #===================================
  21. #  ●設定箇所
  22. #===================================
  23. module Skill_Fade
  24.   # 全てのスキルで背景を暗転させるか
  25.   # (true にした場合メモ欄に設定をしなくてもバトルバックが暗転するようになります)
  26.   ALL_FADE = false
  27. end
  28. #===================================
  29. #  ここまで
  30. #===================================
  31.  
  32. $rsi ||= {}
  33. $rsi["スキル発動時バトルバック暗転"] = true
  34.  
  35. class Game_Action
  36.   #--------------------------------------------------------------------------
  37.   # ● 通常攻撃判定
  38.   #--------------------------------------------------------------------------
  39.   def guard?
  40.     item == $data_skills[subject.guard_skill_id]
  41.   end
  42.   #--------------------------------------------------------------------------
  43.   # ● スキル判定
  44.   #--------------------------------------------------------------------------
  45.   def skill?
  46.     item.is_a?(RPG::Skill) && !attack? && !guard?
  47.   end
  48. end
  49.  
  50. class Game_Battler < Game_BattlerBase
  51.   #--------------------------------------------------------------------------
  52.   # ● インクルード Skill_Fade
  53.   #--------------------------------------------------------------------------
  54.   include Skill_Fade
  55.   #--------------------------------------------------------------------------
  56.   # ● バトルバック暗転スキルを発動しようとしているかどうか
  57.   #--------------------------------------------------------------------------
  58.   def fade_back_skill?
  59.     if ALL_FADE
  60.       current_action.skill?
  61.     else
  62.       current_action.skill? && current_action.item.note.include?("背景暗转")
  63.     end
  64.   end
  65. end
  66.  
  67. class Spriteset_Battle
  68.   SFO_SPEED = 30
  69.   MAX_FADE_OPACITY = SFO_SPEED * 6
  70.   #--------------------------------------------------------------------------
  71.   # ● 公開インスタンス変数
  72.   #--------------------------------------------------------------------------
  73.   attr_accessor   :skill_fade_flag          # スキル暗転フラグ
  74.   #--------------------------------------------------------------------------
  75.   # ● 戦闘背景(床)スプライトの作成
  76.   #--------------------------------------------------------------------------
  77.   alias skill_fade_create_battleback1 create_battleback1
  78.   def create_battleback1
  79.     skill_fade_create_battleback1
  80.     @back1_sprite.color.set(0, 0, 0, 0)
  81.   end
  82.   #--------------------------------------------------------------------------
  83.   # ● 戦闘背景(壁)スプライトの作成
  84.   #--------------------------------------------------------------------------
  85.   alias skill_fade_create_battleback2 create_battleback2
  86.   def create_battleback2
  87.     skill_fade_create_battleback2
  88.     @back2_sprite.color = @back1_sprite.color
  89.   end
  90.   #--------------------------------------------------------------------------
  91.   # ● フレーム更新
  92.   #--------------------------------------------------------------------------
  93.   alias skill_fade_update update
  94.   def update
  95.     skill_fade_update
  96.     update_fade_battleback
  97.   end
  98.   #--------------------------------------------------------------------------
  99.   # ● バトルバックスプライト暗転更新
  100.   #--------------------------------------------------------------------------
  101.   def update_fade_battleback
  102.     if @skill_fade_flag
  103.       unless @back1_sprite.color.alpha == MAX_FADE_OPACITY
  104.         @back1_sprite.color.alpha += SFO_SPEED
  105.         @back2_sprite.color.alpha = @back1_sprite.color.alpha
  106.       end
  107.     else
  108.       @back1_sprite.color.alpha -= SFO_SPEED
  109.       @back2_sprite.color.alpha = @back1_sprite.color.alpha
  110.     end
  111.   end
  112. end
  113.  
  114. class Scene_Battle < Scene_Base
  115.   #--------------------------------------------------------------------------
  116.   # ● アニメーションの表示
  117.   #--------------------------------------------------------------------------
  118.   alias skill_fade_show_animation show_animation
  119.   def show_animation(targets, animation_id)
  120.     if @subject.fade_back_skill?
  121.       @spriteset.skill_fade_flag = true
  122.       wait(40)
  123.     end
  124.     skill_fade_show_animation(targets, animation_id)
  125.   end
  126.   #--------------------------------------------------------------------------
  127.   # ● スキル/アイテムの使用
  128.   #--------------------------------------------------------------------------
  129.   alias skill_fade_use_item use_item
  130.   def use_item
  131.     skill_fade_use_item
  132.     @spriteset.skill_fade_flag = false
  133.   end
  134. end

RUBY 代码复制
  1. #==============================================================================
  2. # +++ MOG - Scope EX (v1.5) +++
  3. #==============================================================================
  4. # By Moghunter
  5. # [url]https://atelierrgss.wordpress.com/[/url]
  6. #==============================================================================
  7. # Adiciona a característica de área de impacto da ação baseado na posição
  8. # e o tamanho do sprite do alvo.
  9. # Por exemplo, uma habilidade de explosão vai acertar apenas os inimigos que
  10. # estiverem em volta do alvo inicial.
  11. # O script adiciona também a função de incluir todos os alvos da tela, aliados
  12. # e inimigos juntos.
  13. #==============================================================================
  14. # Adicione a Tag abaixo na caixa de comentários de notas para definir a área de
  15. # impacto da habilidade.
  16. #
  17. # <Scope Range = X1 - X2 - Y1 - Y2>
  18. #
  19. #            Y1
  20. #            
  21. #       X1        X2
  22. #            
  23. #            Y2
  24. #
  25. # Ex ->      <Scope Range = 100 - 32 - 64 - 32>
  26. #
  27. #==============================================================================
  28. # Incluir todos os alvos da tela. (Inimigos e Aliados)
  29. #==============================================================================
  30. #
  31. # <All Targets>
  32. #
  33. #==============================================================================
  34. # Histórico
  35. #==============================================================================
  36. # v1.5 Correção de ativar o sistema sem fazer comentário na caixa de notas.
  37. # v1.4 Compatibilidade com MOG Sprite Actor.
  38. # v1.3 Melhoria no cálculo de área em alvos únicos.
  39. # v1.2 Melhoria no sistema de calculo baseado no tamanho do sprite.
  40. # v1.1 Possibilidade de definir a área específica para cada lado.
  41. #   
  42. #==============================================================================
  43.  
  44. #首先请把技能的目标设成单个敌人或单个队友或使用者
  45.  
  46. #技能备注里
  47. #<Scope Range = 120 - 120 - 64 - 40>
  48. #目标两侧120像素,向上64像素,向下40像素
  49. #技能对上述范围内的目标生效
  50.  
  51. #<All Targets>
  52. #范围内全部目标,不分敌我
  53. #如果备注里填入
  54. #<All Targets>
  55. #<Scope Range = 544 - 544 - 416 - 416>
  56. #那好吧,这是一个地地道道的全屏范围的技能,当然你的画面尺寸是544*416.
  57.  
  58.  
  59. #精灵尺寸,大概是给怪物图设个尺寸来代替怪物图原本的尺寸
  60. #SPRITE_SIZE_RANGE = [80,70]
  61. #范围类型,大概是0表示用怪物图原本的尺寸,而1是用上面设置的尺寸
  62. #SCOPE_TYPE = 1
  63. #以上两个设定会影响到范围的计算,细微之处不是很确定。
  64.  
  65. $imported = {} if $imported.nil?
  66. $imported[:mog_scope_ex] = true
  67.  
  68. module MOG_SCOPE_EX
  69.   #============================================================================
  70.   # Definição do modo que vai ser calculado a área do alvo.
  71.   #
  72.   # 0 - Baseado apenas na posição X e Y. (ignorando o tamanho do sprite)
  73.   # 1 - Baseado na posição X e Y + o tamanho do sprite do alvo.
  74.   #     (Alvos grandes tem maior area de impacto)
  75.   #
  76.   #============================================================================
  77.   SCOPE_TYPE = 1
  78.   #============================================================================
  79.   # Definição da porcentágem total do tamanho sprite, para ser efetuado o
  80.   # calculo. (Apenas se o valor do SCOPE_TYPE estiver no 1)
  81.   # Por exemplo, definindo o valor de 100% o sistema vai considerar 100% do
  82.   # tamanho do sprite para fazer o calculo.
  83.   #============================================================================
  84.   # SPRITE_SIZE_RANGE = [WIDTH %, HEIGHT %]  
  85.   #============================================================================
  86.   SPRITE_SIZE_RANGE = [80,70]  
  87. end
  88.  
  89. #==============================================================================
  90. # ■ Game Battler
  91. #==============================================================================
  92. class Game_Battler < Game_BattlerBase
  93.   attr_accessor :sprite_size
  94.  
  95.   #--------------------------------------------------------------------------
  96.   # * Initialize
  97.   #--------------------------------------------------------------------------
  98.   alias mog_scope_ex_initialize initialize
  99.   def initialize
  100.       @sprite_size = [0,0,true]
  101.       mog_scope_ex_initialize
  102.   end
  103.  
  104. end
  105.  
  106. #==============================================================================
  107. # ■ Sprite Battler
  108. #==============================================================================
  109. class Sprite_Battler < Sprite_Base
  110.  
  111.   #--------------------------------------------------------------------------
  112.   # * Update Bitmap
  113.   #--------------------------------------------------------------------------
  114.   alias mog_scope_ex_update_bitmap update_bitmap
  115.   def update_bitmap
  116.       @battler.sprite_size = [bitmap.width,bitmap.height,true] if bitmap
  117.       mog_scope_ex_update_bitmap
  118.   end
  119.  
  120. end
  121.  
  122. #==============================================================================
  123. # ■ Scene Battle
  124. #==============================================================================
  125. class Scene_Battle < Scene_Base
  126.  
  127.   #--------------------------------------------------------------------------
  128.   # * Show Normal Animation
  129.   #--------------------------------------------------------------------------
  130.   alias mog_scope_ex_show_normal_animation show_normal_animation
  131.   def show_normal_animation(targets, animation_id, mirror = false)
  132.       new_targets = []
  133.       targets.each do |t| new_targets.push(t) if t.sprite_size[2] end
  134.       targets = new_targets
  135.       mog_scope_ex_show_normal_animation(targets, animation_id, mirror)
  136.       targets.each do |t| t.sprite_size[2] = true end
  137.   end  
  138.  
  139. end
  140.  
  141. #==============================================================================
  142. # ■ Game Action
  143. #==============================================================================
  144. class Game_Action
  145.   include MOG_SCOPE_EX
  146.   #--------------------------------------------------------------------------
  147.   # * Make Targets
  148.   #--------------------------------------------------------------------------
  149.   def make_targets
  150.       if $imported[:mog_battler_motion] != nil and $imported[:mog_sprite_actor] != nil
  151.          return @subject.pre_target if @subject != nil and @subject.pre_target != nil
  152.       end
  153.       if !forcing && subject.confusion?
  154.          confusion_target
  155.       elsif item.for_opponent?
  156.          targets_for_opponents
  157.       elsif item.for_friend?
  158.          targets_for_friends
  159.       else
  160.         []
  161.       end
  162.   end  
  163.  
  164.   #--------------------------------------------------------------------------
  165.   # * Confusion Target
  166.   #--------------------------------------------------------------------------
  167.   def confusion_target
  168.       case subject.confusion_level
  169.       when 1 ; new_targets = make_new_targets([opponents_unit.random_target],0)
  170.       when 2
  171.           if rand(2) == 0
  172.             new_targets = make_new_targets([opponents_unit.random_target],0)
  173.           else
  174.             new_targets = make_new_targets([friends_unit.random_target],1)
  175.           end
  176.       else
  177.            new_targets = make_new_targets([friends_unit.random_target],1)  
  178.       end
  179.   end
  180.  
  181.   #--------------------------------------------------------------------------
  182.   # * Targets for Opponents
  183.   #--------------------------------------------------------------------------
  184.   def targets_for_opponents
  185.       if item.for_random?
  186.          org_target = Array.new(item.number_of_targets) { opponents_unit.random_target }
  187.          new_targets = make_new_targets(org_target,0)
  188.       elsif item.for_one?
  189.          num = 1 + (attack? ? subject.atk_times_add.to_i : 0)
  190.          if @target_index < 0
  191.             org_target = [opponents_unit.random_target] * num
  192.             new_targets = make_new_targets(org_target,0)
  193.          else
  194.             org_target = [opponents_unit.smooth_target(@target_index)] * num
  195.             new_targets = make_new_targets(org_target,0)
  196.          end
  197.        else
  198.           return (opponents_unit.alive_members + friends_unit.alive_members) if all_targets
  199.           return opponents_unit.alive_members
  200.       end
  201.   end
  202.  
  203.   #--------------------------------------------------------------------------
  204.   # * All Targets
  205.   #--------------------------------------------------------------------------
  206.   def all_targets
  207.       return true if @item.object.note =~ /<All Targets>/
  208.       return false
  209.   end
  210.  
  211.   #--------------------------------------------------------------------------
  212.   # * Targets for Allies
  213.   #--------------------------------------------------------------------------
  214.   def targets_for_friends
  215.     if item.for_user?
  216.        new_targets = make_new_targets([subject],1)      
  217.     elsif item.for_dead_friend?
  218.         if item.for_one?
  219.            org_target = [friends_unit.smooth_dead_target(@target_index)]
  220.            new_targets = make_new_targets(org_target,2)   
  221.         else
  222.            org_target = friends_unit.dead_members
  223.            new_targets = make_new_targets(org_target,2)           
  224.         end
  225.     elsif item.for_friend?
  226.          if item.for_one?
  227.             org_target = [friends_unit.smooth_target(@target_index)]
  228.             new_targets = make_new_targets(org_target,1)   
  229.          else
  230.             return (opponents_unit.alive_members + friends_unit.alive_members) if all_targets
  231.             return friends_unit.alive_members
  232.          end
  233.     end
  234.   end
  235.  
  236.   #--------------------------------------------------------------------------
  237.   # * Make New Targets
  238.   #--------------------------------------------------------------------------
  239.   def make_new_targets(target,type = 0)
  240.       targets = []
  241.       if all_targets
  242.         members = (opponents_unit.alive_members + friends_unit.alive_members) if type <= 1
  243.         members = friends_unit.dead_members if type == 2      
  244.       else
  245.         members = opponents_unit.alive_members if type == 0
  246.         members = friends_unit.alive_members if type == 1
  247.         members = friends_unit.dead_members if type == 2
  248.       end
  249.       for t in target
  250.           for m in members
  251.               targets.push(m) if t == m
  252.               next if t == m
  253.              (targets.push(m); m.sprite_size[2] = false) if scope_range?(t,m)            
  254.           end
  255.       end
  256.       return targets
  257.   end
  258.  
  259.   #--------------------------------------------------------------------------
  260.   # * Scope Range
  261.   #--------------------------------------------------------------------------
  262.   def scope_range?(user,target)
  263.       t_r2 = [user.screen_x, user.screen_y] rescue nil
  264.       t_r3 = [target.screen_x, target.screen_y] rescue nil
  265.       return false if t_r2 == nil or t_r3 == nil
  266.       s_r = [0,0,0,0] ; s_p = [0,0]
  267.       s_r = [$1.to_i,$2.to_i,$3.to_i,$4.to_i] if @item.object.note =~ /<Scope Range = (\d+) - (\d+) - (\d+) - (\d+)>/
  268.       return false if s_r == [0,0,0,0]
  269.       if SCOPE_TYPE > 0
  270.          s_p = [target.sprite_size[0] / 2, target.sprite_size[1]]
  271.          s_p[0] = s_p[0] * SPRITE_SIZE_RANGE[0] / 100
  272.          s_p[1] = s_p[1] * SPRITE_SIZE_RANGE[1] / 100
  273.       end
  274.       return false if !t_r3[0].between?(t_r2[0] - (s_r[0] + s_p[0]), t_r2[0] + (s_r[1] + s_p[0]))
  275.       return false if !t_r3[1].between?(t_r2[1] - s_r[2], t_r2[1] + s_r[3] + s_p[1])
  276.       return true
  277.   end  
  278.  
  279. end

MOG的Scope_EX如果给单体技能追加范围效果,动画也只会显示给选择的主目标,可是一旦加上技能暗转,就会给每个在范围内的目标都追加动画效果,把我给整懵了,究竟应该怎么修复呢

Lv5.捕梦者

梦石
0
星屑
24057
在线时间
4983 小时
注册时间
2016-3-8
帖子
1613
发表于 2021-2-15 21:51:24 | 显示全部楼层
我这边测不出有问题...
看完两个脚本的代码也看不到会有问题...
所以可否提供问题工程看一下是怎样子的问题...
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
832
在线时间
188 小时
注册时间
2019-4-11
帖子
56
 楼主| 发表于 2021-2-16 00:04:28 | 显示全部楼层
本帖最后由 sxjkjly8010 于 2021-2-16 00:16 编辑
alexncf125 发表于 2021-2-15 21:51
我这边测不出有问题...
看完两个脚本的代码也看不到会有问题...
所以可否提供问题工程看一下是怎样子的问题 ...


呃,虽然一开始听了您的意见也以为是我哪里其他脚本的问题,但是我自己新建了一个工程后发现还是有我的问题,所以问题确实出在这两个脚本之中。我先描述一下我使用的技能的设置,是一个单体技能,<Scope Range = 60 - 60 - 60 - 60>也就是周围60像素的敌人,动画是一个设置为基础位置中心的动画,再加上背景暗转效果,就会导致对范围内所有敌人使用动画,但去掉背景暗转就只会对主目标使用动画……我想要的效果就是背景暗转也只对主目标使用动画,但是怎么看代码也找不到原因所在
(因为限制2MB以下所以GIF帧数很低,在新工程中只放这两个脚本也有这个问题)
我是这样想的,会不会是因为先读取到了技能需要背景暗转,所以优先执行了背景暗转脚本设定的动画部分,Scope_EX的动画部分就不显示了呢?
QQ截图20210215235159.png
SDGIF_Rusult_1.gif
SDGIF_Rusult_2.gif
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
24057
在线时间
4983 小时
注册时间
2016-3-8
帖子
1613
发表于 2021-2-16 00:19:29 | 显示全部楼层
本帖最后由 alexncf125 于 2021-2-16 00:21 编辑

哦哦...我看到问题了...
虽然不知道原理...不过好像把那句wait(40)注释/删掉就可以了...

评分

参与人数 1+1 收起 理由
sxjkjly8010 + 1 认可答案!谢谢大佬帮助

查看全部评分

回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
832
在线时间
188 小时
注册时间
2019-4-11
帖子
56
 楼主| 发表于 2021-2-16 00:24:28 | 显示全部楼层
alexncf125 发表于 2021-2-16 00:19
哦哦...我看到问题了...
虽然不知道原理...不过好像把那句wait(40)注释/删掉就可以了... ...

草(日语),删掉真的好了,好神奇,谢谢大大的帮助(
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-3-29 19:55

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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