赞 | 0 |
VIP | 2 |
好人卡 | 2 |
积分 | 1 |
经验 | 19578 |
最后登录 | 2016-1-22 |
在线时间 | 262 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 262 小时
- 注册时间
- 2009-1-10
- 帖子
- 309
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
- #==============================================================================
- # ■ Sprite_Base
- #------------------------------------------------------------------------------
- # 处理动画显示追加活动块的类变量。
- # todo list:
- # 1、为了多技能改变色调的时候不出错,最好给screen记录一个当前默认的标准颜色
- # 2、彩虹神剑的伤血方法,将damage作为参数建立
- #==============================================================================
- $animation_hitpause = 0 # 打击感专用变量,击打的时候这个数字上升
- # 在需要刷新的scene(如战斗和ARPG地图),这个值权重极高
- # 如果>0,则-1,并且屏蔽其他所有按键以外的刷新。
- # $game_system.animation_lag = 4 # 动画的延时,这个考虑以后可以作为动态的,越小越快,最小为1
- class Sprite_Base < Sprite
- #--------------------------------------------------------------------------
- # ● 类变量
- # @@animations 用来记录动画正在播放,防止同一时间多次在同位置播放全屏动画
- # @@_reference_count 用来记录哪些素材正在被使用
- #--------------------------------------------------------------------------
- @@animations = []
- @@_reference_count = {}
- HITPAUSE_KR = 3 # 打击感宽容度,宽容度越高击中的停顿感越差,推荐0.5 - 3
- # 建议将这里设置为一个大数,用$animation_sp定协议制作打击感
- #--------------------------------------------------------------------------
- # ● done 初始化对像
- # viewport : 视口
- #--------------------------------------------------------------------------
- def initialize(viewport = nil)
- super(viewport)
- @use_sprite = true # 活动块使用标记
- @animation_duration = 0 # 动画剩余时间
- # 基本结构:0.animation, 1.mirror, 2.length, 3.sprites, 4.ox, 5.oy ,
- # 6.[bitmap1, bitmap2], 7.[frame_index, quanzhong](权重表),
- # 8.all_quanzhong, 9.[hp_damage, sp_damage, string]
- @animation_collection = []
- @fordispose = [] # 待消除的列表
- @damage_string = [] # 与damage有关的列表
- @damage_duration = 0 # 如果>0则刷新damage
- @battler = nil
- end
- #--------------------------------------------------------------------------
- # ● done 释放
- #--------------------------------------------------------------------------
- def dispose
- super
- dispose_all_animation
- end
- #--------------------------------------------------------------------------
- # ● done 刷新画面
- #--------------------------------------------------------------------------
- def update
- super
- if @animation_collection != nil
- @animation_duration -= 1 if @animation_duration > 0
- if @animation_duration == 1
- @battler.call_for_effect if @battler != nil
- end
- for i in 1..@animation_collection.size
- ani = @animation_collection[i - 1]
- ani[2] -= 1
- if ani[2] % $game_system.animation_lag == 0
- update_animation(ani, i)
- end
- end
- else
- @animation_duration = 0
- end
- # 把本次播放已经播放完毕的动画删除
- if @fordispose != []
- for ani in @fordispose
- dispose_animation(ani)
- end
- @fordispose = []
- end
- update_damage
- @@animations.clear
- end
- #--------------------------------------------------------------------------
- # ● done 动画显示中判定 (强判定)
- #--------------------------------------------------------------------------
- def animation?
- return @animation_collection != []
- end
- #--------------------------------------------------------------------------
- # ● done 动画显示中判定 (弱判定)
- # 弱判定会和真实情况有一定的出入,为了加快战斗节奏
- #--------------------------------------------------------------------------
- def animation_ruo?
- return @animation_duration != 0
- end
- #--------------------------------------------------------------------------
- # ● done 获取权重列表
- #--------------------------------------------------------------------------
- def get_damage_list
- damage_list = []
- all_quanzhong = 0
- for timing in @animation.timings
- quanzhong = animation_process_timing(timing, true)
- all_quanzhong += quanzhong
- damage_list.push([timing.frame, quanzhong])
- end
- return [damage_list, all_quanzhong]
- end
- #--------------------------------------------------------------------------
- # ● done 开始动画
- #--------------------------------------------------------------------------
- def start_animation(animation, mirror = false, damage = [])
- @animation = animation
- return if @animation == nil
- damage_list = get_damage_list
- @animation_mirror = mirror
- animation_length = @animation.frame_max * $game_system.animation_lag + 1
- #~ @animation_duration += animation_length - 2 * $game_system.animation_lag
- had_max = 0
- for ani in @animation_collection
- had_max = [had_max, ani[2]].max
- end
- @animation_duration = [had_max, animation_length].max
- animbitmap = load_animation_bitmap
- @animation_sprites = []
- if @animation.position != 3 or not @@animations.include?(animation)
- if @use_sprite
- for i in 0..15
- sprite = ::Sprite.new(viewport)
- sprite.visible = false
- @animation_sprites.push(sprite)
- end
- unless @@animations.include?(animation)
- @@animations.push(animation)
- end
- end
- end
- if @animation.position == 3
- if viewport == nil
- @animation_ox = 544 / 2
- @animation_oy = 416 / 2
- else
- @animation_ox = viewport.rect.width / 2
- @animation_oy = viewport.rect.height / 2
- end
- else
- @animation_ox = width / 2 # x - ox + width / 2
- @animation_oy = height / 2 # y - oy + height / 2
- if @animation.position == 0
- @animation_oy -= height / 2
- elsif @animation.position == 2
- @animation_oy += height / 2
- end
- end
- @animation_collection.push([@animation, @animation_mirror, animation_length,
- @animation_sprites, @animation_ox, @animation_oy,
- animbitmap, damage_list[0], damage_list[1], damage])
- end
- #--------------------------------------------------------------------------
- # ● 伤害字符串喷射
- #--------------------------------------------------------------------------
- def damage(quanzhong, all_quanzhong, damage_all)
- for i in 0..2
- next if damage_all[i] == nil or damage_all[i] == 0
- bitmap = Bitmap.new(200, 80)
- bitmap.font.name = (["Arial Black","Arial","黑体","宋体"])
- bitmap.font.size = 32
- if damage_all[i].is_a?(Numeric)
- rect_y = damage_all[i] > 0 ? 32 : 0
- begin
- this_number = (1.0 * quanzhong * damage_all[i] / all_quanzhong ).to_i
- rescue
- return
- end
- next if this_number == 0 and damage_all[i] != 0
- @battler.hp += this_number if i == 0 and @battler != nil
- @battler.mp += this_number if i == 1 and @battler != nil
- $scene.add_total_damage(this_number.abs) if $game_temp.in_battle and @battler != nil
- $scene.add_hits(@battler) if $game_temp.in_battle and @battler != nil and $game_system.partyLevel >= 2
- $scene.status_window.refresh if $game_temp.in_battle and @battler.is_a?(Game_Actor)
- temp_damage_all = this_number.abs.to_s
- damage_array = temp_damage_all.scan(/./)
- damage_x = 81 - temp_damage_all.size * 9
- for char in damage_array
- number = char.to_i
- bmp_name = i == 1 ? "Damagesp" : "Damage"
- bitmap.blt(damage_x, 32, Cache.system(bmp_name),
- Rect.new(number * 18, rect_y, 18, 32))
- damage_x += 18
- end
- else
- # 系统默认描画字符串
- unless damage_all[i] == "Miss"
- bitmap.font.color.set(0, 0, 0)
- temp_damage_all = damage_all[i].to_s.clone
- bitmap.draw_text(-1, 27, 162, 36, temp_damage_all, 1)
- bitmap.draw_text(+1, 27, 162, 36, temp_damage_all, 1)
- bitmap.draw_text(-1, 29, 162, 36, temp_damage_all, 1)
- bitmap.draw_text(+1, 29, 162, 36, temp_damage_all, 1)
- bitmap.font.color.set(255, 255, 255)
- bitmap.draw_text(0, 28, 162, 36, temp_damage_all, 1)
- # Miss 的情况下
- else
- # 显示未击中图画
- bitmap.blt(36, 28, Cache.system("Damage"), Rect.new(90, 64, 90, 32))
- end
- end
- damage_sprite = ::Sprite.new(self.viewport)
- damage_sprite.bitmap = bitmap
- damage_sprite.ox = 80
- damage_sprite.oy = 20
- damage_sprite.x = self.x - 20 + rand(40)
- damage_sprite.y = self.y - self.oy / 2 - 20 + rand(40)
- damage_sprite.z = 3000
- @damage_duration = 40
- @damage_string.push([damage_sprite,@damage_duration - 5, 0, rand(30) - 15, rand(3)])
- make_total_damage
- end
- end
- #--------------------------------------------------------------------------
- # ● 制作彩虹神劍總傷害,待書寫
- #--------------------------------------------------------------------------
- def make_total_damage
- return
- end
- #--------------------------------------------------------------------------
- # ● 刷新总伤害动画
- #--------------------------------------------------------------------------
- def update_damage
- if @damage_duration > 0
- @damage_duration -= 1
- for damage in @damage_string
- 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_string.delete(damage)
- next
- end
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● done 读取动画的类变量
- #--------------------------------------------------------------------------
- def load_animation_bitmap
- animation1_name = @animation.animation1_name
- animation1_hue = @animation.animation1_hue
- animation2_name = @animation.animation2_name
- animation2_hue = @animation.animation2_hue
- @animation_bitmap1 = Cache.animation(animation1_name, animation1_hue)
- @animation_bitmap2 = Cache.animation(animation2_name, animation2_hue)
- if @@_reference_count.include?(@animation_bitmap1)
- @@_reference_count[@animation_bitmap1] += 1
- else
- @@_reference_count[@animation_bitmap1] = 1
- end
- if @@_reference_count.include?(@animation_bitmap2)
- @@_reference_count[@animation_bitmap2] += 1
- else
- @@_reference_count[@animation_bitmap2] = 1
- end
- Graphics.frame_reset
- return [@animation_bitmap1, @animation_bitmap2]
- end
- #--------------------------------------------------------------------------
- # ● done 释放全部动画
- #--------------------------------------------------------------------------
- def dispose_all_animation
- return nil if @animation_collection == nil
- for ani in @animation_collection
- dispose_animation(ani)
- next
- end
- return @animation_collection
- end
- #--------------------------------------------------------------------------
- # ● done 释放动画
- #--------------------------------------------------------------------------
- def dispose_animation(ani)
- if ani[6][0] != nil
- @@_reference_count[ani[6][0]] -= 1
- if @@_reference_count[ani[6][0]] == 0
- ani[6][0].dispose
- ani[6][0] = nil
- end
- end
- if ani[6][1] != nil
- @@_reference_count[ani[6][1]] -= 1
- if @@_reference_count[ani[6][1]] == 0
- ani[6][1].dispose
- ani[6][1] = nil
- end
- end
- if ani[3] != nil
- for sprite in ani[3]
- sprite.dispose
- end
- ani[3] = nil
- ani[0] = nil
- end
- @animation_collection.delete(ani)
- end
- #--------------------------------------------------------------------------
- # ● done 刷新动画
- # number_of_collection, 用来记录是这个动画是系列的第几个,制造减法
- #--------------------------------------------------------------------------
- def update_animation(ani, number_of_collection = 1)
- if ani[2] > 0
- frame_index = ani[0].frame_max - (ani[2] + $game_system.animation_lag - 1) / $game_system.animation_lag
- animation_set_sprites(ani[0].frames[frame_index], ani, number_of_collection)
- for timing in ani[0].timings
- if timing.frame == frame_index
- animation_process_timing(timing)
- end
- end
- if $animation_sp[ani[0].id] != nil
- for keycont in $animation_sp[ani[0].id]
- if keycont[0] == frame_index
- animation_process_special(keycont[1] , ani)
- end
- end
- end
- for tm in ani[7]
- if tm[0] == frame_index
- damage(tm[1], ani[8], ani[9])
- end
- end
- else
- @fordispose.push(ani)
- end
- end
- #--------------------------------------------------------------------------
- # ● done 设置动画活动块
- # frame : 帧数据 (RPG::Animation::Frame)
- #--------------------------------------------------------------------------
- def animation_set_sprites(frame, ani, number_of_collection = 1)
- return if frame == nil
- cell_data = frame.cell_data
- for i in 0..15
- sprite = ani[3][i]
- next if sprite == nil
- pattern = cell_data[i, 0]
- if pattern == nil or pattern == -1
- sprite.visible = false
- next
- end
- if pattern < 100
- sprite.bitmap = ani[6][0]
- else
- sprite.bitmap = ani[6][1]
- end
- sprite.visible = true
- sprite.src_rect.set(pattern % 5 * 192,
- pattern % 100 / 5 * 192, 192, 192)
- t6Rx = x - ox
- t6Ry = y - oy
- if ani[0].position == 3
- t6Rx = 0
- t6Ry = 0
- end
- if @animation_mirror
- sprite.x = t6Rx + ani[4] - cell_data[i, 1]
- sprite.y = t6Ry + ani[5] - cell_data[i, 2]
- sprite.angle = (360 - cell_data[i, 4])
- sprite.mirror = (cell_data[i, 5] == 0)
- else
- sprite.x = t6Rx + ani[4] + cell_data[i, 1]
- sprite.y = t6Ry + ani[5] + cell_data[i, 2]
- sprite.angle = cell_data[i, 4]
- sprite.mirror = (cell_data[i, 5] == 1)
- end
- sprite.z = self.z + number_of_collection # 300
- sprite.z += 300 unless $game_temp.in_battle
- sprite.ox = 96
- sprite.oy = 96
- sprite.zoom_x = cell_data[i, 3] / 100.0
- sprite.zoom_y = cell_data[i, 3] / 100.0
- sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
- if number_of_collection < @animation_collection.size
- sprite.blend_type = 2
- else
- sprite.blend_type = cell_data[i, 7]
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● done SE 与闪烁的时机处理
- # timing : Timing数据 (RPG::Animation::Timing)
- #--------------------------------------------------------------------------
- def animation_process_timing(timing, dontflash = false)
- unless dontflash
- timing.se.play
- end
- case timing.flash_scope
- when 1
- unless dontflash
- self.flash(timing.flash_color, timing.flash_duration * $game_system.animation_lag)
- $animation_hitpause += (timing.flash_duration / HITPAUSE_KR).to_i
- end
- return timing.flash_color.alpha * timing.flash_duration
- when 2
- unless dontflash
- if viewport != nil
- viewport.flash(timing.flash_color, timing.flash_duration * $game_system.animation_lag)
- $animation_hitpause += (timing.flash_duration / HITPAUSE_KR).to_i
- end
- end
- when 3
- unless dontflash
- self.flash(nil, timing.flash_duration * $game_system.animation_lag)
- end
- end
- return 0
- end
- #--------------------------------------------------------------------------
- # ● done 动画的特殊效果处理
- # timing : Timing数据 (RPG::Animation::Timing)
- #--------------------------------------------------------------------------
- def animation_process_special(keycont, fromani = nil)
- colorid = nil
- shake = nil
- colorreal = nil
- helper = nil
- startani = nil
- eval(keycont)
- update_special_colorreal(colorreal) if colorreal != nil
- update_special_colorid(colorid) if colorid != nil
- update_special_shake(shake) if shake != nil
- update_special_helper(helper) if helper != nil
- update_special_startani(startani, fromani) if startani != nil
- end
- #------------------------------------------------------------------------------
- # 以下为临时函数,实际游戏中如果不使用请自行重写,留着无害。
- #------------------------------------------------------------------------------
- #--------------------------------------------------------------------------
- # ● 协议函数:动画中改变屏幕色调
- #--------------------------------------------------------------------------
- def update_special_colorid(colorid)
- if $game_temp.in_battle
- if colorid[0] == 0
- $scene.spriteset.battleback_sprite.start_tone_change($scene.recover_tone, colorid[1])
- else
- $scene.spriteset.battleback_sprite.start_tone_change(get_pixel_tone(colorid[0].to_i), colorid[1])
- end
- else
- $game_map.screen.start_tone_change(get_pixel_tone(colorid[0].to_i), colorid[1])
- end
- end
- #--------------------------------------------------------------------------
- # ● 协议函数:动画中呼叫helper
- #--------------------------------------------------------------------------
- def update_special_helper(helper)
- return if rand(100) < helper[7]
- sprite = Sprite_Base.new
- if helper[0] == 0
- sprite.x = self.x + helper[1]
- sprite.y = self.y + helper[2]
- sprite.z = self.z + helper[3]
- elsif helper[0] == 1
- sprite.x = helper[1]
- sprite.y = helper[2]
- sprite.z = helper[3]
- end
- $sprite_helper.push([sprite, helper[5] * $game_system.animation_lag, helper[6]])
- $sprite_helper[$sprite_helper.size - 1][0].start_animation($data_animations[helper[4]])
- end
- #--------------------------------------------------------------------------
- # ● 协议函数:动画中改变屏幕色调
- #--------------------------------------------------------------------------
- def update_special_colorreal(colorreal)
- if $game_temp.in_battle
- $scene.spriteset.battleback_sprite.start_tone_change(Tone.new(colorreal[0],colorreal[1],colorreal[2],colorreal[3]), colorreal[4])
- else
- $game_map.screen.start_tone_change(Tone.new(colorreal[0],colorreal[1],colorreal[2],colorreal[3]),colorreal[4])
- end
- end
- #--------------------------------------------------------------------------
- # ● 协议函数:动画插入连续技
- #--------------------------------------------------------------------------
- def update_special_startani(startani, fromani)
- start_animation($data_animations[startani], mirror = false, fromani[9])
- end
- #--------------------------------------------------------------------------
- # ● 协议函数:动画中振动屏幕
- #--------------------------------------------------------------------------
- def update_special_shake(shake)
- screen.start_shake(shake[0], shake[1], shake[2])
- end
- #--------------------------------------------------------------------------
- # ● 协议函数:获取画面指令对象
- #--------------------------------------------------------------------------
- def screen
- if $game_temp.in_battle
- return $game_troop.screen
- else
- return $game_map.screen
- end
- end
- #--------------------------------------------------------------------------
- # ● 协议函数:获取编号n的色调颜色
- #--------------------------------------------------------------------------
- def get_pixel_tone(n)
- return Tone.new(0, 0, 0, 0) if n == 0
- x = 64 + (n % 8) * 8
- y = 96 + (n / 8) * 8
- color = Cache.system("Window").get_pixel(x, y)
- return Tone.new([color.red / 4, 64].max, [color.green / 4, 64].max, [color.blue / 4, 64].max, [color.alpha, 256].max)
- end
- end
复制代码 此彩虹神剑脚本该如何兼容“Zhong RMVX 半即时战斗系统 1.02a版”的战斗系统呢? |
|