Project1

标题: 发一个自己做的脚本试一下 [打印本页]

作者: lucifer4223    时间: 2013-10-25 00:21
标题: 发一个自己做的脚本试一下
(, 下载次数: 52) (, 下载次数: 53) (, 下载次数: 57)

战场上的相机,因为到处都找不到独立可用的,我自己做了一个。

[pre lang="ruby" line="1"]#==============================================================================
#
# ◇ ◇ 尚未完成的 Flan系统(芙兰朵露·斯卡雷特)by =Lucifer·Heroin= ◇ ◇
#
# ◇ ◇ 战场上的相机
#==============================================================================
class Scene_Battle
  
  # ● 定义实例变量,相当于一个临时容器,传递战斗指令的状态
  
  attr_reader   :spriteset
  # 为了别处能够调用战场背景的缩放,位移
  # 但不能写入,以免影响 Spriteset_Battle 里卷动操作。
  
  attr_reader   :flan_speed
  # 镜头变化的速度(方便控制战斗节奏)固定住,其他任何地方只能读取他。
  
  
  # 一个初始化函数。没有任何别的作用。仅在开战时被调用一次。
  def flan_start
   
    @flan_speed = 15
   
  end

# flan_start 初始化各种实变量
# flan_battle 连接战场,刷新画面
# flan_jud 得到敌人,角色的信息
# @field_id 当前角色,或者指向敌人的 ID
# 0,1,2,3 是角色。6..13 是敌人,所以敌人index默认 +6
# 17 角色使用全体技能。


#====◆=============================================================
  def main
    # 初始化战斗用的各种暂时数据
    $game_temp.in_battle = true
    $game_temp.battle_turn = 0
    $game_temp.battle_event_flags.clear
    $game_temp.battle_abort = false
    $game_temp.battle_main_phase = false
    $game_temp.battleback_name = $game_map.battleback_name
    $game_temp.forcing_battler = nil
    # 初始化战斗用事件解释器
    $game_system.battle_interpreter.setup(nil, 0)
    # 准备队伍
    @troop_id = $game_temp.battle_troop_id
    $game_troop.setup(@troop_id)
   
    #====◆=============================================================
    flan_start
    # 关键接入口,初始化各种实变量
    #====  =============================================================
   
    # 生成角色命令窗口
    s1 = $data_system.words.attack
    s2 = $data_system.words.skill
    s3 = $data_system.words.guard
    s4 = $data_system.words.item
    @actor_command_window = Window_Command.new(160, [s1, s2, s3, s4])
    @actor_command_window.y = 160
    @actor_command_window.back_opacity = 160
    @actor_command_window.active = false
    @actor_command_window.visible = false
    # 生成其它窗口
    @party_command_window = Window_PartyCommand.new
    @help_window = Window_Help.new
    @help_window.back_opacity = 160
    @help_window.visible = false
    @status_window = Window_BattleStatus.new
    @message_window = Window_Message.new
    # 生成活动块
    @spriteset = Spriteset_Battle.new
    # 初始化等待计数
    @wait_count = 0
    # 执行过渡
    if $data_system.battle_transition == ""
      Graphics.transition(20)
    else
      Graphics.transition(40, "Graphics/Transitions/" +
        $data_system.battle_transition)
    end
    # 开始自由战斗回合
    start_phase1
    # 主循环
    loop do
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 刷新画面
      update
      # 如果画面切换的话就中断循环
      if $scene != self
        break
      end
    end
    # 刷新地图
    $game_map.refresh
    # 准备过渡
    Graphics.freeze
    # 释放窗口
    @actor_command_window.dispose
    @party_command_window.dispose
    @help_window.dispose
    @status_window.dispose
    @message_window.dispose
    if @skill_window != nil
      @skill_window.dispose
    end
    if @item_window != nil
      @item_window.dispose
    end
    if @result_window != nil
      @result_window.dispose
    end
    # 释放活动块
    @spriteset.dispose
    # 标题画面切换中的情况
    if $scene.is_a?(Scene_Title)
      # 淡入淡出画面
      Graphics.transition
      Graphics.freeze
    end
    # 战斗测试或者游戏结束以外的画面切换中的情况
    if $BTEST and not $scene.is_a?(Scene_Gameover)
      $scene = nil
    end
  end
