查看: 4039|回复: 6

[已经解决] 战斗画面震动

[复制链接]
梦石
0
星屑
50
在线时间
168 小时
注册时间
2007-7-26
回帖
427
发表于 2016-5-23 01:31:45 | 显示全部楼层 |阅读模式
悬赏5星屑已解决
如题,帮忙做个战斗画面震动效果,敌人,角色的战斗图和战斗背景一起震动的。真实的感觉。上下震动

最佳答案

查看完整内容

简单说一下震动吧, 这里要改,不然震动起来,战斗背景就不好看了。战斗背景最好大一些,具体设置看范例里面的 这个意思是,抖动强度5,速度5,持续时间好像是600/24秒,具体怎么换算我也不清楚。 这里是改敌人显示的y坐标的,如果敌人太上去了,可以在y坐标上加一些

评分

参与人数 1星屑 +35 收起 理由
RyanBern + 35 手动认可奖励

查看全部评分

梦石
0
星屑
1788
在线时间
1313 小时
注册时间
2012-8-4
回帖
724
发表于 2016-5-23 01:31:46 | 显示全部楼层
本帖最后由 夜狠简单 于 2016-5-23 12:58 编辑

攻击时角色震动 临时写的,bug很多。[pre lang="ruby"]#
#插到Main前
#光标类的还没有调整

# ■ Scene_Battle (分割定义 4)
#------------------------------------------------------------------------------
#  处理战斗画面的类。
#==============================================================================
#■ ■ ■ 在22行和34行可以改变震动的(强度,速度,时间60帧为1秒,id)
class Scene_Battle
#--------------------------------------------------------------------------
  # ● 生成基本行动结果
  #--------------------------------------------------------------------------
  def make_basic_action_result
    # 攻击的情况下
    if @active_battler.current_action.basic == 0
      # 设置攻击 ID
      @animation1_id = @active_battler.animation1_id
      @animation2_id = @active_battler.animation2_id
      # 行动方的战斗者是敌人的情况下
      if @active_battler.is_a?(Game_Enemy)
        Interpreter.new.command_726(7,5,10,@active_battler.index)
        if @active_battler.restriction == 3
          target = $game_troop.random_target_enemy
        elsif @active_battler.restriction == 2
          target = $game_party.random_target_actor
        else
          index = @active_battler.current_action.target_index
          target = $game_party.smooth_target_actor(index)
        end
      end
      # 行动方的战斗者是角色的情况下
      if @active_battler.is_a?(Game_Actor)
         Interpreter.new.command_725(8,5,10,@active_battler.id)
        if @active_battler.restriction == 3
          target = $game_party.random_target_actor
        elsif @active_battler.restriction == 2
          target = $game_troop.random_target_enemy
        else
            
          index = @active_battler.current_action.target_index
          target = $game_troop.smooth_target_enemy(index)
        end
      end
      # 设置对像方的战斗者序列
      @target_battlers = [target]
      # 应用通常攻击效果
      for target in @target_battlers
        target.attack_effect(@active_battler)
      end
      return
    end
    # 防御的情况下
    if @active_battler.current_action.basic == 1
      # 帮助窗口显示"防御"
      @help_window.set_text($data_system.words.guard, 1)
      return
    end
    # 逃跑的情况下
    if @active_battler.is_a?(Game_Enemy) and
       @active_battler.current_action.basic == 2
      #  帮助窗口显示"逃跑"
      @help_window.set_text("逃跑", 1)
      # 逃跑
      @active_battler.escape
      return
    end
    # 什么也不做的情况下
    if @active_battler.current_action.basic == 3
      # 清除强制行动对像的战斗者
      $game_temp.forcing_battler = nil
      # 移至步骤 1
      @phase4_step = 1
      return
    end
  end
end
#==============================================================================
# ■ Game_Screen
#------------------------------------------------------------------------------
#  更改色调以及画面闪烁、保存画面全体关系处理数据的类。本类的实例请参考
# $game_screen。
#==============================================================================

class Game_Screen
  
  attr_reader   :shake1                    # 震动位置
  attr_reader   :shake2                    # 震动位置
  attr_reader   :shake_id                  #震动的角色
  attr_reader   :shake_id1                 #震动的敌人
  alias initialize20160523 initialize
  def initialize
    @shake_power1 = 0
    @shake_speed1 = 0
    @shake_power2 = 0
    @shake_speed2 = 0
    @shake_duration1 = 0
    @shake_direction1 = 1
    @shake_duration2 = 0
    @shake_direction2 = 1
    @shake_id=0
    @shake_id1=0
    @shake1 = 0
    @shake2 = 0
    initialize20160523
  end
#角色震动
   def start_shake1(power, speed, duration,id)
    @shake_power1 = power
    @shake_speed1 = speed
    @shake_id=id
    @shake_duration1 = duration
  end
  #敌人震动
  def start_shake2(power, speed, duration,id)
    @shake_power2 = power
    @shake_speed2 = speed
    @shake_id1=id
    @shake_duration2 = duration
  end
  #刷新画面
  alias update20160523 update
  def update
     update20160523
    if @shake_duration1 >= 1 or @shake1 != 0
      delta1 = (@shake_power1 * @shake_speed1 * @shake_direction1) / 10.0
      if @shake_duration1 <= 1 and @shake1 * (@shake1 + delta1) < 0
        @shake1 = 0
      else
        @shake1 += delta1
      end
      if @shake1 > @shake_power1 * 2
        @shake_direction1 = -1
      end
      if @shake1 < - @shake_power1 * 2
        @shake_direction1 = 1
      end
      if @shake_duration1 >= 1
        @shake_duration1 -= 1
      end
    end

    if @shake_duration2 >= 1 or @shake2 != 0
      delta2 = (@shake_power2 * @shake_speed2 * @shake_direction2) / 10.0
      if @shake_duration2 <= 1 and @shake2 * (@shake2 + delta2) < 0
        @shake2 = 0
      else
        @shake2 += delta2
      end
      if @shake2 > @shake_power2 * 1
        @shake_direction2 = -2
      end
      if @shake2 < - @shake_power2 * 1
        @shake_direction2 = 1
      end
      if @shake_duration2 >= 1
        @shake_duration2 -= 1
      end
    end
  end
  
