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

Project1

 找回密码
 注册会员
搜索
查看: 2952|回复: 4
打印 上一主题 下一主题

[RM脚本] 3D Zoom in Animated side Battle

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
2 小时
注册时间
2006-9-3
帖子
61
跳转到指定楼层
1
发表于 2006-10-1 10:47:13 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
一个很好的战斗系统,只是要求素材比较高。
#==============================================================================
# ** Sprite_Battler
#------------------------------------------------------------------------------
#  Animated Battlers by Minkoff
#==============================================================================

class Sprite_Battler < RPG::Sprite
  #--------------------------------------------------------------------------
  # * Initialize
  #--------------------------------------------------------------------------
  alias cbs_initialize initialize
  def initialize(viewport, battler = nil)

    # Configuration
    @speed = 6
    @frames = 8
    @poses = 11
    @mirror_enemies = true
    @stationary_enemies = false
    @stationary_actors = false
    @calculate_speed = false
    @phasing = false

    # DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU'RE DOING
    @frame, @pose = 0, 0
    @last_time = 0
    @last_move_time = 0
    cbs_initialize(viewport, battler)
    self.mirror = !!battler and @mirror_enemies
    viewport.z = 99
  end
  #--------------------------------------------------------------------------
  # * Update
  #--------------------------------------------------------------------------
  alias cbs_update update
  def update
    return unless @battler

    # Regular Update
    cbs_update

    # Start Routine
    unless @started
      @pose = state
      @width = @width / @frames
      @height = @height / @poses
      @display_x = @battler.screen_x
      @display_y = @battler.screen_y
      @destination_x = @display_x
      @destination_y = @display_y
      @started = true
    end

    # Cut Out Frame
    self.src_rect.set(@width * @frame, @height * @pose, @width, @height)

    # Position Sprite
    self.x = @display_x
    self.y = @display_y
    self.z = @display_y
    self.ox = @width / 2
    self.oy = @height

    # Setup Animation
    time = Graphics.frame_count / (Graphics.frame_rate / @speed)
    if @last_time < time
      @frame = (@frame + 1) % @frames
      if @frame == 0
        if @freeze
          @frame = @frames - 1
          return
        end
        @pose = state
      end
    end
    @last_time = time

    # Move It
    move if moving
  end
  #--------------------------------------------------------------------------
  # * Current State
  #--------------------------------------------------------------------------
  def state
    # Damage State
    if [nil,{}].include?(@battler.damage)
      # Battler Fine
      @state = 0
      # Battler Wounded
      @state = 2 if @battler.hp < @battler.maxhp / 4
      # Battler Dead
      if @battler.dead?
        @state = 10
        # Fix Opacity
        self.opacity = 255
      end
    end
    # Guarding State
    @state = 3 if @battler.guarding?
    # Moving State
    if moving
      # Battler Moving Left
      @state = 4 if moving.eql?(0)
      # Battler Moving Right
      @state = 5 if moving.eql?(1)
    end
    # Return State
    return @state
  end
  #--------------------------------------------------------------------------
  # * Move
  #--------------------------------------------------------------------------
  def move
    time = Graphics.frame_count / (Graphics.frame_rate.to_f / (@speed * 5))
    if @last_move_time < time

      # Pause for Animation
      return if @pose != state
      
      # Phasing
      if @phasing
        d1 = (@display_x - @original_x).abs
        d2 = (@display_y - @original_y).abs
        d3 = (@display_x - @destination_x).abs
        d4 = (@display_y - @destination_y).abs
        self.opacity = [255 - ([d1 + d2, d3 + d4].min * 1.75).to_i, 0].max
      end

      # Calculate Difference
      difference_x = (@display_x - @destination_x).abs
      difference_y = (@display_y - @destination_y).abs

      # Done? Reset, Stop
      if [difference_x, difference_y].max.between?(0, 8)
        @display_x = @destination_x
        @display_y = @destination_y
        @pose = state
        return
      end

      # Calculate Movement Increments
      increment_x = increment_y = 1
      if difference_x < difference_y
        increment_x = 1.0 / (difference_y.to_f / difference_x)
      elsif difference_y < difference_x
        increment_y = 1.0 / (difference_x.to_f / difference_y)
      end
      
      # Calculate Movement Speed
      if @calculate_speed
        total = 0; $game_party.actors.each{ |actor| total += actor.agi }
        speed = @battler.agi.to_f / (total / $game_party.actors.size)
        increment_x *= speed
        increment_y *= speed
      end
      
      # Multiply and Move
      multiplier_x = (@destination_x - @display_x > 0 ? 8 : -8)
      multiplier_y = (@destination_y - @display_y > 0 ? 8 : -8)
      @display_x += (increment_x * multiplier_x).to_i
      @display_y += (increment_y * multiplier_y).to_i
    end
    @last_move_time = time
  end
  #--------------------------------------------------------------------------
  # * Set Movement
  #--------------------------------------------------------------------------
  def setmove(destination_x, destination_y)
    unless (@battler.is_a?(Game_Enemy) and @stationary_enemies) or
           (@battler.is_a?(Game_Actor) and @stationary_actors)
      @original_x = @display_x
      @original_y = @display_y
      @destination_x = destination_x
      @destination_y = destination_y
    end
  end
  #--------------------------------------------------------------------------
  # * Movement Check
  #--------------------------------------------------------------------------
  def moving
    if (@display_x != @destination_x and @display_y != @destination_y and [email protected]?)
      return (@display_x > @destination_x ? 0 : 1)
    end
  end
  #--------------------------------------------------------------------------
  # * Set Pose
  #--------------------------------------------------------------------------
  def pose=(pose)
    @pose = pose
    @frame = 0
  end
  #--------------------------------------------------------------------------
  # * Freeze
  #--------------------------------------------------------------------------
  def freeze
    @freeze = true
  end
  #--------------------------------------------------------------------------
  # * Fallen Pose
  #--------------------------------------------------------------------------
  def collapse
  end