#====◆=============================================================
  def update
    # 执行战斗事件中的情况下
    if $game_system.battle_interpreter.running?
      # 刷新解释器
      $game_system.battle_interpreter.update
      # 强制行动的战斗者不存在的情况下
      if $game_temp.forcing_battler == nil
        # 执行战斗事件结束的情况下
        unless $game_system.battle_interpreter.running?
          # 继续战斗的情况下、再执行战斗事件的设置
          unless judge
            setup_battle_event
          end
        end
        # 如果不是结束战斗回合的情况下
        if @phase != 5
          # 刷新状态窗口
          @status_window.refresh
        end
      end
    end
    # 系统 (计时器)、刷新画面
    $game_system.update
    $game_screen.update
    # 计时器为 0 的情况下
    if $game_system.timer_working and $game_system.timer == 0
      # 中断战斗
      $game_temp.battle_abort = true
    end
    # 刷新窗口
    @help_window.update
    @party_command_window.update
    @actor_command_window.update
    @status_window.update
    @message_window.update
    # 刷新活动块
   
    #====◆=============================================================
    # 这里必须有,用来刷新 flan_battle,实际改变背景
    @spriteset.flan_battle
    @spriteset.update
    #====  =============================================================
   
    # 处理过渡中的情况下
    if $game_temp.transition_processing
      # 清除处理过渡中标志
      $game_temp.transition_processing = false
      # 执行过渡
      if $game_temp.transition_name == ""
        Graphics.transition(20)
      else
        Graphics.transition(40, "Graphics/Transitions/" +
          $game_temp.transition_name)
      end
    end
    # 显示信息窗口中的情况下
    if $game_temp.message_window_showing
      return
    end
    # 显示效果中的情况下
    if @spriteset.effect?
      return
    end
    # 游戏结束的情况下
    if $game_temp.gameover
      # 切换到游戏结束画面
      $scene = Scene_Gameover.new
      return
    end
    # 返回标题画面的情况下
    if $game_temp.to_title
      # 切换到标题画面
      $scene = Scene_Title.new
      return
    end
    # 中断战斗的情况下
    if $game_temp.battle_abort
      # 还原为战斗前的 BGM
      $game_system.bgm_play($game_temp.map_bgm)
      # 战斗结束
      battle_end(1)
      return
    end
    # 等待中的情况下
    if @wait_count > 0
      # 减少等待计数
      @wait_count -= 1
      return
    end
    # 强制行动的角色存在、
    # 并且战斗事件正在执行的情况下
    if $game_temp.forcing_battler == nil and
       $game_system.battle_interpreter.running?
      return
    end
    # 回合分支
    case @phase
    when 1  # 自由战斗回合
      update_phase1
    when 2  # 同伴命令回合
      update_phase2
    when 3  # 角色命令回合
      update_phase3
    when 4  # 主回合
      update_phase4
    when 5  # 战斗结束回合
      update_phase5
    end
  end
#====◆=============================================================
  def phase3_setup_command_window
    # 同伴指令窗口无效化
    @party_command_window.active = false
    @party_command_window.visible = false
    # 角色指令窗口无效化
    @actor_command_window.active = true
    @actor_command_window.visible = true
    # 设置角色指令窗口的位置
    @actor_command_window.x = @actor_index * 160
    # 设置索引为 0
    @actor_command_window.index = 0
   
    #====◆=============================================================
    a = @actor_index
    $scene.spriteset.flan_jud(a)
    # 包含了转向下一个,前一个
    #====  =============================================================
   
  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)
        
        #====  =============================================================
        # 完全OK,敌人普通攻击,行动方
        #====  =============================================================
        
        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)
        if @active_battler.restriction == 3
          target = $game_party.random_target_actor
        elsif @active_battler.restriction == 2
         
          #这个时候的 index 是 -1
          target = $game_troop.random_target_enemy
          #====◆ 1 ==========================================================
         
          a = target.index + 6
          $scene.spriteset.flan_jud(a)
          # 角色普通攻击,对随机,的敌人 ID
          #====  =============================================================
        else
          index = @active_battler.current_action.target_index
          target = $game_troop.smooth_target_enemy(index)
         
          #====◆ 2 ==========================================================
          a = index + 6
          $scene.spriteset.flan_jud(a)
          # 角色普通攻击,对选择,的敌人 ID
          #====  =============================================================
         
        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
      
      #====◆ 3 ==========================================================
      # 区分敌人和角色,角色 ID
      if @active_battler.is_a?(Game_Actor)
        
        # 行动方的 ID,角色 0,1,2,3 敌人 0,1,2...
        a = @active_battler.index
        $scene.spriteset.flan_jud(a)
      end
      #====  =============================================================
      
      # 帮助窗口显示"防御"
      @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
      
       #====  =============================================================
       # 敌人,完全OK
       #====  =============================================================
      
      #  帮助窗口显示"逃跑"
      @help_window.set_text("逃跑", 1)
      # 逃跑
      @active_battler.escape
      return
    end
    # 什么也不做的情况下
    if @active_battler.current_action.basic == 3
      
      #====  =============================================================
      # 区分敌人和角色,完全OK
      # 跳过速度过快,CP战的情况下,就不至于那么快
      #====  =============================================================
      
      # 清除强制行动对像的战斗者
      $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)
      # 效果范围分支
      case scope
      when 1  # 敌单体
        index = @active_battler.current_action.target_index
        @target_battlers.push($game_party.smooth_target_actor(index))
      when 2  # 敌全体
        
        #====◆ 4 ==========================================================
        
        a = @active_battler.index + 6
        $scene.spriteset.flan_jud(a)
        # 使用技能对角色全体,的敌人 ID
        #====  =============================================================
        
        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))
        
        #====◆ 5 ==========================================================
        a = index + 6
        $scene.spriteset.flan_jud(a)
        # 角色使用技能或物品,对敌方单体,目标敌人 ID
        #====  =============================================================
        
      when 2  # 敌全体
        
        #====◆ 6 ==========================================================
        $scene.spriteset.flan_jud(17)
        # 完全OK,角色使用技能或物品对敌全
        #====  =============================================================
        
        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
