Project1

标题: 如何在脚本中调用一个动画效果 [打印本页]

作者: clap_pl    时间: 2008-10-29 18:53
标题: 如何在脚本中调用一个动画效果
请问一下如何在脚本中调用一个动画效果

我想实现这样的效果
当角色造成致命一击(会心一击)的时候
在角色的地方播放预选设置好的一个动画
并对角色的某些数值做一定的增减

脚本中好像又这么一句
当攻击者的速度比上挨打者的敏捷的值小于一个随机数的时候
就发动致命一击,致命的伤害是原伤害的2倍

想在这里加一句
判断攻击者是不是 ACTOR
判断攻击者身上是不是带有指定的装饰品
如果是 则调用某个动画
并恢复攻击者的生命(最好能像使用技能那样,有一个表示回血的数字跳出来)

我用的是RTB战斗系统脚本

谢谢
请大家帮我看看
困扰好久了-。- [LINE]1,#dddddd[/LINE]此贴于 2008-10-30 11:40:53 被版主darkten提醒,请楼主看到后对本贴做出回应。 [LINE]1,#dddddd[/LINE]此贴于 2008-11-1 13:17:31 被版主darkten提醒,请楼主看到后对本贴做出回应。 [LINE]1,#dddddd[/LINE]版务信息:本贴由楼主自主结贴~
作者: 3nξhα0_lim    时间: 2008-10-29 19:34
提示: 作者被禁止或删除 内容自动屏蔽
作者: clap_pl    时间: 2008-10-29 19:56
是啊
感谢~
{/ll}有###################那部分是我自己加的

def skill_effect(user, skill)
    # クリティカルフラグをクリア
    self.critical[user] = false
    state_p[user] = []
    state_m[user] = []
    # スキルの効果範囲が HP 1 以上の味方で、自分の HP が 0、
    # またはスキルの効果範囲が HP 0 の味方で、自分の HP が 1 以上の場合
    if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
       ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
      # メソッド終了
      return false
    end
    # 有効フラグをクリア
    effective = false
    # コモンイベント ID が有効の場合は有効フラグをセット
    effective |= skill.common_event_id > 0
    # 第一命中判定
    hit = skill.hit
    if skill.atk_f > 0
      hit *= user.hit / 100
    end
    hit_result = (rand(100) < hit)
    # 不確実なスキルの場合は有効フラグをセット
    effective |= hit < 100
    # 命中の場合
    if hit_result == true
      # 威力を計算
      power = skill.power + user.atk * skill.atk_f / 100
      if power > 0
        power -= self.pdef * skill.pdef_f / 200
        power -= self.mdef * skill.mdef_f / 200
        power = [power, 0].max
      end
      # 倍率を計算
      rate = 20
      rate += (user.str * skill.str_f / 100)
      rate += (user.dex * skill.dex_f / 100)
      rate += (user.agi * skill.agi_f / 100)
      rate += (user.int * skill.int_f / 100)
      # 基本ダメージを計算
      self.damage[user] = power * rate / 20
      # 属性修正
      self.damage[user] *= elements_correct(skill.element_set)
      self.damage[user] /= 100
      # ダメージの符号が正の場合
      if self.damage[user] > 0
               
        if skill.pdef_f != 0
################################################PL修改更改暴击值的装备
        cri = 0                     ########### 设置致命附加值
        if user.is_a?(Game_Actor)
          case user.armor4_id  
          when 152 ##############如果佩戴了致命石
            cri = 15
          end
        end
##########################################################
        if user.is_a?(Game_Actor)###物理技能只有角色才出暴击
        if rand(100) < 4 * user.dex / self.dex + 8 + cri
          self.damage[user] *= 2
          self.critical[user] = true
##############################################暴击后出特效的装备
          if user.is_a?(Game_Actor)         
          case user.armor4_id  
          when 151 ####不倒之戒
            user.hp += user.maxhp/5     #致命攻击时恢复攻击者20%的生命
                    
          end
        end
        end