end

#==============================================================================
# ** Game_Actor
#==============================================================================

class Game_Actor
  #--------------------------------------------------------------------------
  # * Actor X Coordinate
  #--------------------------------------------------------------------------
  def screen_x
    if self.index != nil
      return self.index * 45 + 450
    else
      return 0
    end
  end
  #--------------------------------------------------------------------------
  # * Actor Y Coordinate
  #--------------------------------------------------------------------------
  def screen_y
    return self.index * 35 + 200
  end
  #--------------------------------------------------------------------------
  # * Actor Z Coordinate
  #--------------------------------------------------------------------------
  def screen_z
    return screen_y
  end
end

#==============================================================================
# ** Scene_Battle
#==============================================================================

class Scene_Battle
  #--------------------------------------------------------------------------
  # * Action Animation, Movement
  #--------------------------------------------------------------------------
  alias cbs_update_phase4_step3 update_phase4_step3
  def update_phase4_step3(battler = @active_battler)
    @rtab = !@target_battlers
    target = (@rtab ? battler.target : @target_battlers)[0]
    @moved = {} unless @moved
    return if @spriteset.battler(battler).moving
    case battler.current_action.kind
    when 0 # Attack
      if not (@moved[battler] or battler.guarding?)
        offset = (battler.is_a?(Game_Actor) ? 40 : -40)
        @spriteset.battler(battler).setmove(target.screen_x + offset, target.screen_y)
        @moved[battler] = true
        return
      elsif not battler.guarding?
        @spriteset.battler(battler).pose = 6 #+ rand(2)
        @spriteset.battler(battler).setmove(battler.screen_x, battler.screen_y)
        end
    when 1 # Skill
      @spriteset.battler(battler).pose = 8
    when 2 # Item
      @spriteset.battler(battler).pose = 8
    end
    @moved[battler] = false
    @rtab ? cbs_update_phase4_step3(battler) : cbs_update_phase4_step3
  end
  #--------------------------------------------------------------------------
  # * Hit Animation
  #--------------------------------------------------------------------------
  alias cbs_update_phase4_step4 update_phase4_step4
  def update_phase4_step4(battler = @active_battler)
    for target in (@rtab ? battler.target : @target_battlers)
      damage = (@rtab ? target.damage[battler] : target.damage)
      if damage.is_a?(Numeric) and damage > 0
        @spriteset.battler(target).pose = 1
      end
    end
    @rtab ? cbs_update_phase4_step4(battler) : cbs_update_phase4_step4
  end
  #--------------------------------------------------------------------------
  # * Victory Animation
  #--------------------------------------------------------------------------
  alias cbs_start_phase5 start_phase5
  def start_phase5
    for actor in $game_party.actors
      return if @spriteset.battler(actor).moving
    end
    for actor in $game_party.actors
      unless actor.dead?
        @spriteset.battler(actor).pose = 9
        @spriteset.battler(actor).freeze
      end
    end
    cbs_start_phase5
  end
  #--------------------------------------------------------------------------
  # * Change Arrow Viewport
  #--------------------------------------------------------------------------
  alias cbs_start_enemy_select start_enemy_select
  def start_enemy_select
    cbs_start_enemy_select
    @enemy_arrow.dispose
    @enemy_arrow = Arrow_Enemy.new(@spriteset.viewport2)
    @enemy_arrow.help_window = @help_window
  end
end

#==============================================================================
# ** Spriteset_Battle
#==============================================================================