#====◆=============================================================
end


#==============================================================================

#==============================================================================
class Arrow_Enemy < Arrow_Base
  def update
    super
    $game_troop.enemies.size.times do
      break if self.enemy.exist?
      @Index += 1
      @index %= $game_troop.enemies.size
    end
    if Input.repeat?(Input::RIGHT)
      $game_system.se_play($data_system.cursor_se)
      $game_troop.enemies.size.times do
        @index += 1
        @index %= $game_troop.enemies.size
        break if self.enemy.exist?
      end
      
      #====◆=============================================================
      a = @index + 6
      $scene.spriteset.flan_jud(a)
      # 这里任何操作,实际就是发出了信号
      # 在这里可以知道现在选中的敌人,将信息传给战斗背景
      #====  =============================================================
    end
    if Input.repeat?(Input::LEFT)
      $game_system.se_play($data_system.cursor_se)
      $game_troop.enemies.size.times do
        @index += $game_troop.enemies.size - 1
        @index %= $game_troop.enemies.size
        break if self.enemy.exist?
      end
      
      #====◆=============================================================
      a = @index + 6
      $scene.spriteset.flan_jud(a)
      #====  =============================================================
    end
   
    if self.enemy != nil
      self.x = self.enemy.screen_x
      self.y = self.enemy.screen_y
    end
  end
end
#==============================================================================


#==============================================================================
class Win_Test < Window_Base
  
  
  attr_accessor :a_x
  attr_accessor :a_y
  attr_accessor :a_z
  
  attr_accessor :b_x
  attr_accessor :b_y
  attr_accessor :b_z
  
  def initialize  # 初始化窗口
    super(300, 50, 300, 200)
    self.contents = Bitmap.new(width - 32, height - 32)
   
    @a_x = 0
    @a_y = 0
    @a_z = 0
   
    @b_x = 0
    @b_y = 0
    @b_z = 0
   
    refresh
  end
  
  def refresh  # 刷新显示
    self.contents.clear
   
    text1="t_x "+@a_x.to_i.to_s+","+@a_y.to_i.to_s+","+(@a_z*100).to_i.to_s
    text2="feild "+@b_x.to_i.to_s+","+@b_y.to_i.to_s+","+(@b_z*100).to_i.to_s
   
    self.contents.draw_text(0, 0, 300, 32, text1)
    self.contents.draw_text(0, 32, 300, 32, text2)
   
    #-------------------------------------
  end
end
#==============================================================================