########################################pl修改 法术致命只跟使用者智力相关
        end
      elsif skill.mdef_f != 0
        if rand(100) < user.int / 50 + 8#致命几率=智力/50+8
          self.damage[user] *= 2
          self.critical[user] = true
        end
        end        
###########################################PL修改
        # 防御修正
        if self.guarding?
          self.damage[user] /= 2
        end
      end
      # 分散
      if skill.variance > 0 and self.damage[user].abs > 0
        amp = [self.damage[user].abs * skill.variance / 100, 1].max
        self.damage[user] += rand(amp+1) + rand(amp+1) - amp
      end
      # 第二命中判定
      eva = 8 * self.agi / user.dex + self.eva
      hit = self.damage[user] < 0 ? 100 : 100 - eva * skill.eva_f / 100
      hit = self.cant_evade? ? 100 : hit
      hit_result = (rand(100) < hit)
      # 不確実なスキルの場合は有効フラグをセット
      effective |= hit < 100
    end
    # 命中の場合
    if hit_result == true
      # 威力 0 以外の物理攻撃の場合
      if skill.power != 0 and skill.atk_f > 0
        # ステート衝撃解除
        remove_states_shock
        # 有効フラグをセット
        effective = true
      end
      # HP の変動判定
      last_hp = [[self.hp - self.damage[user], self.maxhp].min, 0].max
      # 効果判定
      effective |= self.hp != last_hp
      # ステート変化
      @state_changed = false
      effective |= states_plus(user, skill.plus_state_set)
      effective |= states_minus(user, skill.minus_state_set)
      unless $game_temp.in_battle
        self.damage_effect(user, 1)
      end
      # 威力が 0 の場合
      if skill.power == 0
        # ダメージに空文字列を設定
        self.damage[user] = ""
        # ステートに変化がない場合
        unless @state_changed
          # ダメージに "Miss" を設定
          self.damage[user] = "Miss"
        end
      end
    # ミスの場合
    else
      # ダメージに "Miss" を設定
      self.damage[user] = "Miss"
    end
    # 戦闘中でない場合
    unless $game_temp.in_battle
      # ダメージに nil を設定
      self.damage[user] = nil
    end
    # メソッド終了
    return effective
  end
作者: 3nξhα0_lim    时间: 2008-10-29 20:02
提示: 作者被禁止或删除 内容自动屏蔽
作者: clap_pl    时间: 2008-10-29 20:32
似乎不行 没有反应 但也没报错
作者: 3nξhα0_lim    时间: 2008-10-29 20:35
提示: 作者被禁止或删除 内容自动屏蔽
作者: clap_pl    时间: 2008-10-29 21:27
奇怪了 还是没有反应啊 为什么不播放动画呢 {/dk}
作者: 塑望    时间: 2008-10-29 21:40
脚本调用公共事件可以不...

可以在Scene_Battle 4里如下设置

   if @skill.id == 57
     # 设置事件
   
     common_event = $data_common_events[1]
     $game_system.battle_interpreter.setup($data_common_events[1].list, 0)
   end

调用公共事件...然后公共事件里放动画或图片{/gg}