class Spriteset_Battle
  #--------------------------------------------------------------------------
  # * Change Enemy Viewport
  #--------------------------------------------------------------------------
  alias cbs_initialize initialize
  def initialize
    cbs_initialize
    @enemy_sprites = []
    for enemy in $game_troop.enemies.reverse
      @enemy_sprites.push(Sprite_Battler.new(@viewport2, enemy))
    end
  end
  #--------------------------------------------------------------------------
  # * Find Sprite From Battler Handle
  #--------------------------------------------------------------------------
  def battler(handle)
    for sprite in @actor_sprites + @enemy_sprites
      return sprite if sprite.battler == handle
    end
  end
end

#==============================================================================
# ** Arrow_Base
#==============================================================================

class Arrow_Base < Sprite
  #--------------------------------------------------------------------------
  # * Reposition Arrows
  #--------------------------------------------------------------------------
  alias cbs_initialize initialize
  def initialize(viewport)
    cbs_initialize(viewport)
    self.ox = 14
    self.oy = 10
  end
end

第2个脚本:
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/  ◆戦闘カメラ - KGC_BattleCamera◆
#_/----------------------------------------------------------------------------
#_/ 戦闘中の視点移動機能を導入します。
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

#==============================================================================
# ★ カスタマイズ項目 ★
#==============================================================================

module KGC
  $game_special_elements = {}
  $imported = {}
  $data_states = load_data("Data/States.rxdata")
  $data_system = load_data("Data/System.rxdata")
  BC_SPEED_INIT = 24
end

$imported["BattleCamera"] = true
$imported["Base Reinforce"] = true

#==============================================================================
# Game_Enemy
#==============================================================================

class Game_Enemy < Game_Battler
  
  attr_reader :origin_x, :origin_y
  
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias initialize_KGC_BattleCamera initialize
  def initialize(troop_id, member_index)
    initialize_KGC_BattleCamera(troop_id, member_index)

    @origin_x = $data_troops[@troop_id].members[@member_index].x
    @origin_y = $data_troops[@troop_id].members[@member_index].y
  end
  #--------------------------------------------------------------------------
  # ● バトル画面 X 座標の取得
  #--------------------------------------------------------------------------
  def screen_x
    return @origin_x - $scene.camera.x * self.zoom
  end
  #--------------------------------------------------------------------------
  # ● バトル画面 Y 座標の取得
  #--------------------------------------------------------------------------
  def screen_y
    return @origin_y - $scene.camera.y * self.zoom
  end
  #--------------------------------------------------------------------------
  # ● 倍率の取得
  #--------------------------------------------------------------------------
  def zoom
    if $game_variables[25] == 0
      n = (1.00 + $scene.camera.z / 512.00) * ((@origin_y - 304) / 256.00 + 1)
    else
      n = 1
    end
    return n
  end
  
end

#==============================================================================
# Sprite_Battler
#==============================================================================

class Sprite_Battler < RPG::Sprite
  
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias update_KGC_BattleCamera update
  def update
    update_KGC_BattleCamera
    return if @battler == nil
    if $game_variables[25] == 0
      self.zoom_x = self.zoom_y = @battler.zoom if @battler.is_a?(Game_Enemy)
    end
  end
  
end

#==============================================================================
# Spriteset_Battle
#==============================================================================

class Spriteset_Battle
  
  #--------------------------------------------------------------------------
  # ● 更新
  #--------------------------------------------------------------------------
  alias update_KGC_BattleCamera update
   
  def update
    update_KGC_BattleCamera
    if $DEBUG
      if Input::trigger?(Input::Z)
        c = $scene.camera
        zoom = c.z / 512.00 + 1
        p "#{c.x}, #{c.y}, #{c.z}"
        p "#{@battleback_sprite.x + 320}, #{@battleback_sprite.y + 304}, #{zoom}"
      end
    end
    if $game_variables[25] == 0
      cx, cy, cz = $scene.camera.x, $scene.camera.y, $scene.camera.z
      bx, by = @battleback_sprite.x + 320, @battleback_sprite.y + 304
      if bx != cx || by != cy || @bz != cz
        zoom = cz / 512.00 + 1
        @battleback_sprite.zoom_x = zoom * 1.5
        @battleback_sprite.zoom_y = zoom * 1.5
        if $imported["Base Reinforce"]
          @battleback_sprite.ox = @battleback_sprite.bitmap.width * 0.52
          @battleback_sprite.oy = @battleback_sprite.bitmap.height / 2
          mag_x = 600.0 / @battleback_sprite.bitmap.width
          mag_y = 300.0 / @battleback_sprite.bitmap.height
          @battleback_sprite.zoom_x *= mag_x
          @battleback_sprite.zoom_y *= mag_y
        end
        @battleback_sprite.x = -cx * zoom / 2 - 320 + @battleback_sprite.ox * 2
        @battleback_sprite.y = -cy * zoom / 2 - 144 + @battleback_sprite.oy * 2
        @bz = cz
      end
    end
  end
  