end

#==============================================================================
# ■ Spriteset_Battle
#------------------------------------------------------------------------------
#  处理战斗画面的活动块的类。本类在 Scene_Battle 类
# 的内部使用。
#==============================================================================

class Spriteset_Battle
  # 敌人方的显示端口
  attr_reader   :viewport8
  attr_reader   :viewport9
  attr_reader   :viewport10
  attr_reader   :viewport11
  attr_reader   :viewport12
  attr_reader   :viewport13
  attr_reader   :viewport14
  # 角色方的显示端口
  attr_reader   :viewport5
  attr_reader   :viewport6
  attr_reader   :viewport7
alias initialize20160523 initialize
def initialize
# 生成显示端口
#initialize20160523
    @viewport1 = Viewport.new(0, 0, 640, 320)
    @viewport2 = Viewport.new(0, 0, 640, 480)
    @viewport3 = Viewport.new(0, 0, 640, 480)
    @viewport4 = Viewport.new(0, 0, 640, 480)
    @viewport2.z = 101
    @viewport3.z = 200
    @viewport4.z = 5000
    # 生成战斗背景活动块
    @battleback_sprite = Sprite.new(@viewport1)
    # 生成敌人活动块
#敌人
    @viewport8 = Viewport.new(0, 0, 640, 480)
    @viewport9 = Viewport.new(0, 0, 640, 480)
    @viewport10 = Viewport.new(0, 0, 640, 480)
    @viewport11 = Viewport.new(0, 0, 640, 480)
    @viewport12 = Viewport.new(0, 0, 640, 480)
    @viewport13 = Viewport.new(0, 0, 640, 480)
    @viewport14 = Viewport.new(0, 0, 640, 480)
     @enemy_sprites = []
    for enemy in $game_troop.enemies.reverse
      case enemy.index
      when 0
      @enemy_sprites.push(Sprite_Battler.new(@viewport1, enemy))
      when 1
      @enemy_sprites.push(Sprite_Battler.new(@viewport8, enemy))
      when 2
      @enemy_sprites.push(Sprite_Battler.new(@viewport9, enemy))
      when 3
      @enemy_sprites.push(Sprite_Battler.new(@viewport10, enemy))
      when 4
      @enemy_sprites.push(Sprite_Battler.new(@viewport11, enemy))
      when 5
      @enemy_sprites.push(Sprite_Battler.new(@viewport12, enemy))
      when 6
      @enemy_sprites.push(Sprite_Battler.new(@viewport13, enemy))
      when 7
      @enemy_sprites.push(Sprite_Battler.new(@viewport14, enemy))
      end
    end
#角色
    @viewport5 = Viewport.new(0, 0, 640, 480)
    @viewport6 = Viewport.new(0, 0, 640, 480)
    @viewport7 = Viewport.new(0, 0, 640, 480)
    @viewport5.z = 101
    @viewport6.z = 101
    @viewport7.z = 101
    @actor_sprites = []
    @actor_sprites.push(Sprite_Battler.new(@viewport2))
    @actor_sprites.push(Sprite_Battler.new(@viewport5))
    @actor_sprites.push(Sprite_Battler.new(@viewport6))
    @actor_sprites.push(Sprite_Battler.new(@viewport7))
     # 生成天候
    @weather = RPG::Weather.new(@viewport1)
    # 生成图片活动块
    @picture_sprites = []
    for i in 51..100
      @picture_sprites.push(Sprite_Picture.new(@viewport3,
        $game_screen.pictures))
    end
    # 生成计时器块
    @timer_sprite = Sprite_Timer.new
    # 刷新画面
    update
  end
#释放

alias dispose20160523 dispose
def dispose
    dispose20160523
    @viewport5.dispose
    @viewport6.dispose
    @viewport7.dispose
    @viewport8.dispose
    @viewport9.dispose
    @viewport10.dispose
    @viewport11.dispose
    @viewport12.dispose
    @viewport13.dispose
    @viewport14.dispose
  end
  #刷新画面
alias update20160523 update
def update
  update20160523
  tongban=[]
    diren=[]
    for i in 0...$game_party.actors.size
     tongban=$game_party.actors.id
   end
    case $game_screen.shake_id
    when tongban[0]
          @viewport2.oy   = $game_screen.shake1
    when tongban[1]
          @viewport5.oy   = $game_screen.shake1
    when tongban[2]
          @viewport6.oy   = $game_screen.shake1
    when tongban[3]
          @viewport7.oy   = $game_screen.shake1
    end
for i in 0...$game_troop.enemies.size
   diren=$game_troop.enemies.index
end
case $game_screen.shake_id1
    when diren[0]
          @viewport1.oy   = $game_screen.shake2
    when diren[1]
          @viewport8.oy   = $game_screen.shake2
    when diren[2]
          @viewport9.oy   = $game_screen.shake2
    when diren[3]
          @viewport10.oy   = $game_screen.shake2
    when diren[4]
          @viewport11.oy   = $game_screen.shake2
    when diren[5]
          @viewport12.oy   = $game_screen.shake2
    when diren[6]
          @viewport13.oy   = $game_screen.shake2
    when diren[7]
          @viewport14.oy   = $game_screen.shake2
    end
    #刷新显示端口
    @viewport5.update
    @viewport6.update
    @viewport7.update
    @viewport8.update
    @viewport9.update
    @viewport10.update
    @viewport11.update
    @viewport12.update
    @viewport13.update
    @viewport14.update
  end
  
end
#==============================================================================
# ■ Interpreter
#------------------------------------------------------------------------------
#  执行事件命令的解释器。本类在 Game_System 类
# 与 Game_Event 类的内部使用。
#==============================================================================
class Interpreter
def command_725(x,y,z,id)
    # 角色震动开始
    $game_screen.start_shake1(x, y,z* 2,id)
    # 继续
    return true
  end
def command_726(x,y,z,id)
    # 敌人震动开始
    $game_screen.start_shake2(x, y,z* 2,id)
    # 继续
    return true
  end
end
[/pre]



简单说一下震动吧,

战斗上下抖动[pre lang="ruby"]#
#插到Main前
#光标类的没有问题