#==============================================================================
class Spriteset_Battle
  
  attr_reader   :field_x
  attr_reader   :field_y
  attr_reader   :field_zoom
  # 别处只可读取,不能写入影响背景。
  # 当背景缩放时,告诉 Game_Enemy 同步要缩放多少
  # 真正的当前背景缩放大小
  
  def initialize
    @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
   
    #====◆=============================================================
    @field_x = 0
    @field_y = 0
    @field_zoom = 1.0
   
    # 以下仅在战场内部使用。win_tes 主动复制了这些数据
    @g_x = 320 # 为了刚开战居中放大一次
    @g_y = 80
    @g_zm = 1.0 # gap_zoom,在卷动前临时存入当前缩放值
   
    @t_x = 320
    @t_y = 80
    @t_zm = 1.3 # target_zoom,在卷动前临时存入目标缩放值
   
    @field_id = 17
    @flan_energy = $scene.flan_speed
   
    #====  =============================================================
    @win_tes = Win_Test.new ##
    @win_tes.opacity = 64
   
   
    @battleback_sprite = Sprite.new(@viewport1)
    @enemy_sprites = []
    for enemy in $game_troop.enemies.reverse
      @enemy_sprites.push(Sprite_Battler.new(@viewport1, enemy))
    end
    @actor_sprites = []
    @actor_sprites.push(Sprite_Battler.new(@viewport2))
    @actor_sprites.push(Sprite_Battler.new(@viewport2))
    @actor_sprites.push(Sprite_Battler.new(@viewport2))
    @actor_sprites.push(Sprite_Battler.new(@viewport2))
    @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
  def dispose
    if @battleback_sprite.bitmap != nil
      @battleback_sprite.bitmap.dispose
    end
    @battleback_sprite.dispose
    for sprite in @enemy_sprites + @actor_sprites
      sprite.dispose
    end
    @weather.dispose
    for sprite in @picture_sprites
      sprite.dispose
    end
    @timer_sprite.dispose
    @win_tes.dispose ##
    #====  =============================================================
   
    @viewport1.dispose
    @viewport2.dispose
    @viewport3.dispose
    @viewport4.dispose
  end
  def update
    @actor_sprites[0].battler = $game_party.actors[0]
    @actor_sprites[1].battler = $game_party.actors[1]
    @actor_sprites[2].battler = $game_party.actors[2]
    @actor_sprites[3].battler = $game_party.actors[3]
    if @battleback_name != $game_temp.battleback_name
      flan_battle
      # ◇ ◆ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇
    end
   
    flan_text
    flan_scroll
   
   
   
    # 修正,告诉 Game_Enemy 当前背景画面大小
    # ◇ ↓ ◇ 敌人已经完全和背景黏住 ◇ ◆ ◇ 重点
#=begin
    for enemy in $game_troop.enemies
      enemy.enemy_x = @field_x
      enemy.enemy_y = @field_y
      enemy.enemy_zoom = @field_zoom
    end