end

#==============================================================================
# Camera
#------------------------------------------------------------------------------
#  戦闘中のカメラを扱うクラスです。
#==============================================================================

class Camera
  
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_reader :x, :y, :z
  attr_accessor :move_speed
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    @x, @y, @z = 0, 0, 0
    @move_x = @move_y = @move_z = 0
    @move_speed = KGC::BC_SPEED_INIT
  end
  #--------------------------------------------------------------------------
  # ● 移動
  #--------------------------------------------------------------------------
  def move(x, y, z)
    @move_x, @move_y, @move_z = x - @x - 320, y - @y - 160, z - @z
  end
  #--------------------------------------------------------------------------
  # ● 対象エネミーへ移動
  #--------------------------------------------------------------------------
  def move_target(target)
    return if target == nil || !target.is_a?(Game_Enemy)
    if $game_variables[25] == 0
    tx, ty = target.origin_x, target.origin_y - 144
    tz = (304 - target.origin_y) * 5
    move(tx, ty, tz)
    end
  end
  #--------------------------------------------------------------------------
  # ● 中央へ移動
  #--------------------------------------------------------------------------
  def centering
    @move_x, @move_y, @move_z = -@x, -@y, -@z
  end
  #--------------------------------------------------------------------------
  # ● 更新
  #--------------------------------------------------------------------------
  def update
      if $game_variables[25] == 0
      mv = [[@move_x.abs * @move_speed / 160, 1].max, @move_speed].min
      if @move_x > 0
        @x += mv
        @move_x = [@move_x - mv, 0].max
      elsif @move_x < 0
        @x -= mv
        @move_x = [@move_x + mv, 0].min
      end
      mv = [[@move_y.abs * @move_speed / 160, 1].max, @move_speed].min
      if @move_y > 0
        @y += mv
        @move_y = [@move_y - mv, 0].max
      elsif @move_y < 0
        @y -= mv
        @move_y = [@move_y + mv, 0].min
      end
      mv = [[@move_z.abs * @move_speed / 96, 1].max, @move_speed * 2].min
      if @move_z > 0
        @z += mv
        @move_z = [@move_z - mv, 0].max
      elsif @move_z < 0
        @z -= mv
        @move_z = [@move_z + mv, 0].min
      end
    end
  end
  
end

#==============================================================================
# Scene_Battle
#==============================================================================

class Scene_Battle
  
  attr_reader :camera
  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  alias main_KGC_BattleCamera main
  def main
    @camera = Camera.new
    main_KGC_BattleCamera
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias update_KGC_BattleCamera update
  def update
    @camera.update   
    update_KGC_BattleCamera
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (アクターコマンドフェーズ : エネミー選択)
  #--------------------------------------------------------------------------
  alias update_phase3_enemy_select_KGC_BattleCamera update_phase3_enemy_select
  def update_phase3_enemy_select
    if $game_variables[25] == 0
      if !$imported["ActiveCountBattle"] || @action_battler == nil
        @camera.move_target(@enemy_arrow.enemy)
      end
    end
    update_phase3_enemy_select_KGC_BattleCamera
  end
  #--------------------------------------------------------------------------
  # ● エネミー選択終了
  #--------------------------------------------------------------------------
  alias end_enemy_select_KGC_BattleCamera end_enemy_select
  def end_enemy_select
    if $game_variables[25] == 0
      if !$imported["ActiveCountBattle"] || @action_battler == nil
        @camera.move(320, 160, 0)
      end
    end
    end_enemy_select_KGC_BattleCamera
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 3 : 行動側アニメーション)
  #--------------------------------------------------------------------------
  alias update_phase4_step3_KGC_BattleCamera update_phase4_step3
  def update_phase4_step3
    if $game_variables[25] == 0
      
      if@target_battlers != []
        if @target_battlers.size > 1
          @camera.move(320, 160, -96)
        else
          @camera.move_target(@target_battlers[0])
        end
        @camera.move_target(@active_battler)
      end
    end
    update_phase4_step3_KGC_BattleCamera
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ)
  #--------------------------------------------------------------------------
  alias update_phase4_step6_KGC_BattleCamera update_phase4_step6
  def update_phase4_step6
    @camera.centering
    update_phase4_step6_KGC_BattleCamera
  end
  
end


Lv1.梦旅人

66RPG站长

梦石
0
星屑
54
在线时间
615 小时
注册时间
2005-10-10
帖子
5734

RMVX自由创作大赛亚军第2届短篇游戏比赛亚军第5届短篇游戏比赛冠军

5
发表于 2006-10-26 02:19:24 | 只看该作者
有zoom的效果……而已吧可能。
不过没有工程实在很难看出效果{/gg}
回复 支持 反对