$shakeswitches=40  
#==============================================================================
# ■ Game_Screen
#------------------------------------------------------------------------------
#  更改色调以及画面闪烁、保存画面全体关系处理数据的类。本类的实例请参考
# $game_screen。
#==============================================================================

class Game_Screen
  attr_reader   :shake1                    # 震动位置
  alias initialize20160523 initialize
  def initialize
    @shake_power1 = 0
    @shake_speed1 = 0
    @shake_duration1 = 0
    @shake_direction1 = 1
    @shake1 = 0
    initialize20160523
  end
   #战斗画面震动
   def start_shake1(power, speed, duration)
    @shake_power1 = power
    @shake_speed1 = speed
    @shake_duration1 = duration
  end

  #刷新画面
  alias update20160523 update
  def update
     update20160523
    if @shake_duration1 >= 1 or @shake1 != 0
      delta1 = (@shake_power1 * @shake_speed1 * @shake_direction1) / 10.0
      if @shake_duration1 <= 1 and @shake1 * (@shake1 + delta1) < 0
        @shake1 = 0
      else
        @shake1 += delta1
      end
      if @shake1 > @shake_power1 * 2
        @shake_direction1 = -1
      end
      if @shake1 < - @shake_power1 * 2
        @shake_direction1 = 1
      end
      if @shake_duration1 >= 1
        @shake_duration1 -= 1
      end
    end

   
  end
  
end

#==============================================================================
# ■ Spriteset_Battle
#------------------------------------------------------------------------------
#  处理战斗画面的活动块的类。本类在 Scene_Battle 类
# 的内部使用。
#==============================================================================

class Spriteset_Battle


alias update20160523 update
def update
  update20160523
@viewport1.oy = $game_screen.shake1
@viewport2.oy = $game_screen.shake1
  end
  
end
#==============================================================================
# ■ Interpreter
#------------------------------------------------------------------------------
#  执行事件命令的解释器。本类在 Game_System 类
# 与 Game_Event 类的内部使用。
#==============================================================================
class Interpreter
def command_725(x,y,z)
    # 角色震动开始
    $game_screen.start_shake1(x, y,z* 2)
    # 继续
    return true
  end
end
[/pre]


需要调.jpg

这里要改,不然震动起来,战斗背景就不好看了。战斗背景最好大一些,具体设置看范例里面的
360截图20160523125306028.jpg
这个意思是,抖动强度5,速度5,持续时间好像是600/24秒,具体怎么换算我也不清楚。



这里是改敌人显示的y坐标的,如果敌人太上去了,可以在y坐标上加一些
360截图20160523124936523.jpg

战斗画面抖动.zip

1.46 MB, 下载次数: 117

点评

谢谢,不是这个,就是说角色受到攻击或者伤害时,画面震动。  发表于 2016-5-23 13:07
第一个脚本有问题,不需要用了,残次品。范例用的是第二个脚本  发表于 2016-5-23 13:00

评分

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

查看全部评分

回复

使用道具 举报

梦石
0
星屑
50
在线时间
168 小时
注册时间
2007-7-26
回帖
427
 楼主| 发表于 2016-5-23 13:17:08 | 显示全部楼层
夜狠简单 发表于 2016-5-23 12:56
[fold=攻击时角色震动 临时写的,bug很多。]#
#插到Main前
#光标类的还没有调整

震动这个就是角色受到攻击,或者,受到伤害,才显示的画面震动效果,当然,包括角色一起震动,全屏。

点评

这个倒是可以做到。只有条件把握的好  发表于 2016-5-23 13:32
回复

使用道具 举报

梦石
0
星屑
1788
在线时间
1313 小时
注册时间
2012-8-4
回帖
724
发表于 2016-5-23 13:43:15 | 显示全部楼层
本帖最后由 夜狠简单 于 2016-5-23 22:51 编辑
cmmd1 发表于 2016-5-23 13:17
震动这个就是角色受到攻击,或者,受到伤害,才显示的画面震动效果,当然,包括角色一起震动,全屏。

...


道理都一样,只是添加了些判断、。

具体改在哪个位置要看你用了的脚本,


改变下抖动的时间[pre lang="ruby"]#==============================================================================
# ■ Scene_Battle (分割定义 4)
#------------------------------------------------------------------------------
#  处理战斗画面的类。
#==============================================================================