#=end
   
    @win_tes.a_x = @t_x
    @win_tes.a_y = @t_y
    @win_tes.a_z = @t_zm
    @win_tes.b_x = @field_x
    @win_tes.b_y = @field_y
    @win_tes.b_z = @field_zoom
   
    # 将选中的目标,的屏幕 x,y 传给 win_tes
    # 这个坐标是现在画面上怪的实际坐标,不是数据库里的
    #====◆=============================================================
    @win_tes.refresh ##
   
   
    for sprite in @enemy_sprites + @actor_sprites
      sprite.update
    end
    @weather.type = $game_screen.weather_type
    @weather.max = $game_screen.weather_max
    @weather.update
    for sprite in @picture_sprites
      sprite.update
    end
    @timer_sprite.update
    @viewport1.tone = $game_screen.tone
    @viewport1.ox = $game_screen.shake
    @viewport4.color = $game_screen.flash_color
    @viewport1.update
    @viewport2.update
    @viewport4.update
  end
  # #====  =============================================================
  
  def flan_battle # 因为这里也在刷新,所以不能有动态的东西
    @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.zoom_x = @field_zoom
    @battleback_sprite.zoom_y = @field_zoom
   
    # ◇ ↓ ◇ 敌人已经完全和背景黏住 ◇ ◆ ◇ 重点
    @battleback_sprite.ox = @field_x
    @battleback_sprite.x = @field_x
    @battleback_sprite.oy = @field_y
    @battleback_sprite.y = @field_y
   
  end
  
  #------------------ #------------------ #------------------
  def flan_text
   
    text1 = "成员 " + @field_id.to_s
    text2 = "En " + @flan_energy.to_s
   
    @battleback_sprite.bitmap.font.size = 14
    @battleback_sprite.bitmap.draw_text(250, 100, 120, 32, text1)
    @battleback_sprite.bitmap.draw_text(250, 115, 120, 32, text2)
   
  end
  
  #------------------ #------------------ #------------------
  def flan_jud(a)  # 仅在外部被启动
   
    @g_x =@field_x # 暂存现在的场景中心点
    @g_y =@field_y
    @g_zm =@field_zoom
   
    @field_id = a # 外部操作得到当前角色或敌人信息
    # 根据 ID 来判断,并得出目标缩放的 中心点,大小
   
    case @field_id
    when 17 # 全屏居中
      @t_x = 320
      @t_y = 160
      @t_zm = 1.0
      
    when 0..3 # 角色行动
      @t_x = 240 + 80 * a
      @t_y = 80
      @t_zm = 1.3
      
    when 6..13 # 聚焦敌人
      
      emx = $game_troop.enemies[a-6].or_x
      emy = $game_troop.enemies[a-6].or_y
      emz = $game_troop.enemies[a-6].or_z
      @t_zm = (1 /emz)/2 + 1
      @t_x = emx
      @t_y = emy - 180 * emz
      
      # 对于缩放后的修,因为怪的位置太高,导致只看到脚
      # 并且越是远的敌人修正越少。
      # 判断是否会漏黑,重新设定 @t_
      # if (320 - @t_x)
      
    end
   
    @flan_energy = $scene.flan_speed
  end
  
  #------------------ #------------------ #------------------
  def flan_scroll
    # 卷动操作,也就是在有能量时,循环修正当前画面大小,t_,g_ 都不会自己改变
   
    if @flan_energy > 0
      
      e = $scene.flan_speed - @flan_energy + 1
      #------------------
      x = @t_x - @g_x
      @field_x = @g_x + x * e**2 / $scene.flan_speed**2
      
      y = @t_y - @g_y
      @field_y = @g_y + y * e**2 / $scene.flan_speed**2
      
      z = @t_zm - @g_zm  # 从原先 →到目标
      @field_zoom = @g_zm + z * e**2 / $scene.flan_speed**2
      #------------------
      
      @flan_energy -= 1
    end
   
  end
  #---------------------------------------------------
end
#==============================================================================


#==============================================================================
class Sprite_Battler < RPG::Sprite
  
  def update
    super
    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.dead? or @battler.hidden
        self.opacity = 0
      end
    end
    if @battler.damage == nil and
       @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 == nil or @battler.damage_pop)
        appear
        @battler_visible = true
      end
    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
      if @battler.animation_id != 0
        animation = $data_animations[@battler.animation_id]
        animation(animation, @battler.animation_hit)
        @battler.animation_id = 0
      end
      if @battler.damage_pop
        damage(@battler.damage, @battler.critical)
        @battler.damage = nil
        @battler.critical = false
        @battler.damage_pop = false
      end
      if @battler.damage == nil and @battler.dead?
        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
    self.x = @battler.screen_x
    self.y = @battler.screen_y
    self.z = @battler.screen_z
    #---------------------------------------------------
    # 如果是敌人的话,读取敌人函数(传递过来的缩放值)并改变精灵大小
   
    if @battler.is_a?(Game_Enemy)
      self.zoom_x = @battler.screen_zoom
      self.zoom_y = @battler.screen_zoom
      
    end
    # ◇ ◆ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇
   
  end
end
#==============================================================================