使用道具 举报

Lv1.梦旅人

查无此人

梦石
0
星屑
50
在线时间
9 小时
注册时间
2006-5-8
帖子
1399
4
发表于 2006-10-1 16:35:40 | 只看该作者
似乎看过, 感觉和原先那个"超级战斗"没什么区别, 起码我是没看出来........
KRKR + NS 学习中..........
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
2 小时
注册时间
2006-9-3
帖子
61
3
 楼主| 发表于 2006-10-1 10:51:37 | 只看该作者
还有一个工程不知道怎么上传{/pz}
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
2 小时
注册时间
2006-9-3
帖子
61
2
 楼主| 发表于 2006-10-1 10:47:13 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
一个很好的战斗系统,只是要求素材比较高。
#==============================================================================
# ** Sprite_Battler
#------------------------------------------------------------------------------
#  Animated Battlers by Minkoff
#==============================================================================

class Sprite_Battler < RPG::Sprite
  #--------------------------------------------------------------------------
  # * Initialize
  #--------------------------------------------------------------------------
  alias cbs_initialize initialize
  def initialize(viewport, battler = nil)

    # Configuration
    @speed = 6
    @frames = 8
    @poses = 11
    @mirror_enemies = true
    @stationary_enemies = false
    @stationary_actors = false
    @calculate_speed = false
    @phasing = false

    # DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU'RE DOING
    @frame, @pose = 0, 0
    @last_time = 0
    @last_move_time = 0
    cbs_initialize(viewport, battler)
    self.mirror = !!battler and @mirror_enemies
    viewport.z = 99
  end
  #--------------------------------------------------------------------------
  # * Update
  #--------------------------------------------------------------------------
  alias cbs_update update
  def update
    return unless @battler

    # Regular Update
    cbs_update

    # Start Routine
    unless @started
      @pose = state
      @width = @width / @frames
      @height = @height / @poses
      @display_x = @battler.screen_x
      @display_y = @battler.screen_y
      @destination_x = @display_x
      @destination_y = @display_y
      @started = true
    end

    # Cut Out Frame
    self.src_rect.set(@width * @frame, @height * @pose, @width, @height)

    # Position Sprite
    self.x = @display_x
    self.y = @display_y
    self.z = @display_y
    self.ox = @width / 2
    self.oy = @height

    # Setup Animation
    time = Graphics.frame_count / (Graphics.frame_rate / @speed)
    if @last_time < time
      @frame = (@frame + 1) % @frames
      if @frame == 0
        if @freeze
          @frame = @frames - 1
          return
        end
        @pose = state
      end
    end
    @last_time = time

    # Move It
    move if moving
  end
  #--------------------------------------------------------------------------
  # * Current State
  #--------------------------------------------------------------------------
  def state
    # Damage State
    if [nil,{}].include?(@battler.damage)
      # Battler Fine
      @state = 0
      # Battler Wounded
      @state = 2 if @battler.hp < @battler.maxhp / 4
      # Battler Dead
      if @battler.dead?
        @state = 10
        # Fix Opacity
        self.opacity = 255
      end
    end
    # Guarding State
    @state = 3 if @battler.guarding?
    # Moving State
    if moving
      # Battler Moving Left
      @state = 4 if moving.eql?(0)
      # Battler Moving Right
      @state = 5 if moving.eql?(1)
    end
    # Return State
    return @state
  end
  #--------------------------------------------------------------------------
  # * Move
  #--------------------------------------------------------------------------
  def move
    time = Graphics.frame_count / (Graphics.frame_rate.to_f / (@speed * 5))
    if @last_move_time < time

      # Pause for Animation
      return if @pose != state
      
      # Phasing
      if @phasing
        d1 = (@display_x - @original_x).abs
        d2 = (@display_y - @original_y).abs
        d3 = (@display_x - @destination_x).abs
        d4 = (@display_y - @destination_y).abs
        self.opacity = [255 - ([d1 + d2, d3 + d4].min * 1.75).to_i, 0].max
      end

      # Calculate Difference
      difference_x = (@display_x - @destination_x).abs
      difference_y = (@display_y - @destination_y).abs

      # Done? Reset, Stop
      if [difference_x, difference_y].max.between?(0, 8)
        @display_x = @destination_x
        @display_y = @destination_y
        @pose = state
        return
      end

      # Calculate Movement Increments
      increment_x = increment_y = 1
      if difference_x < difference_y
        increment_x = 1.0 / (difference_y.to_f / difference_x)
      elsif difference_y < difference_x
        increment_y = 1.0 / (difference_x.to_f / difference_y)
      end
      
      # Calculate Movement Speed
      if @calculate_speed
        total = 0; $game_party.actors.each{ |actor| total += actor.agi }
        speed = @battler.agi.to_f / (total / $game_party.actors.size)
        increment_x *= speed
        increment_y *= speed
      end
      
      # Multiply and Move
      multiplier_x = (@destination_x - @display_x > 0 ? 8 : -8)
      multiplier_y = (@destination_y - @display_y > 0 ? 8 : -8)
      @display_x += (increment_x * multiplier_x).to_i
      @display_y += (increment_y * multiplier_y).to_i
    end
    @last_move_time = time
  end
  #--------------------------------------------------------------------------
  # * Set Movement
  #--------------------------------------------------------------------------
  def setmove(destination_x, destination_y)
    unless (@battler.is_a?(Game_Enemy) and @stationary_enemies) or
           (@battler.is_a?(Game_Actor) and @stationary_actors)
      @original_x = @display_x
      @original_y = @display_y
      @destination_x = destination_x
      @destination_y = destination_y
    end
  end
  #--------------------------------------------------------------------------
  # * Movement Check
  #--------------------------------------------------------------------------
  def moving
    if (@display_x != @destination_x and @display_y != @destination_y and [email protected]?)
      return (@display_x > @destination_x ? 0 : 1)
    end
  end
  #--------------------------------------------------------------------------
  # * Set Pose
  #--------------------------------------------------------------------------
  def pose=(pose)
    @pose = pose
    @frame = 0
  end
  #--------------------------------------------------------------------------
  # * Freeze
  #--------------------------------------------------------------------------
  def freeze
    @freeze = true
  end
  #--------------------------------------------------------------------------
  # * Fallen Pose
  #--------------------------------------------------------------------------
  def collapse
  end