class Scene_Battle
  #--------------------------------------------------------------------------
  # ● 开始主回合
  #--------------------------------------------------------------------------
  def start_phase4
    # 转移到回合 4
    @phase = 4
    # 回合数计数
    $game_temp.battle_turn += 1
    # 搜索全页的战斗事件
    for index in 0...$data_troops[@troop_id].pages.size
      # 获取事件页
      page = $data_troops[@troop_id].pages[index]
      # 本页的范围是 [回合] 的情况下
      if page.span == 1
        # 设置已经执行标志
        $game_temp.battle_event_flags[index] = false
      end
    end
    # 设置角色为非选择状态
    @actor_index = -1
    @active_battler = nil
    # 有效化同伴指令窗口
    @party_command_window.active = false
    @party_command_window.visible = false
    # 无效化角色指令窗口
    @actor_command_window.active = false
    @actor_command_window.visible = false
    # 设置主回合标志
    $game_temp.battle_main_phase = true
    # 生成敌人行动
    for enemy in $game_troop.enemies
      enemy.make_action
    end
    # 生成行动顺序
    make_action_orders
    # 移动到步骤 1
    @phase4_step = 1
  end
  #--------------------------------------------------------------------------
  # ● 生成行动循序
  #--------------------------------------------------------------------------
  def make_action_orders
    # 初始化序列 @action_battlers
    @action_battlers = []
    # 添加敌人到 @action_battlers 序列
    for enemy in $game_troop.enemies
      @action_battlers.push(enemy)
    end
    # 添加角色到 @action_battlers 序列
    for actor in $game_party.actors
      @action_battlers.push(actor)
    end
    # 确定全体的行动速度
    for battler in @action_battlers
      battler.make_action_speed
    end
    # 按照行动速度从大到小排列
    @action_battlers.sort! {|a,b|
      b.current_action.speed - a.current_action.speed }
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (主回合)
  #--------------------------------------------------------------------------
  def update_phase4
    case @phase4_step
    when 1
      update_phase4_step1
    when 2
      update_phase4_step2
    when 3
      update_phase4_step3
    when 4
      update_phase4_step4
    when 5
      update_phase4_step5
    when 6
      update_phase4_step6
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (主回合步骤 1 : 准备行动)
  #--------------------------------------------------------------------------
  def update_phase4_step1
    # 隐藏帮助窗口
    @help_window.visible = false
    # 判定胜败
    if judge
      # 胜利或者失败的情况下 : 过程结束
      return
    end
    # 强制行动的战斗者不存在的情况下
    if $game_temp.forcing_battler == nil
      # 设置战斗事件
      setup_battle_event
      # 执行战斗事件中的情况下
      if $game_system.battle_interpreter.running?
        return
      end
    end
    # 强制行动的战斗者存在的情况下
    if $game_temp.forcing_battler != nil
      # 在头部添加后移动
      @action_battlers.delete($game_temp.forcing_battler)
      @action_battlers.unshift($game_temp.forcing_battler)
    end
    # 未行动的战斗者不存在的情况下 (全员已经行动)
    if @action_battlers.size == 0
      # 开始同伴命令回合
      start_phase2
      return
    end
    # 初始化动画 ID 和公共事件 ID
    @animation1_id = 0
    @animation2_id = 0
    @common_event_id = 0
    # 未行动的战斗者移动到序列的头部
    @active_battler = @action_battlers.shift
    # 如果已经在战斗之外的情况下
    if @active_battler.index == nil
      return
    end
    # 连续伤害
    if @active_battler.hp > 0 and @active_battler.slip_damage?
      @active_battler.slip_damage_effect
      @active_battler.damage_pop = true
    end
    # 自然解除状态
    @active_battler.remove_states_auto
    # 刷新状态窗口
    @status_window.refresh
    # 移至步骤 2
    @phase4_step = 2
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (主回合步骤 2 : 开始行动)
  #--------------------------------------------------------------------------
  def update_phase4_step2
    # 如果不是强制行动
    unless @active_battler.current_action.forcing
      # 限制为 [敌人为普通攻击] 或 [我方为普通攻击] 的情况下
      if @active_battler.restriction == 2 or @active_battler.restriction == 3
        # 设置行动为攻击
        @active_battler.current_action.kind = 0
        @active_battler.current_action.basic = 0
      end
      # 限制为 [不能行动] 的情况下
      if @active_battler.restriction == 4
        # 清除行动强制对像的战斗者
        $game_temp.forcing_battler = nil
        # 移至步骤 1
        @phase4_step = 1
        return
      end
    end
    # 清除对像战斗者
    @target_battlers = []
    # 行动种类分支
    case @active_battler.current_action.kind
    when 0  # 基本
      make_basic_action_result
    when 1  # 特技
      make_skill_action_result
    when 2  # 物品
      make_item_action_result
    end
    # 移至步骤 3
    if @phase4_step == 2
      @phase4_step = 3
    end
  end
  #--------------------------------------------------------------------------
  # ● 生成基本行动结果
  #--------------------------------------------------------------------------
  def make_basic_action_result
    # 攻击的情况下
    if @active_battler.current_action.basic == 0
      # 设置攻击 ID
      @animation1_id = @active_battler.animation1_id
      @animation2_id = @active_battler.animation2_id
      # 行动方的战斗者是敌人的情况下
   
      if @active_battler.is_a?(Game_Enemy)
          $game_switches[$shakeswitches]=true
        if @active_battler.restriction == 3
          target = $game_troop.random_target_enemy
        elsif @active_battler.restriction == 2
          target = $game_party.random_target_actor
        else
          index = @active_battler.current_action.target_index
          target = $game_party.smooth_target_actor(index)
        end
      end
      # 行动方的战斗者是角色的情况下
      
      if @active_battler.is_a?(Game_Actor)
        $game_switches[$shakeswitches]=false
        if @active_battler.restriction == 3
          target = $game_party.random_target_actor
        elsif @active_battler.restriction == 2
          target = $game_troop.random_target_enemy
        else
          index = @active_battler.current_action.target_index
          target = $game_troop.smooth_target_enemy(index)
        end
      end
      # 设置对像方的战斗者序列
      @target_battlers = [target]
      # 应用通常攻击效果
      for target in @target_battlers
        target.attack_effect(@active_battler)
      end
      return
    end
    # 防御的情况下
    if @active_battler.current_action.basic == 1
      # 帮助窗口显示"防御"
      @help_window.set_text($data_system.words.guard, 1)
      return
    end
    # 逃跑的情况下
    if @active_battler.is_a?(Game_Enemy) and
       @active_battler.current_action.basic == 2
      #  帮助窗口显示"逃跑"
      @help_window.set_text("逃跑", 1)
      # 逃跑
      @active_battler.escape
      return
    end
    # 什么也不做的情况下
    if @active_battler.current_action.basic == 3
      # 清除强制行动对像的战斗者
      $game_temp.forcing_battler = nil
      # 移至步骤 1
      @phase4_step = 1
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 设置物品或特技对像方的战斗者
  #     scope : 特技或者是物品的范围
  #--------------------------------------------------------------------------
  def set_target_battlers(scope)
    # 行动方的战斗者是敌人的情况下
    if @active_battler.is_a?(Game_Enemy)
          $game_switches[$shakeswitches]=true
      # 效果范围分支
      case scope
      when 1  # 敌单体
        index = @active_battler.current_action.target_index
        @target_battlers.push($game_party.smooth_target_actor(index))
      when 2  # 敌全体
        for actor in $game_party.actors
          if actor.exist?
            @target_battlers.push(actor)
          end
        end
      when 3  # 我方单体
        index = @active_battler.current_action.target_index
        @target_battlers.push($game_troop.smooth_target_enemy(index))
      when 4  # 我方全体
        for enemy in $game_troop.enemies
          if enemy.exist?
            @target_battlers.push(enemy)
          end
        end
      when 5  # 我方单体 (HP 0)
        index = @active_battler.current_action.target_index
        enemy = $game_troop.enemies[index]
        if enemy != nil and enemy.hp0?
          @target_battlers.push(enemy)
        end
      when 6  # 我方全体 (HP 0)
        for enemy in $game_troop.enemies
          if enemy != nil and enemy.hp0?
            @target_battlers.push(enemy)
          end
        end
      when 7  # 使用者
        @target_battlers.push(@active_battler)
      end
    end
    # 行动方的战斗者是角色的情况下
    if @active_battler.is_a?(Game_Actor)
      # 效果范围分支
      case scope
      when 1  # 敌单体
        index = @active_battler.current_action.target_index
        @target_battlers.push($game_troop.smooth_target_enemy(index))
      when 2  # 敌全体
        for enemy in $game_troop.enemies
          if enemy.exist?
            @target_battlers.push(enemy)
          end
        end
      when 3  # 我方单体
        index = @active_battler.current_action.target_index
        @target_battlers.push($game_party.smooth_target_actor(index))
      when 4  # 我方全体
        for actor in $game_party.actors
          if actor.exist?
            @target_battlers.push(actor)
          end
        end
      when 5  # 我方单体 (HP 0)
        index = @active_battler.current_action.target_index
        actor = $game_party.actors[index]
        if actor != nil and actor.hp0?
          @target_battlers.push(actor)
        end
      when 6  # 我方全体 (HP 0)
        for actor in $game_party.actors
          if actor != nil and actor.hp0?
            @target_battlers.push(actor)
          end
        end
      when 7  # 使用者
        @target_battlers.push(@active_battler)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 生成特技行动结果
  #--------------------------------------------------------------------------
  def make_skill_action_result
   
      if @active_battler.is_a?(Game_Enemy)
          $game_switches[$shakeswitches]=true
      end
    # 获取特技
    @skill = $data_skills[@active_battler.current_action.skill_id]
    # 如果不是强制行动
    unless @active_battler.current_action.forcing
      # 因为 SP 耗尽而无法使用的情况下
      unless @active_battler.skill_can_use?(@skill.id)
        # 清除强制行动对像的战斗者
        $game_temp.forcing_battler = nil
        # 移至步骤 1
        @phase4_step = 1
        return
      end
    end
    # 消耗 SP
    @active_battler.sp -= @skill.sp_cost
    # 刷新状态窗口
    @status_window.refresh
    # 在帮助窗口显示特技名
    @help_window.set_text(@skill.name, 1)
    # 设置动画 ID
    @animation1_id = @skill.animation1_id
    @animation2_id = @skill.animation2_id
    # 设置公共事件 ID
    @common_event_id = @skill.common_event_id
    # 设置对像侧战斗者
    set_target_battlers(@skill.scope)
    # 应用特技效果
    for target in @target_battlers
      target.skill_effect(@active_battler, @skill)
    end
  end
  #--------------------------------------------------------------------------
  # ● 生成物品行动结果
  #--------------------------------------------------------------------------
  def make_item_action_result
    # 获取物品
    @item = $data_items[@active_battler.current_action.item_id]
    # 因为物品耗尽而无法使用的情况下
    unless $game_party.item_can_use?(@item.id)
      # 移至步骤 1
      @phase4_step = 1
      return
    end
    # 消耗品的情况下
    if @item.consumable
      # 使用的物品减 1
      $game_party.lose_item(@item.id, 1)
    end
    # 在帮助窗口显示物品名
    @help_window.set_text(@item.name, 1)
    # 设置动画 ID
    @animation1_id = @item.animation1_id
    @animation2_id = @item.animation2_id
    # 设置公共事件 ID
    @common_event_id = @item.common_event_id
    # 确定对像
    index = @active_battler.current_action.target_index
    target = $game_party.smooth_target_actor(index)
    # 设置对像侧战斗者
    set_target_battlers(@item.scope)
    # 应用物品效果
    for target in @target_battlers
      target.item_effect(@item)
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (主回合步骤 3 : 行动方动画)
  #--------------------------------------------------------------------------
  def update_phase4_step3
    # 行动方动画 (ID 为 0 的情况下是白色闪烁)
    if @animation1_id == 0
      @active_battler.white_flash = true
    else
      @active_battler.animation_id = @animation1_id
      @active_battler.animation_hit = true
    end
    # 移至步骤 4
    @phase4_step = 4
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (主回合步骤 4 : 对像方动画)
  #--------------------------------------------------------------------------
  def update_phase4_step4
    # 对像方动画
    for target in @target_battlers
     
      target.animation_id = @animation2_id
      target.animation_hit = (target.damage != "Miss")
       if target.damage != nil
      Interpreter.new.command_725(5,5,6)  if $game_switches[$shakeswitches]==true and target.damage.to_i>0
      end
    end
    # 限制动画长度、最低 8 帧
    @wait_count = 8
    # 移至步骤 5
    @phase4_step = 5
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (主回合步骤 5 : 显示伤害)
  #--------------------------------------------------------------------------
  def update_phase4_step5
    # 隐藏帮助窗口
    @help_window.visible = false
    # 刷新状态窗口
    @status_window.refresh
    # 显示伤害
  
   
    for target in @target_battlers
      if target.damage != nil
      
        target.damage_pop = true
      end
    end
    # 移至步骤 6
    @phase4_step = 6
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (主回合步骤 6 : 刷新)
  #--------------------------------------------------------------------------
  def update_phase4_step6
    # 清除强制行动对像的战斗者
    $game_temp.forcing_battler = nil
    # 公共事件 ID 有效的情况下
    if @common_event_id > 0
      # 设置事件
      common_event = $data_common_events[@common_event_id]
      $game_system.battle_interpreter.setup(common_event.list, 0)
    end
    # 移至步骤 1
    @phase4_step = 1
  end