#==============================================================================
class Game_Enemy < Game_Battler
  
  attr_accessor :enemy_x
  attr_accessor :enemy_y
  attr_accessor :enemy_zoom
  # 可读可写被,背景缩放改变时,写入新值。
  # Sprite_Battler 里需要时,读取这个值,改变画面上敌人缩放,位置
  
  #---------------------------------------------------
  def initialize(troop_id, member_index)
    super()
    @troop_id = troop_id
    @member_index = member_index
    troop = $data_troops[@troop_id]
    @enemy_id = troop.members[@member_index].enemy_id
    enemy = $data_enemies[@enemy_id]
    @battler_name = enemy.battler_name
    @battler_hue = enemy.battler_hue
    @hp = maxhp
    @sp = maxsp
   
    #---------------------------------------------------
    @size = troop.members.size
    @enemy_x = 0
    @enemy_y = 0
    @enemy_zoom = 1.0
   
    @hidden = troop.members[@member_index].hidden
    @immortal = troop.members[@member_index].immortal
  end
  #---------------------------------------------------
  # 设计,重新摆放阵型,罗列敌人队伍从 1只怪,到 8只怪
  # 缩放产生透视,最小 0.25,最大 1.0,中等 0.5。
  def screen_x
    case @size
    # - - - - - - - - #
    when 1
      return 320
    # - - - - - - - - #
    when 2
      case @member_index
      when 0
        return 200
      when 1
        return 440
      end
    # - - - - - - - - #
    when 3
      case @member_index
      when 0
        return 200
      when 1
        return 320
      when 2
        return 440
      end
    # - - - - - - - - #
    when 5
      case @member_index
      when 0
        return 160
      when 1
        return 240
      when 2
        return 320
      when 3
        return 400
      when 4
        return 480
      end
      
      
    else  # 防止出现没设计过的
      return $data_troops[@troop_id].members[@member_index].x
    end
  end
  #---------------------------------------------------
  
  
  def screen_y
    case @size
    # - - - - - - - - #
    when 1,2
      return 240
    # - - - - - - - - #
    when 3
      case @member_index
      when 0
        return 240
      when 1
        return 200
      when 2
        return 240
      end
    # - - - - - - - - #
    when 5
      case @member_index
      when 0
        return 240
      when 1
        return 160
      when 2
        return 200
      when 3
        return 160
      when 4
        return 240
      end
      
      
      
    else
      return $data_troops[@troop_id].members[@member_index].y
    end
  end
  #---------------------------------------------------
  
  
  def screen_zoom
    case @size
    # - - - - - - - - #
    when 1,2
      return 0.75
    when 3
      case @member_index
      when 0
        return 0.75
      when 1
        return 0.5
      when 2
        return 0.75
      end
    # - - - - - - - - #
    when 5
      case @member_index
      when 0
        return 0.75
      when 1
        return 0.25
      when 2
        return 0.5
      when 3
        return 0.25
      when 4
        return 0.75
      end
      
      
    else # 没设计的怪都是“最大”
      return 0.75
    end
  end
  
  
  
  #---------------------------------------------------
  alias :or_x :screen_x # 给原始敌人的屏幕坐标起别名
  alias :or_y :screen_y # 从此,or_x 才是数据库里的,不会被修改
  alias :or_z :screen_zoom
  
  # 重新定义,经过缩放后怪物在屏幕上的位置,给 Sprite_Battler 调用
  def screen_x
    return @enemy_x - (@enemy_x - or_x) * @enemy_zoom
  end
  
  def screen_y
    return @enemy_y - (@enemy_y - or_y) * @enemy_zoom
  end
  
  def screen_zoom
    return @enemy_zoom * or_z
  end
  
  #---------------------------------------------------
end
[/pre]
作者: lucifer4223    时间: 2013-10-25 09:52
更改一个地方
(, 下载次数: 48)

[pre lang="ruby" line="1"]# 设计,重新摆放阵型,罗列敌人队伍从 1只怪,到 8只怪
  # 缩放产生透视,最小 0.25,最大 1.0,中等 0.5。
  # 按照 F9 里怪物屏幕 Y,越高的自动摆在更远的位置。分3档
  
  def screen_y
   
    a = $data_troops[@troop_id].members[@member_index].y
    case a
    when 0..320/3
      return 100
      
    when 320/3..320*2/3
      return 140
      
    when 320*2/3..320
      return 220
      
    else
      return 10
    end
  end
  
  
  #---------------------------------------------------
  def screen_zoom
   
    a = $data_troops[@troop_id].members[@member_index].y
    case a
    when 0..320/3
      return 0.35
      
    when 320/3..320*2/3
      return 0.55
      
    when 320*2/3..320
      return 0.75
      
    else
      return 2
    end
  end
  
  [/pre]
作者: 存档不能    时间: 2013-10-25 10:34
(, 下载次数: 64) 这个具体有啥用呢?
作者: lucifer4223    时间: 2013-10-25 11:24
战场上的相机,聚焦被选中的敌人。是我参考了 RTAB后自己做的。可以完全外挂。
本来想好好介绍一下这个脚本,可是似乎发帖很不顺利,最后只能直接上代码。
作者: chd114    时间: 2013-10-26 16:01
聚焦被选中的敌人···感觉意义不大···毕竟不是地图战斗啊···
作者: lucifer4223    时间: 2013-10-27 10:59
原理并不难,只是将 Spriteset Battle 的战场背景 和 敌人的 sprite,关联起来,进行移动缩放,产生透视效果,所以 FPS绝对不会减少。反正你们下载了试用就知道。我也没必要多讲。




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