end

#==============================================================================
# ** Game_Actor
#==============================================================================

class Game_Actor
  #--------------------------------------------------------------------------
  # * Actor X Coordinate
  #--------------------------------------------------------------------------
  def screen_x
    if self.index != nil
      return self.index * 45 + 450
    else
      return 0
    end
  end
  #--------------------------------------------------------------------------
  # * Actor Y Coordinate
  #--------------------------------------------------------------------------
  def screen_y
    return self.index * 35 + 200
  end
  #--------------------------------------------------------------------------
  # * Actor Z Coordinate
  #--------------------------------------------------------------------------
  def screen_z
    return screen_y
  end
end

#==============================================================================
# ** Scene_Battle
#==============================================================================

class Scene_Battle
  #--------------------------------------------------------------------------
  # * Action Animation, Movement
  #--------------------------------------------------------------------------
  alias cbs_update_phase4_step3 update_phase4_step3
  def update_phase4_step3(battler = @active_battler)
    @rtab = !@target_battlers
    target = (@rtab ? battler.target : @target_battlers)[0]
    @moved = {} unless @moved
    return if @spriteset.battler(battler).moving
    case battler.current_action.kind
    when 0 # Attack
      if not (@moved[battler] or battler.guarding?)
        offset = (battler.is_a?(Game_Actor) ? 40 : -40)
        @spriteset.battler(battler).setmove(target.screen_x + offset, target.screen_y)
        @moved[battler] = true
        return
      elsif not battler.guarding?
        @spriteset.battler(battler).pose = 6 #+ rand(2)
        @spriteset.battler(battler).setmove(battler.screen_x, battler.screen_y)
        end
    when 1 # Skill
      @spriteset.battler(battler).pose = 8
    when 2 # Item
      @spriteset.battler(battler).pose = 8
    end
    @moved[battler] = false
    @rtab ? cbs_update_phase4_step3(battler) : cbs_update_phase4_step3
  end
  #--------------------------------------------------------------------------
  # * Hit Animation
  #--------------------------------------------------------------------------
  alias cbs_update_phase4_step4 update_phase4_step4
  def update_phase4_step4(battler = @active_battler)
    for target in (@rtab ? battler.target : @target_battlers)
      damage = (@rtab ? target.damage[battler] : target.damage)
      if damage.is_a?(Numeric) and damage > 0
        @spriteset.battler(target).pose = 1
      end
    end
    @rtab ? cbs_update_phase4_step4(battler) : cbs_update_phase4_step4
  end
  #--------------------------------------------------------------------------
  # * Victory Animation
  #--------------------------------------------------------------------------
  alias cbs_start_phase5 start_phase5
  def start_phase5
    for actor in $game_party.actors
      return if @spriteset.battler(actor).moving
    end
    for actor in $game_party.actors
      unless actor.dead?
        @spriteset.battler(actor).pose = 9
        @spriteset.battler(actor).freeze
      end
    end
    cbs_start_phase5
  end
  #--------------------------------------------------------------------------
  # * Change Arrow Viewport
  #--------------------------------------------------------------------------
  alias cbs_start_enemy_select start_enemy_select
  def start_enemy_select
    cbs_start_enemy_select
    @enemy_arrow.dispose
    @enemy_arrow = Arrow_Enemy.new(@spriteset.viewport2)
    @enemy_arrow.help_window = @help_window
  end