end
[/pre]

战斗画面抖动.zip

1.46 MB, 下载次数: 117

点评

能做出来,不过你能做出HP了,SP你可以尝试下。有些东西模仿多了就会了。不需要会些太多,有些字码可以复制粘贴来用。  发表于 2016-5-23 22:46
还有个提问悬赏帖子,SP槽的图片制作,能不能帮忙一下。  发表于 2016-5-23 22:40
能不能在这编辑个脚本,或者解说一下,动画时震动。因为发现,打完以后才象征性的动一下,有点假  发表于 2016-5-23 22:38
参考第二个脚本93行放的位置,放进去。  发表于 2016-5-23 22:33
恩,的确,这个技能攻击也行了。只是震动有点晚。能不能在动画的时候震动?  发表于 2016-5-23 22:29
回复

使用道具 举报

梦石
0
星屑
50
在线时间
168 小时
注册时间
2007-7-26
回帖
427
 楼主| 发表于 2016-5-23 14:48:26 | 显示全部楼层
夜狠简单 发表于 2016-5-23 13:43
道理都一样,只是添加了些判断、。

具体改在哪个位置要看你用了的脚本, ...

好像被魔法攻击,受伤就没有震动了
回复

使用道具 举报

梦石
0
星屑
1788
在线时间
1313 小时
注册时间
2012-8-4
回帖
724
发表于 2016-5-23 14:52:06 | 显示全部楼层
本帖最后由 夜狠简单 于 2016-5-23 19:31 编辑
cmmd1 发表于 2016-5-23 14:48
好像被魔法攻击,受伤就没有震动了


