| 
 
| 赞 | 0 |  
| VIP | 0 |  
| 好人卡 | 0 |  
| 积分 | 1 |  
| 经验 | 0 |  
| 最后登录 | 2012-4-23 |  
| 在线时间 | 6 小时 |  
 Lv1.梦旅人 
	梦石0 星屑570 在线时间6 小时注册时间2010-9-8帖子3 | 
| 
本帖最后由 f86409 于 2011-4-27 14:23 编辑
x
加入我们,或者,欢迎回来。您需要 登录 才可以下载或查看,没有帐号?注册会员  
 .....一个用就得 两个一起就没有效果
 # 核心的说明:
 # damage_pop 不再附带damage()的功能,这个放到animation里面去了
 
 module RPG
 class Sprite < ::Sprite
 @@_animations = []
 @@_reference_count = {}
 #==========================================
 # 修改说明:
 # @flash_shake用来制作挨打时候跳跃
 # @_damage    用来记录每次打击之后弹出数字
 #==========================================
 def initialize(viewport = nil)
 super(viewport)
 @flash_shake = 0
 @_whiten_duration = 0
 @_appear_duration = 0
 @_escape_duration = 0
 @_collapse_duration = 0
 @_damage_duration = 0
 @_animation_duration = 0
 @_blink = false
 @_damage = [] #~66RPG~#
 @py_y = 0
 end
 def damage(value, critical)
 if value.is_a?(Numeric)
 damage_string = value.abs.to_s
 else
 damage_string = value.to_s
 end
 bitmap = Bitmap.new(160, 48)
 bitmap.font.name = "Arial Black"
 bitmap.font.size = 32
 bitmap.font.color.set(0, 0, 0)
 bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
 bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
 bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
 bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
 #=======================================
 # 修改:颜色
 #=======================================
 if value.is_a?(Numeric) and value < 0
 bitmap.font.color.set(176, 255, 144)
 else
 bitmap.font.color.set(255, 55, 55)
 end
 bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
 if critical
 bitmap.font.size = 20
 bitmap.font.color.set(0, 0, 0)
 bitmap.draw_text(-1, -1, 160, 20, "CRITICAL", 1)
 bitmap.draw_text(+1, -1, 160, 20, "CRITICAL", 1)
 bitmap.draw_text(-1, +1, 160, 20, "CRITICAL", 1)
 bitmap.draw_text(+1, +1, 160, 20, "CRITICAL", 1)
 bitmap.font.color.set(255, 255, 255)
 bitmap.draw_text(0, 0, 160, 20, "CRITICAL", 1)
 end
 @_damage_sprite = ::Sprite.new(self.viewport)
 @_damage_sprite.bitmap = bitmap
 @_damage_sprite.ox = 80
 @_damage_sprite.oy = 20
 @_damage_sprite.x = self.x
 @_damage_sprite.y = self.y - self.oy / 2
 @_damage_sprite.z = 3000
 @_damage_duration = 40
 #=======================================
 # 修改:推入新的伤害
 #=======================================
 @_damage.push([@_damage_sprite,@_damage_duration-10,0, rand(30) - 15, rand(3)])
 end
 def animation(animation, hit, battler_damage="", battler_critical=false)
 dispose_animation
 #=======================================
 # 修改:记录伤害和critical
 #=======================================
 @battler_damage = battler_damage
 @battler_critical = battler_critical
 @_animation = animation
 return if @_animation == nil
 @_animation_hit = hit
 @_animation_duration = @_animation.frame_max
 animation_name = @_animation.animation_name
 animation_hue = @_animation.animation_hue
 bitmap = RPG::Cache.animation(animation_name, animation_hue)
 #=======================================
 # 修改:计算总闪光权限值
 #=======================================
 for timing in @_animation.timings
 @all_quanzhong += animation_process_timing(timing, @_animation_hit)
 end
 if @@_reference_count.include?(bitmap)
 @@_reference_count[bitmap] += 1
 else
 @@_reference_count[bitmap] = 1
 end
 @_animation_sprites = []
 if @_animation.position != 3 or not @@_animations.include?(animation)
 for i in 0..15
 sprite = ::Sprite.new(self.viewport)
 sprite.bitmap = bitmap
 sprite.visible = false
 @_animation_sprites.push(sprite)
 end
 unless @@_animations.include?(animation)
 @@_animations.push(animation)
 end
 end
 update_animation
 end
 #=======================================
 # 修改:更换清除伤害的算法,以防万一
 #       本内容在脚本中没有使用过
 #=======================================
 def dispose_damage
 for damage in @_damage.reverse
 damage[0].bitmap.dispose
 damage[0].dispose
 @_damage.delete(damage)
 end
 end
 def dispose_animation
 #=======================================
 # 修改:清除记录的伤害,清除权重记录
 #=======================================
 @battler_damage = nil
 @battler_critical = nil
 @all_quanzhong = 1
 if @_animation_sprites != nil
 sprite = @_animation_sprites[0]
 if sprite != nil
 @@_reference_count[sprite.bitmap] -= 1
 if @@_reference_count[sprite.bitmap] == 0
 sprite.bitmap.dispose
 end
 end
 for sprite in @_animation_sprites
 sprite.dispose
 end
 @_animation_sprites = nil
 @_animation = nil
 end
 end
 def update
 super
 if @_whiten_duration > 0
 @_whiten_duration -= 1
 self.color.alpha = 128 - (16 - @_whiten_duration) * 10
 end
 if @_appear_duration > 0
 @_appear_duration -= 1
 self.opacity = (16 - @_appear_duration) * 16
 end
 if @_escape_duration > 0
 @_escape_duration -= 1
 self.opacity = 256 - (32 - @_escape_duration) * 10
 end
 if @_collapse_duration > 0
 @_collapse_duration -= 1
 self.opacity = 256 - (48 - @_collapse_duration) * 6
 end
 #=======================================
 # 修改:更新算法,更新弹出
 #=======================================
 if @_damage_duration > 0
 @_damage_duration -= 1
 for damage in @_damage
 damage[0].x = self.x + self.viewport.rect.x -
 self.ox + self.src_rect.width / 2 +
 (40 - damage[1]) * damage[3] / 10
 damage[0].y -= damage[4]+damage[1]/10
 damage[0].opacity = damage[1]*20
 damage[1] -= 1
 if damage[1]==0
 damage[0].bitmap.dispose
 damage[0].dispose
 @_damage.delete(damage)
 next
 end
 end
 end
 if @_animation != nil and (Graphics.frame_count % 2 == 0)
 @_animation_duration -= 1
 update_animation
 end
 if @_loop_animation != nil and (Graphics.frame_count % 2 == 0)
 update_loop_animation
 @_loop_animation_index += 1
 @_loop_animation_index %= @_loop_animation.frame_max
 end
 if @_blink
 @_blink_count = (@_blink_count + 1) % 32
 if @_blink_count < 16
 alpha = (16 - @_blink_count) * 6
 else
 alpha = (@_blink_count - 16) * 6
 end
 self.color.set(255, 255, 255, alpha)
 end
 @@_animations.clear
 end
 def update_animation
 if @_animation_duration > 0
 frame_index = @_animation.frame_max - @_animation_duration
 cell_data = @_animation.frames[frame_index].cell_data
 position = @_animation.position
 animation_set_sprites(@_animation_sprites, cell_data, position)
 #=======================================
 # 修改:弹出伤害,权重计算
 #=======================================
 for timing in @_animation.timings
 if timing.frame == frame_index
 t = 1.0 * animation_process_timing(timing, @_animation_hit)
 #p t,"当前权重", @all_quanzhong,"总权重"
 if @battler_damage.is_a?(Numeric) and t != 0
 t *= @battler_damage
 t /= @all_quanzhong
 #p t,"当前伤害",@battler_damage,"总伤害"
 t = t.to_i
 #p t,@battler_damage,@all_quanzhong
 damage(t,@battler_critical)
 elsif !@battler_damage.is_a?(Numeric)
 damage(@battler_damage,@battler_critical)
 end
 end
 end
 else
 dispose_animation
 end
 end
 #=======================================
 # 修改:敌人跳跃的功能 + 添加返回数值
 #=======================================
 def animation_process_timing(timing, hit)
 if (timing.condition == 0) or
 (timing.condition == 1 and hit == true) or
 (timing.condition == 2 and hit == false)
 if timing.se.name != ""
 se = timing.se
 Audio.se_play("Audio/SE/" + se.name, se.volume, se.pitch)
 end
 case timing.flash_scope
 when 1
 self.flash(timing.flash_color, timing.flash_duration * 2)
 @flash_shake_switch = true
 @flash_shake = 10
 return timing.flash_color.alpha * timing.flash_duration
 when 2
 if self.viewport != nil
 self.viewport.flash(timing.flash_color, timing.flash_duration * 2)
 return timing.flash_color.alpha * timing.flash_duration
 end
 when 3
 self.flash(nil, timing.flash_duration * 2)
 return timing.flash_color.alpha * timing.flash_duration
 end
 end
 return 0
 end
 end
 end
 #==============================================================================
 # ■ Sprite_Battler
 #==============================================================================
 class Sprite_Battler < RPG::Sprite
 #--------------------------------------------------------------------------
 # ● 初始化对像
 #    添加跳跃记录
 #--------------------------------------------------------------------------
 def initialize(viewport, battler = nil)
 super(viewport)
 @battler = battler
 @battler_visible = false
 @flash_shake_switch = true
 end
 #--------------------------------------------------------------------------
 # ● 刷新画面
 #    增添跳跃功能
 #--------------------------------------------------------------------------
 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
 # 如果是战斗不能或者是隐藏状态就把透明度设置成 0
 if @battler.dead? or @battler.hidden
 self.opacity = 0
 end
 end
 # 动画 ID 与当前的情况有差异的情况下
 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.damage, @battler.critical)
 @battler.animation_id = 0
 end
 # 伤害
 if @battler.damage_pop
 @battler.damage = nil
 @battler.critical = false
 @battler.damage_pop = false
 end
 # korapusu
 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
 # 设置活动块的坐标
 if @flash_shake_switch == true
 self.x = @battler.screen_x
 self.y = @battler.screen_y
 self.z = @battler.screen_z
 @flash_shake_switch = false
 end
 if @flash_shake != 0 and @battler.damage != nil
 case @flash_shake
 when 9..10
 self.x = @battler.screen_x
 self.y -=4
 self.z = @battler.screen_z
 when 6..8
 self.x = @battler.screen_x
 self.y -=2
 self.z = @battler.screen_z
 when 3..5
 self.x = @battler.screen_x
 self.y +=2
 self.z = @battler.screen_z
 when 2
 self.x = @battler.screen_x
 self.y += 4
 self.z = @battler.screen_z
 when 1
 self.x = @battler.screen_x
 self.y = @battler.screen_y
 self.z = @battler.screen_z
 end
 @flash_shake -= 1
 end
 end
 end
 
 ---------------------------------
 #バトラー色調変化
 #
 #バトラーの残りHPに応じて色調を変化させます。
 #
 #2005.4.14 バグ修正
 #HPが減った状態で戦闘をはじめた時
 #アクターの色調が変化してないバグを修正。
 
 module Momo_Change_Tone
 # 味方の色調変化をするか?
 ACTOR_CHANGE_TONE = false
 # 敵の色調変化をするか?
 ENEMY_CHANGE_TONE = true
 # 色調の赤成分
 TONE_RED   = 128
 # 色調の緑成分
 TONE_GREEN = 0
 # 色調の青成分
 TONE_BLUE  = 0
 end
 
 class Game_Battler
 attr_accessor :tone_change
 alias game_battler_change_color_initialize initialize
 def initialize
 game_battler_change_color_initialize
 # 色調変化要求フラグ
 @tone_change = false
 end
 end
 
 class Sprite_Battler < RPG::Sprite
 alias sprite_battler_change_color_initialize initialize
 def initialize(viewport, battler = nil)
 sprite_battler_change_color_initialize(viewport, battler)
 @change_tone = Tone.new(0, 0, 0)
 end
 alias sprite_battler_change_color_update update
 def update
 sprite_battler_change_color_update
 tone_update
 end
 def tone_update
 if @battler != nil
 if rest_hp_tone_change?
 if @battler.tone_change
 rest_hp_tone_change_set
 @battler.tone_change = false
 end
 self.tone = @change_tone
 end
 end
 end
 # 色調変化可能かどうか
 def rest_hp_tone_change?
 if (Momo_Change_Tone::ACTOR_CHANGE_TONE and @battler.is_a?(Game_Actor)) or
 (Momo_Change_Tone::ENEMY_CHANGE_TONE and @battler.is_a?(Game_Enemy))
 return true
 end
 return false
 end
 # 残りHPに応じて色調を変更
 def rest_hp_tone_change_set
 hp_rate = (@battler.hp.to_f / @battler.maxhp) * 100
 rate = 100 - hp_rate
 red   = Momo_Change_Tone::TONE_RED * rate / 100
 green = Momo_Change_Tone::TONE_GREEN * rate / 100
 blue  = Momo_Change_Tone::TONE_BLUE * rate / 100
 @change_tone.set(red, green, blue)
 end
 end
 
 class Spriteset_Battle
 alias spriteset_battle_change_color_initialize initialize
 def initialize
 spriteset_battle_change_color_initialize
 # アクタースプライトの更新
 for sprite in @actor_sprites
 if !sprite.battler.nil?
 sprite.battler.tone_change = true
 sprite.update
 end
 end
 end
 end
 
 class Scene_Battle
 alias scene_battle_change_color_update_phase4_step5 update_phase4_step5
 def update_phase4_step5
 scene_battle_change_color_update_phase4_step5
 # ダメージ表示時に色調変更要求フラグを立てる
 for target in @target_battlers
 target.tone_change = true
 end
 end
 end
 
 
 | 
 |