end

#==============================================================================
# ** Spriteset_Battle
#==============================================================================

class Spriteset_Battle
  #--------------------------------------------------------------------------
  # * Change Enemy Viewport
  #--------------------------------------------------------------------------
  alias cbs_initialize initialize
  def initialize
    cbs_initialize
    @enemy_sprites = []
    for enemy in $game_troop.enemies.reverse
      @enemy_sprites.push(Sprite_Battler.new(@viewport2, enemy))
    end
  end
  #--------------------------------------------------------------------------
  # * Find Sprite From Battler Handle
  #--------------------------------------------------------------------------
  def battler(handle)
    for sprite in @actor_sprites + @enemy_sprites
      return sprite if sprite.battler == handle
    end
  end
end

#==============================================================================
# ** Arrow_Base
#==============================================================================

class Arrow_Base < Sprite
  #--------------------------------------------------------------------------
  # * Reposition Arrows
  #--------------------------------------------------------------------------
  alias cbs_initialize initialize
  def initialize(viewport)
    cbs_initialize(viewport)
    self.ox = 14
    self.oy = 10
  end
end

第2个脚本:
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/  ◆戦闘カメラ - KGC_BattleCamera◆
#_/----------------------------------------------------------------------------
#_/ 戦闘中の視点移動機能を導入します。
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

#==============================================================================
# ★ カスタマイズ項目 ★
#==============================================================================

module KGC
  $game_special_elements = {}
  $imported = {}
  $data_states = load_data("Data/States.rxdata")
  $data_system = load_data("Data/System.rxdata")
  BC_SPEED_INIT = 24
end

$imported["BattleCamera"] = true
$imported["Base Reinforce"] = true

#==============================================================================
# Game_Enemy
#==============================================================================

class Game_Enemy < Game_Battler
  
  attr_reader :origin_x, :origin_y
  
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias initialize_KGC_BattleCamera initialize
  def initialize(troop_id, member_index)
    initialize_KGC_BattleCamera(troop_id, member_index)

    @origin_x = $data_troops[@troop_id].members[@member_index].x
    @origin_y = $data_troops[@troop_id].members[@member_index].y
  end
  #--------------------------------------------------------------------------
  # ● バトル画面 X 座標の取得
  #--------------------------------------------------------------------------
  def screen_x
    return @origin_x - $scene.camera.x * self.zoom
  end
  #--------------------------------------------------------------------------
  # ● バトル画面 Y 座標の取得
  #--------------------------------------------------------------------------
  def screen_y
    return @origin_y - $scene.camera.y * self.zoom
  end
  #--------------------------------------------------------------------------
  # ● 倍率の取得
  #--------------------------------------------------------------------------
  def zoom
    if $game_variables[25] == 0
      n = (1.00 + $scene.camera.z / 512.00) * ((@origin_y - 304) / 256.00 + 1)
    else
      n = 1
    end
    return n
  end
  
end

#==============================================================================
# Sprite_Battler
#==============================================================================

class Sprite_Battler < RPG::Sprite
  
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias update_KGC_BattleCamera update
  def update
    update_KGC_BattleCamera
    return if @battler == nil
    if $game_variables[25] == 0
      self.zoom_x = self.zoom_y = @battler.zoom if @battler.is_a?(Game_Enemy)
    end
  end
  
end

#==============================================================================
# Spriteset_Battle
#==============================================================================

class Spriteset_Battle
  
  #--------------------------------------------------------------------------
  # ● 更新
  #--------------------------------------------------------------------------
  alias update_KGC_BattleCamera update
   
  def update
    update_KGC_BattleCamera
    if $DEBUG
      if Input::trigger?(Input::Z)
        c = $scene.camera
        zoom = c.z / 512.00 + 1
        p "#{c.x}, #{c.y}, #{c.z}"
        p "#{@battleback_sprite.x + 320}, #{@battleback_sprite.y + 304}, #{zoom}"
      end
    end
    if $game_variables[25] == 0
      cx, cy, cz = $scene.camera.x, $scene.camera.y, $scene.camera.z
      bx, by = @battleback_sprite.x + 320, @battleback_sprite.y + 304
      if bx != cx || by != cy || @bz != cz
        zoom = cz / 512.00 + 1
        @battleback_sprite.zoom_x = zoom * 1.5
        @battleback_sprite.zoom_y = zoom * 1.5
        if $imported["Base Reinforce"]
          @battleback_sprite.ox = @battleback_sprite.bitmap.width * 0.52
          @battleback_sprite.oy = @battleback_sprite.bitmap.height / 2
          mag_x = 600.0 / @battleback_sprite.bitmap.width
          mag_y = 300.0 / @battleback_sprite.bitmap.height
          @battleback_sprite.zoom_x *= mag_x
          @battleback_sprite.zoom_y *= mag_y
        end
        @battleback_sprite.x = -cx * zoom / 2 - 320 + @battleback_sprite.ox * 2
        @battleback_sprite.y = -cy * zoom / 2 - 144 + @battleback_sprite.oy * 2
        @bz = cz
      end
    end
  end
  