战斗画面震动[pre lang="ruby"]#by RK
#插到Main前
$shakeswitches=40#40号开关。可以改
$shakeswitches1=41
$shakeswitches2=42
# ■ Scene_Battle (分割定义 4)
#------------------------------------------------------------------------------
#  处理战斗画面的类。
#==============================================================================
#■ ■ ■ 在45行和51行....可以改变震动的
# 敌人震动 Interpreter.new.command_726(强度,速度,帧数[这个游戏应该是40帧为1秒],id不要动)
# 角色震动 Interpreter.new.command_725(强度,速度,帧数,id不要动)
# 其他震动地方自己可以搜索改强度,94行处开关40开启角色被攻击画面震动,95行出开启敌人被....
class Scene_Battle
    def start_enemy_select
    # 生成敌人箭头
    @enemy_arrow = Arrow_Enemy.new(@spriteset.viewport14)
    # 关联帮助窗口
    @enemy_arrow.help_window = @help_window
    # 无效化角色指令窗口
    @actor_command_window.active = false
    @actor_command_window.visible = false
  end
  #--------------------------------------------------------------------------
  # ● 开始选择角色
  #--------------------------------------------------------------------------
  def start_actor_select
    # 生成角色箭头
    @actor_arrow = Arrow_Actor.new(@spriteset.viewport16)
    @actor_arrow.index = @actor_index
    # 关联帮助窗口
    @actor_arrow.help_window = @help_window
    # 无效化角色指令窗口
    @actor_command_window.active = false
    @actor_command_window.visible = false
  end
#--------------------------------------------------------------------------
  # ● 生成基本行动结果
  #--------------------------------------------------------------------------
alias make_basic_action_result20160523 make_basic_action_result
  def make_basic_action_result
    if @active_battler.is_a?(Game_Enemy)
      if @active_battler.current_action.basic ==0
       #角色攻击时震动一下
        Interpreter.new.command_726(5,5,5,@active_battler.index)
      end
    end
   if @active_battler.is_a?(Game_Actor)
     if @active_battler.current_action.basic ==0
     #敌人攻击时震动一下
        Interpreter.new.command_725(5,5,5,@active_battler.id)
      end
      end
   make_basic_action_result20160523
  end

  #生成特技行动结果
  alias make_skill_action_result20160523 make_skill_action_result
  def make_skill_action_result
  if @active_battler.is_a?(Game_Enemy)
       #角色施法时震动一下
        Interpreter.new.command_726(5,5,5,@active_battler.index)
    end
   if @active_battler.is_a?(Game_Actor)
     #敌人施法时震动一下
        Interpreter.new.command_725(5,5,5,@active_battler.id)
      end
      make_skill_action_result20160523
    end
   
  #生成物品行动结果
  alias make_item_action_result20160523 make_item_action_result
  def make_item_action_result
   if @active_battler.is_a?(Game_Enemy)
       #角色使用物品时震动一下
        Interpreter.new.command_726(5,5,5,@active_battler.index)
    end
   if @active_battler.is_a?(Game_Actor)
       #敌人使用物品时震动一下
        Interpreter.new.command_725(5,5,5,@active_battler.id)
      end
      make_item_action_result20160523
  end
  
    def update_phase4_step4
    # 对像方动画
    for target in @target_battlers
      target.animation_id = @animation2_id
      target.animation_hit = (target.damage != "Miss")
       if target.damage != nil
        #角色震动
          if target.is_a?(Game_Actor) and target.damage.to_i>0
             Interpreter.new.command_725(8,5,10,target.id)
             @spriteset.viewport15.oy = $game_screen.start_shake3(8, 5,10) if $game_switches[$shakeswitches]==true
          end
        #敌人震动
          if target.is_a?(Game_Enemy) and target.damage.to_i>0
              Interpreter.new.command_726(8,5,10,target.index)
              @spriteset.viewport15.oy = $game_screen.start_shake3(8, 5,10) if $game_switches[$shakeswitches1]==true
               #画面跟着震动强度为角色震动强度
          end
      end
    end
    # 限制动画长度、最低 8 帧
    @wait_count = 8
    # 移至步骤 5
    @phase4_step = 5
  end
  

  
  
end
#==============================================================================
# ■ Game_Screen
#------------------------------------------------------------------------------
#  更改色调以及画面闪烁、保存画面全体关系处理数据的类。本类的实例请参考
# $game_screen。
#==============================================================================

class Game_Screen

  attr_reader   :shake1                    # 震动位置
  attr_reader   :shake2                    # 震动位置
  attr_reader   :shake3                    # 震动位置
  attr_reader   :shake_id                  # 震动的角色
  attr_reader   :shake_id1                 # 震动的敌人
  alias initialize20160523 initialize
  def initialize
    @shake_power1 = 0
    @shake_speed1 = 0
    @shake_power2 = 0
    @shake_speed2 = 0
    @shake_power3 = 0
    @shake_speed3 = 0
    @shake_duration1 = 0
    @shake_direction1 = 1
    @shake_duration2 = 0
    @shake_direction2 = 1
    @shake_duration3 = 0
    @shake_direction3 = 1
    @shake_id=0
    @shake_id1=0
    @shake1 = 0
    @shake2 = 0
    @shake3 = 0
    initialize20160523
  end