估计这个方法也不灵光?
作者: 塑望    时间: 2008-10-29 21:41
if @skill.id == 57 注意..技能ID  自己调动
作者: dbshy    时间: 2008-10-30 04:36
手上没脚本,请LZ把rtab中的spriteset_battler的脚本贴一下
作者: 3nξhα0_lim    时间: 2008-10-30 04:41
提示: 作者被禁止或删除 内容自动屏蔽
作者: clap_pl    时间: 2008-10-31 20:07
class Sprite_Battler < RPG::Sprite
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    # バトラーが nil の場合
    if @battler == nil
      self.bitmap = nil
      loop_animation(nil)
      return
    end
    # ファイル名か色相が現在のものと異なる場合
    if @battler.battler_name != @battler_name or
       @battler.battler_hue != @battler_hue
      # ビットマップを取得、設定
      @battler_name = @battler.battler_name
      @battler_hue = @battler.battler_hue
      self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
      @width = bitmap.width
      @height = bitmap.height
      self.ox = @width / 2
      self.oy = @height
      if @battler.is_a?(Game_Enemy)
        @battler.height = @height
      end
      # 戦闘不能または隠れ状態なら不透明度を 0 にする
      if @battler.dead? or @battler.hidden
        self.opacity = 0
      end
    end
    # アニメーション ID が現在のものと異なる場合
    if @battler.state_animation_id != @state_animation_id
      @state_animation_id = @battler.state_animation_id
      loop_animation($data_animations[@state_animation_id])
    end
    # 表示されるべきアクターの場合
    if @battler.is_a?(Game_Actor) and @battler_visible
      # メインフェーズでないときは不透明度をやや下げる
      if $game_temp.battle_main_phase
        self.opacity += 3 if self.opacity < 255
      else
        self.opacity -= 3 if self.opacity > 207
      end
    end
    # 明滅
    if @battler.blink
      blink_on
    else
      blink_off
    end
    # 不可視の場合
    unless @battler_visible
      # 出現
      if not @battler.hidden and not @battler.dead? and
         (@battler.damage.size < 2 or @battler.damage_pop.size < 2)
        appear
        @battler_visible = true
      end
    end
    # ダメージ
    for battler in @battler.damage_pop
      if battler[0].class == Array
        if battler[0][1] >= 0
          $scene.skill_se
        else
          $scene.levelup_se
        end
        damage(@battler.damage[battler[0]], false, 2)
      else
        damage(@battler.damage[battler[0]], @battler.critical[battler[0]])
      end
      if @battler.damage_sp.include?(battler[0])
        damage(@battler.damage_sp[battler[0]],
                @battler.critical[battler[0]], 1)
        @battler.damage_sp.delete(battler[0])
      end
      @battler.damage_pop.delete(battler[0])
      @battler.damage.delete(battler[0])
      @battler.critical.delete(battler[0])
    end
    # 可視の場合
    if @battler_visible
      # 逃走
      if @battler.hidden
        $game_system.se_play($data_system.escape_se)
        escape
        @battler_visible = false
      end
      # 白フラッシュ
      if @battler.white_flash
        whiten
        @battler.white_flash = false
      end
      # アニメーション
      unless @battler.animation.empty?
        for animation in @battler.animation.reverse
          animation($data_animations[animation[0]], animation[1])
          @battler.animation.delete(animation)
        end
      end
      # コラプス
      if @battler.damage.empty? and @battler.dead?
        if $scene.dead_ok?(@battler)
          if @battler.is_a?(Game_Enemy)
            $game_system.se_play($data_system.enemy_collapse_se)
          else
            $game_system.se_play($data_system.actor_collapse_se)
          end
          collapse
          @battler_visible = false
        end
      end
    end
    # スプライトの座標を設定
    self.x = @battler.screen_x
    self.y = @battler.screen_y
    self.z = @battler.screen_z
    #self.opacity = 255 ########pl修改
   
    if @battler.is_a?(Game_Enemy)
      self.zoom_x = @battler.real_zoom * @battler.zoom
      self.zoom_y = @battler.real_zoom * @battler.zoom
    end
  end
end
作者: clap_pl    时间: 2008-10-31 20:15
太感谢了 {/ll}{/ll}
这里人真的好热情啊
对了 在使用RTAB的时候
使用 http://rpg.blue/web/htm/news421.htm 这个长期显示血条脚本时 总是出现 带入变量的错误,不知道这么可以修改一下

作者: dbshy    时间: 2008-11-1 01:30
SPRITE_BATTLER 中 UPDATE
加下面一段

if @battler.animation_id != 0
        animation = $data_animations[@battler.animation_id]
        animation(animation, @battler.animation_hit)
        @battler.animation_id = 0
      end


然后在按前面在SKILL_EFFECT中家
SELF.ANIMATION_ID = ID

PS:这个只是根据上面的脚本推测的,不一定对
   没有完全的脚本,所以@battler.animation这个数组也不知道干啥用
[LINE]1,#dddddd[/LINE]系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~
作者: clap_pl    时间: 2008-11-1 21:26
似乎是可以了
谢谢各位热心帮助
谢谢!!!!!{/ll}
对了 能不能把动画加一点延迟呢




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