end

#==============================================================================
# Camera
#------------------------------------------------------------------------------
#  戦闘中のカメラを扱うクラスです。
#==============================================================================

class Camera
  
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_reader :x, :y, :z
  attr_accessor :move_speed
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    @x, @y, @z = 0, 0, 0
    @move_x = @move_y = @move_z = 0
    @move_speed = KGC::BC_SPEED_INIT
  end
  #--------------------------------------------------------------------------
  # ● 移動
  #--------------------------------------------------------------------------
  def move(x, y, z)
    @move_x, @move_y, @move_z = x - @x - 320, y - @y - 160, z - @z
  end
  #--------------------------------------------------------------------------
  # ● 対象エネミーへ移動
  #--------------------------------------------------------------------------
  def move_target(target)
    return if target == nil || !target.is_a?(Game_Enemy)
    if $game_variables[25] == 0
    tx, ty = target.origin_x, target.origin_y - 144
    tz = (304 - target.origin_y) * 5
    move(tx, ty, tz)
    end
  end
  #--------------------------------------------------------------------------
  # ● 中央へ移動
  #--------------------------------------------------------------------------
  def centering
    @move_x, @move_y, @move_z = -@x, -@y, -@z
  end
  #--------------------------------------------------------------------------
  # ● 更新
  #--------------------------------------------------------------------------
  def update
      if $game_variables[25] == 0
      mv = [[@move_x.abs * @move_speed / 160, 1].max, @move_speed].min
      if @move_x > 0
        @x += mv
        @move_x = [@move_x - mv, 0].max
      elsif @move_x < 0
        @x -= mv
        @move_x = [@move_x + mv, 0].min
      end
      mv = [[@move_y.abs * @move_speed / 160, 1].max, @move_speed].min
      if @move_y > 0
        @y += mv
        @move_y = [@move_y - mv, 0].max
      elsif @move_y < 0
        @y -= mv
        @move_y = [@move_y + mv, 0].min
      end
      mv = [[@move_z.abs * @move_speed / 96, 1].max, @move_speed * 2].min
      if @move_z > 0
        @z += mv
        @move_z = [@move_z - mv, 0].max
      elsif @move_z < 0
        @z -= mv
        @move_z = [@move_z + mv, 0].min
      end
    end
  end
  
end

#==============================================================================
# Scene_Battle
#==============================================================================

class Scene_Battle
  
  attr_reader :camera
  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  alias main_KGC_BattleCamera main
  def main
    @camera = Camera.new
    main_KGC_BattleCamera
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias update_KGC_BattleCamera update
  def update
    @camera.update   
    update_KGC_BattleCamera
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (アクターコマンドフェーズ : エネミー選択)
  #--------------------------------------------------------------------------
  alias update_phase3_enemy_select_KGC_BattleCamera update_phase3_enemy_select
  def update_phase3_enemy_select
    if $game_variables[25] == 0
      if !$imported["ActiveCountBattle"] || @action_battler == nil
        @camera.move_target(@enemy_arrow.enemy)
      end
    end
    update_phase3_enemy_select_KGC_BattleCamera
  end
  #--------------------------------------------------------------------------
  # ● エネミー選択終了
  #--------------------------------------------------------------------------
  alias end_enemy_select_KGC_BattleCamera end_enemy_select
  def end_enemy_select
    if $game_variables[25] == 0
      if !$imported["ActiveCountBattle"] || @action_battler == nil
        @camera.move(320, 160, 0)
      end
    end
    end_enemy_select_KGC_BattleCamera
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 3 : 行動側アニメーション)
  #--------------------------------------------------------------------------
  alias update_phase4_step3_KGC_BattleCamera update_phase4_step3
  def update_phase4_step3
    if $game_variables[25] == 0
      
      if@target_battlers != []
        if @target_battlers.size > 1
          @camera.move(320, 160, -96)
        else
          @camera.move_target(@target_battlers[0])
        end
        @camera.move_target(@active_battler)
      end
    end
    update_phase4_step3_KGC_BattleCamera
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ)
  #--------------------------------------------------------------------------
  alias update_phase4_step6_KGC_BattleCamera update_phase4_step6
  def update_phase4_step6
    @camera.centering
    update_phase4_step6_KGC_BattleCamera
  end
  
end


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

本版积分规则

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

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

GMT+8, 2024-12-18 10:02

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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