#角色震动
   def start_shake1(power, speed, duration,id)
    @shake_power1 = power
    @shake_speed1 = speed
    @shake_id=id
    @shake_duration1 = duration
  end
  #敌人震动
  def start_shake2(power, speed, duration,id)
    @shake_power2 = power
    @shake_speed2 = speed
    @shake_id1=id
    @shake_duration2 = duration
  end
   #画面震动
  def start_shake3(power, speed, duration)
    @shake_power3 = power
    @shake_speed3 = speed
    @shake_duration3 = duration
  end
  
  #刷新画面
  alias update20160523 update
  def update
     update20160523
    if @shake_duration1 >= 1 or @shake1 != 0
      delta1 = (@shake_power1 * @shake_speed1 * @shake_direction1) / 10.0
      if @shake_duration1 <= 1 and @shake1 * (@shake1 + delta1) < 0
        @shake1 = 0
      else
        @shake1 += delta1
      end
      if @shake1 > @shake_power1 * 2
        @shake_direction1 = -1
      end
      if @shake1 < - @shake_power1 * 2
        @shake_direction1 = 1
      end
      if @shake_duration1 >= 1
        @shake_duration1 -= 1
      end
    end

    if @shake_duration2 >= 1 or @shake2 != 0
      delta2 = (@shake_power2 * @shake_speed2 * @shake_direction2) / 10.0
      if @shake_duration2 <= 1 and @shake2 * (@shake2 + delta2) < 0
        @shake2 = 0
      else
        @shake2 += delta2
      end
      if @shake2 > @shake_power2 * 2
        @shake_direction2 = -1
      end
      if @shake2 < - @shake_power2 * 2
        @shake_direction2 = 1
      end
      if @shake_duration2 >= 1
        @shake_duration2 -= 1
      end
    end

  if @shake_duration3 >= 1 or @shake3 != 0
      delta3 = (@shake_power3 * @shake_speed3 * @shake_direction3) / 10.0
      if @shake_duration3 <= 1 and @shake3 * (@shake3 + delta3) < 0
        @shake3 = 0
      else
        @shake3 += delta3
      end
      if @shake3 > @shake_power3 * 2
        @shake_direction3 = -1
      end
      if @shake3 < - @shake_power3 * 2
        @shake_direction3 = 1
      end
      if @shake_duration3 >= 1
        @shake_duration3 -= 1
      end
    end
  end
end

#==============================================================================
# ■ Spriteset_Battle
#------------------------------------------------------------------------------
#  处理战斗画面的活动块的类。本类在 Scene_Battle 类
# 的内部使用。
#==============================================================================

class Spriteset_Battle
  # 敌人方的显示端口
  attr_reader   :viewport8
  attr_reader   :viewport9
  attr_reader   :viewport10
  attr_reader   :viewport11
  attr_reader   :viewport12
  attr_reader   :viewport13
  attr_reader   :viewport14
  attr_reader   :viewport15
  # 角色方的显示端口
  attr_reader   :viewport5
  attr_reader   :viewport6
  attr_reader   :viewport7
  attr_reader   :viewport16
  #其他显示端口

#alias initialize20160523 initialize
def initialize
# 生成显示端口
#initialize20160523
    @viewport1 = Viewport.new(0, 0, 640, 540)
    @viewport2 = Viewport.new(0, 0, 640, 480)
    @viewport3 = Viewport.new(0, 0, 640, 480)
    @viewport4 = Viewport.new(0, 0, 640, 480)
    @viewport15 = Viewport.new(0, 0, 640, 480)
    @viewport2.z = 101
    @viewport3.z = 200
    @viewport4.z = 5000
    # 生成战斗背景活动块
    @battleback_sprite = Sprite.new(@viewport1)
    # 生成敌人活动块
#敌人
    @viewport8 = Viewport.new(0, 0, 640, 480)
    @viewport9 = Viewport.new(0, 0, 640, 480)
    @viewport10 = Viewport.new(0, 0, 640, 480)
    @viewport11 = Viewport.new(0, 0, 640, 480)
    @viewport12 = Viewport.new(0, 0, 640, 480)
    @viewport13 = Viewport.new(0, 0, 640, 480)
    @viewport14 = Viewport.new(0, 0, 640, 480)
   
     @enemy_sprites1 = []
    for enemy in $game_troop.enemies.reverse
      @enemy_sprites1.push(Sprite_Battler.new(@viewport1, enemy))
    end
   
     @enemy_sprites = []
    for enemy in $game_troop.enemies.reverse
      case enemy.index
      when 0
      @enemy_sprites.push(Sprite_Battler.new(@viewport15, enemy))
      when 1
      @enemy_sprites.push(Sprite_Battler.new(@viewport8, enemy))
      when 2
      @enemy_sprites.push(Sprite_Battler.new(@viewport9, enemy))
      when 3
      @enemy_sprites.push(Sprite_Battler.new(@viewport10, enemy))
      when 4
      @enemy_sprites.push(Sprite_Battler.new(@viewport11, enemy))
      when 5
      @enemy_sprites.push(Sprite_Battler.new(@viewport12, enemy))
      when 6
      @enemy_sprites.push(Sprite_Battler.new(@viewport13, enemy))
      when 7
      @enemy_sprites.push(Sprite_Battler.new(@viewport14, enemy))
      end
    end
#角色
    @viewport5 = Viewport.new(0, 0, 640, 480)
    @viewport6 = Viewport.new(0, 0, 640, 480)
    @viewport7 = Viewport.new(0, 0, 640, 480)
    @viewport16= Viewport.new(0, 0, 640, 480)
    @viewport5.z = 101
    @viewport6.z = 101
    @viewport7.z = 101
    @viewport16.z = 101
    @actor_sprites1 = []
    @actor_sprites1.push(Sprite_Battler.new(@viewport2))
    @actor_sprites1.push(Sprite_Battler.new(@viewport2))
    @actor_sprites1.push(Sprite_Battler.new(@viewport2))
    @actor_sprites1.push(Sprite_Battler.new(@viewport2))
    @actor_sprites = []
    @actor_sprites.push(Sprite_Battler.new(@viewport16))
    @actor_sprites.push(Sprite_Battler.new(@viewport5))
    @actor_sprites.push(Sprite_Battler.new(@viewport6))
    @actor_sprites.push(Sprite_Battler.new(@viewport7))
     # 生成天候
    @weather = RPG::Weather.new(@viewport1)
    # 生成图片活动块
    @picture_sprites = []
    for i in 51..100
      @picture_sprites.push(Sprite_Picture.new(@viewport3,
        $game_screen.pictures))
    end
    # 生成计时器块
    @timer_sprite = Sprite_Timer.new
    # 刷新画面
    update
  end
