Project1

标题: 各位大侠,角色挨打时战斗图震动该怎么做呢 [打印本页]

作者: Phny    时间: 2019-12-14 00:05
标题: 各位大侠,角色挨打时战斗图震动该怎么做呢
觉得默认战斗干巴巴的没有什么打击感,想加入挨打震动的效果提升一下~看了一下彩虹神剑但是跟我的脚本冲了而且被击跳跃设置了也不知道为什么不显示QAQ而且我也不需要那么多的效果~论坛上的好多资料都没有了,天干宝典的那个本质上是战斗图的跳跃。。。所以现在想做的就是两边的人被打的时候图片都会震动一下,而且要全方向,所以各位大神有没有什么好办法呢。。。。。
P.S 彩虹神剑的伤害数字出现时机设计的我很喜欢,闪光的时候就可以跳数字了而不用傻乎乎地等攻击动画放完,战斗也变得更紧凑了~放一下跟彩虹神剑冲突的血条脚本,问题在277行,显示disposed sprite,目测是@_damage相关的问题吧。。。。但是小弟脑子不好使只能想到这了。。。。

#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================
# ■ エネミーHP&SP(ver 0.98)

# □ カスタマイズポイント
#==============================================================================
module PLAN_HPSP_DRAW
FONT_NAME         = ["黑体", "楷体", "宋体"]    # フォント
FONT_SIZE         =  14                               # フォントサイズ
FONT_BOLD         = true                              # 太字
FONT_ITALIC       = false                             # 斜体

DRAW_NAME         = false                              # 名前の描画
DRAW_HP           = false                              # HP の描画
DRAW_SP           = false                              # SP の描画

DRAW_WIDTH        =  80                               # 描画幅
DRAW_HEIGHT       = 3 * 32                            # 描画高さ
DRAW_SPACE        =   0                               # 行間
DRAW_Y            =  36                               # Y 座標修正値
end

我觉得这个血条脚本论坛里的大神应该都挺熟悉的所以我先不放后面的了(喂!)。。。。

然后是彩虹神剑出错的那一段,要是能把这俩改的不冲突也行。。。在这里先谢谢大神们了!!!!!!!!!
if @_damage_duration > 0
       @_damage_duration -= 1
       for damage in @_damage
         damage[0].x = self.x + self.viewport.rect.x -
                       self.ox + self.src_rect.width / 2 +
                       (40 - damage[1]) * damage[3] / 10
         damage[0].y -= damage[4]+damage[1]/10
         damage[0].opacity = damage[1]*20
         damage[1] -= 1
         if damage[1]==0 && damage[1]==0
           damage[0].bitmap.dispose
           damage[0].dispose
           @_damage.delete(damage)
           next
         end
       end
     end
作者: guoxiaomi    时间: 2019-12-22 02:42
本帖最后由 guoxiaomi 于 2019-12-26 00:56 编辑

如果只是在显示伤害数字的时候稍微抖动一下,可以参考这个代码:
  1. class Sprite_Battler < RPG::Sprite
  2.   alias _old_update update
  3.   def update
  4.     _old_update
  5.     if @_damage_duration > 0
  6.       @_damage_duration -= 1
  7.       case @_damage_duration
  8.       when 38..39
  9.         self.y -= 4
  10.       when 36..37
  11.         self.y -= 2
  12.       when 34..35
  13.         self.y += 2
  14.       when 28..33
  15.         self.y += 4
  16.       end
  17.     end      
  18.   end
  19. end
复制代码

其实这段是抄的F1,RPG::Sprite里的update方法

作者: Phny    时间: 2019-12-26 19:11
guoxiaomi 发表于 2019-12-22 02:42
如果只是在显示伤害数字的时候稍微抖动一下,可以参考这个代码:

其实这段是抄的F1,RPG::Sprite里的updat ...