#释放

alias dispose20160523 dispose
def dispose
    dispose20160523
    for sprite in @enemy_sprites + @actor_sprites+@enemy_sprites1 + @actor_sprites1
      sprite.dispose
    end
    @viewport5.dispose
    @viewport6.dispose
    @viewport7.dispose
    @viewport8.dispose
    @viewport9.dispose
    @viewport10.dispose
    @viewport11.dispose
    @viewport12.dispose
    @viewport13.dispose
    @viewport14.dispose
    @viewport15.dispose
    @viewport16.dispose
  end
  
  #--------------------------------------------------------------------------
  # ● 显示效果中判定
  #--------------------------------------------------------------------------
  def effect?
    # 如果是在显示效果中的话就返回 true
    for sprite in @enemy_sprites + @actor_sprites+@enemy_sprites1 + @actor_sprites1
      return true if sprite.effect?
    end
    return false
  end

  #刷新画面
alias update20160523 update
def update
  update20160523
   # 战斗背景的文件名与现在情况有差异的情况下
    if @battleback_name != $game_temp.battleback_name
      @battleback_name = $game_temp.battleback_name
      if @battleback_sprite.bitmap != nil
        @battleback_sprite.bitmap.dispose
      end
      @battleback_sprite.bitmap = RPG::Cache.battleback(@battleback_name)
     # @battleback_sprite.src_rect.set(0, 0, 640, 320)
      @battleback_sprite.src_rect.set(0, 120, 640, 480)
    end
   
     # 刷新战斗者的活动块,开关打开后是另一种效果
    for sprite in @enemy_sprites1 + @actor_sprites1
      sprite.update if $game_switches[$shakeswitches2]==true
    end
   
  tongban=[]
    diren=[]
    for i in 0...$game_party.actors.size
     tongban=$game_party.actors.id
   end
    case $game_screen.shake_id
    when tongban[0]
          @viewport16.oy  = $game_screen.shake1
    when tongban[1]
          @viewport5.oy   = $game_screen.shake1
    when tongban[2]
          @viewport6.oy   = $game_screen.shake1
    when tongban[3]
          @viewport7.oy   = $game_screen.shake1
    end
        
      
for i in 0...$game_troop.enemies.size
   diren=$game_troop.enemies.index
end
case $game_screen.shake_id1
    when diren[0]
          @viewport15.oy   = $game_screen.shake2
    when diren[1]
          @viewport8.oy   = $game_screen.shake2
    when diren[2]
          @viewport9.oy   = $game_screen.shake2
    when diren[3]
          @viewport10.oy   = $game_screen.shake2
    when diren[4]
          @viewport11.oy   = $game_screen.shake2
    when diren[5]
          @viewport12.oy   = $game_screen.shake2
    when diren[6]
          @viewport13.oy   = $game_screen.shake2
    when diren[7]
          @viewport14.oy   = $game_screen.shake2
        end
        
    @viewport1.oy = $game_screen.shake3
    #刷新显示端口

    @viewport5.update
    @viewport6.update
    @viewport7.update
    @viewport8.update
    @viewport9.update
    @viewport10.update
    @viewport11.update
    @viewport12.update
    @viewport13.update
    @viewport14.update
    @viewport15.update
    @viewport16.update


  end

end
#==============================================================================
# ■ Interpreter
#------------------------------------------------------------------------------
#  执行事件命令的解释器。本类在 Game_System 类
# 与 Game_Event 类的内部使用。
#==============================================================================
class Interpreter
def command_725(x,y,z,id)
    # 角色震动开始
    $game_screen.start_shake1(x, y,z*2,id)
    # 继续
    return true
  end
def command_726(x,y,z,id)
    # 敌人震动开始
    $game_screen.start_shake2(x, y,z*2,id)
    # 继续
    return true
  end
def command_727(x,y,z)
    # 敌人震动开始
    $game_screen.start_shake3(x, y,z*2)
    # 继续
    return true
  end
end
[/pre]


应该会和其他类战斗冲突吧。
具体的用法写在脚本注释里面了,这里有范例

战斗画面抖动.zip

1.46 MB, 下载次数: 113

点评

取技能id  发表于 2016-5-24 20:08
指定某个特技才会出现画面震动怎么弄啊……  发表于 2016-5-24 20:01
。。。大概就是里面那样了,其实可以做得更简单和保险,只是我现在没那种能力。  发表于 2016-5-23 19:33
有的,我现在在完善第一个脚本。  发表于 2016-5-23 17:30
恩,这个可以实现震动次数。那个魔法伤害不震动有没有办法呢  发表于 2016-5-23 15:40
回复

使用道具 举报

梦石
0
星屑
50
在线时间
168 小时
注册时间
2007-7-26
回帖
427
 楼主| 发表于 2016-5-23 21:14:11 | 显示全部楼层
夜狠简单 发表于 2016-5-23 14:52
[fold=战斗画面震动]#by RK
#插到Main前
$shakeswitches=40#40号开关。可以改

这个汗一个!  {:2_253:}
上面那个脚本可以,只是被魔法攻击时,受伤不会震动,有时候会有震动一下。其他的没问题。

但是下面这个脚本咋地啦?画面没有震动啊,敌人跳一下,打角色,角色受伤也跟着跳一下。
然后角色也是跳一下才去打敌人,敌人受伤也跳一下。这?????玩吗?{:2_263:}

点评

Interpreter.new.command_726(5,5,5,@active_battler.index) 注释掉这几个,前面有注释内容  发表于 2016-5-23 21:45
不要角色攻击前跳,注释掉相应的部分就好了  发表于 2016-5-23 21:44
我就是打开了,但是攻击者也要跳一下?  发表于 2016-5-23 21:44
40号开关打开画面才会更正受伤的角色跳。  发表于 2016-5-23 21:42
3个开关都试过了,每个敌人攻击的时候都要跳下一吗?  发表于 2016-5-23 21:17
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部