有那个意思了,但是可不可以做到挨打的同时震动而不是跳数字的时候再动呢,先放完动画再震动感觉还是怪怪的。。。
作者: Phny    时间: 2019-12-26 19:46
guoxiaomi 发表于 2019-12-22 02:42
如果只是在显示伤害数字的时候稍微抖动一下,可以参考这个代码:

其实这段是抄的F1,RPG::Sprite里的updat ...

小弟看了一下F1的animation那块的解释,似乎不是做不到的样子???但是又是animation又是loop_animation的完全看不懂的说。。。。。
作者: guoxiaomi    时间: 2019-12-26 20:37
本帖最后由 guoxiaomi 于 2019-12-26 21:00 编辑
Phny 发表于 2019-12-26 19:46
小弟看了一下F1的animation那块的解释,似乎不是做不到的样子???但是又是animation又是loop_animation ...


先说明为什么选择在伤害数字的时候进行震动:
1. 你给的示例代码就是显示伤害数字的部分,注意变量:@_damage_duration。“彩虹神剑”脚本重新排列了动画的顺序,会同时播放使用者、对象方动画和伤害数字,并且分多次显示伤害。所以彩虹神剑选择在显示伤害数字的时候震动角色。
2. 对于默认脚本,由于动画中击中目标的那一帧通常不固定,所以做起来比较麻烦,需要对不同的动画使用不同的设定。而伤害显示是一个固定的流程,所以如果只是举一个简单的例子,不如就放在显示伤害数字的地方。

如果想要在播放动画的时候就震动,击中的那一帧必须单独配置好,最简单的方案其实修改方法animation_process_timing
RUBY 代码复制
  1. def animation_process_timing(timing, hit)
  2.       if (timing.condition == 0) or
  3.          (timing.condition == 1 and hit == true) or
  4.          (timing.condition == 2 and hit == false)
  5.         if timing.se.name != ""
  6.           se = timing.se
  7.           Audio.se_play("Audio/SE/" + se.name, se.volume, se.pitch)
  8.         end
  9.         case timing.flash_scope
  10.         when 1
  11.           self.flash(timing.flash_color, timing.flash_duration * 2)
  12.         when 2
  13.           if self.viewport != nil
  14.             self.viewport.flash(timing.flash_color, timing.flash_duration * 2)
  15.           end
  16.         when 3
  17.           self.flash(nil, timing.flash_duration * 2)
  18.         end
  19.       end
  20.     end

添加一个特殊的se,当读到这个se的名称时,角色需要进行震动就可以了。
Project1.zip (200.66 KB, 下载次数: 53)
代码如下,注意范例里面动画7的设置以及添加的空文件shake.ogg:
RUBY 代码复制
  1. class Sprite_Battler < RPG::Sprite
  2.   alias _old_animation_process_timing animation_process_timing
  3.   def animation_process_timing(timing, hit)
  4.     if timing.se.name == "shake"
  5.       if hit
  6.         c = timing.flash_color
  7.         self.ox += c.red - c.green
  8.         self.oy += c.blue - c.alpha
  9.       end
  10.     else
  11.       _old_animation_process_timing(timing, hit)
  12.     end
  13.   end
  14. end

作者: Phny    时间: 2019-12-26 21:12
guoxiaomi 发表于 2019-12-26 20:37
先说明为什么选择在伤害数字的时候进行震动:
1. 你给的示例代码就是显示伤害数字的部分,注意变量:@_da ...

哇,比我想的要复杂多了,用音效判定震动时机这个是真的没想到。。。谢谢大侠解惑!!!回头试试!!
作者: Phny    时间: 2019-12-26 21:42
guoxiaomi 发表于 2019-12-26 20:37
先说明为什么选择在伤害数字的时候进行震动:
1. 你给的示例代码就是显示伤害数字的部分,注意变量:@_da ...

真的可以!!完美实现了我想要的效果!!小弟给您磕头了谢谢大神!!!!!!




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1