#==============================================================================
# 全图动画 (突破 RMXP 动画 192 * 192 限制)
#==============================================================================
# 用法:
# 1. 动画图片设置:
# 1.1 宽度 640
# 1.2 所有的子图片竖着排列
# 1.3 图片名包含 ★全图320★ 这里 320 是单张高度值
# 1.4 图片名包含 ★全图320YS160★ 则播放的动画会向下移动 160 像素
# 2. 数据库动画设置
# 2.1 选择一帧,添加一个单元
# 2.2 位置:上 在正常动画上方(z=3000);
# 位置:中 在正常动画下方(z=1500)
# 位置:下 在敌人下方(z=0);
# 位置:画面 z = x 坐标* y 坐标 * 放大率
# 2.3 式样:此帧播放的子图片位置
# 2.4 左右反转、不透明度和合成方式可以正常使用
# 2.5 X坐标、Y坐标、放大率、旋转角度不可以正常使用
#==============================================================================
# 作者:guoxiaomi 脚本来自 rpg.blue
#==============================================================================
module RPG
class Sprite < ::Sprite
def animation_set_sprites(sprites, cell_data, position)
# --------------------------------------------------------
# 图片文件名里包含★全图320★
# --------------------------------------------------------
if @_animation && @_animation.animation_name =~ /★全图(\d+).*★/
full_screen = true
width = 640
height = $1.to_i
y_shift = 0
if @_animation.animation_name =~ /★全图\d+YS(\d+)★/
y_shift = $1.to_i
end
else
full_screen = false
end
# --------------------------------------------------------
# 这 16 个点是动画上的单元数,最多 16 个,然后每个进行处理
for i in 0..15
sprite = sprites[i]
# cell_data[i, 0] 是该单元的图片在动画图片中的位置
pattern = cell_data[i, 0]
# 如果 patten = -1, or nil,本帧画面上不显示,处理下一个单元
# 如果 sprite == nil,处理下一个单元
if sprite == nil or pattern == nil or pattern == -1
sprite.visible = false if sprite != nil
next
end
sprite.visible = true
if full_screen
# --------------------------------------------------------
# 全图的情况
# --------------------------------------------------------
sprite.src_rect.set(0, pattern * height, width, height)
sprite.x = width / 2
sprite.y = height / 2 + y_shift
sprite.ox = width / 2
sprite.oy = height / 2
# 高度:位置为 上中下高度分别是 3000/1500/0(敌人背后)
# 位置为 画面 时,高度为 x 坐标* y 坐标 * 放大率
case position
when 0
sprite.z = 3000 # 普通动画上方
when 1
sprite.z = 1500 # 普通动画下方
when 2
sprite.z = 0 # 敌人下方
when 3
sprite.z = cell_data[i, 1] * cell_data[i, 2] * cell_data[i, 3] # 自定义高度
end
sprite.mirror = (cell_data[i, 5] == 1) # 镜像
sprite.opacity = cell_data[i, 6] * self.opacity / 255.0 # 透明度
sprite.blend_type = cell_data[i, 7] # 混合方式
else
# --------------------------------------------------------
# 正常的情况
# --------------------------------------------------------
# 这里找到该单元的图片在动画图片中的位置和大小
sprite.src_rect.set(pattern % 5 * 192, pattern / 5 * 192, 192, 192)
# 位置:画面的情况
if position == 3
# 无论是战斗中还是地图上,尚未发现self.viewport为nil的情况
# self 是显示动画的 Sprite
if self.viewport != nil
# viewport存在,x 为viewport中心,y 为viewport高 - 160
sprite.x = self.viewport.rect.width / 2
sprite.y = self.viewport.rect.height - 160
else
# viewport不存在,中心设于游戏窗口中心(标准640*480)
sprite.x = 320
sprite.y = 240
end
else
# 位置:上中下的情况
# 中的情况,图片中心位置和显示动画的 Sprite中心重合
sprite.x = self.x - self.ox + self.src_rect.width / 2
sprite.y = self.y - self.oy + self.src_rect.height / 2
# 上的情况,图片上移自身 1/4 的高度
sprite.y -= self.src_rect.height / 4 if position == 0
# 下的情况,图片下移自身 1/4 的高度
sprite.y += self.src_rect.height / 4 if position == 2
end
# cell_data[i, 1] 是该单元的图片的
sprite.x += cell_data[i, 1] # x 偏移量
sprite.y += cell_data[i, 2] # y 偏移量
sprite.z = 2000 # 高度
sprite.ox = 96 # 图片的 中心 位置 x
sprite.oy = 96 # 图片的 中心 位置 y,中心位置要和画面的中心位置重合
sprite.zoom_x = cell_data[i, 3] / 100.0 # x 放大率
sprite.zoom_y = cell_data[i, 3] / 100.0 # y 放大率
sprite.angle = cell_data[i, 4] # 旋转
sprite.mirror = (cell_data[i, 5] == 1) # 镜像
sprite.opacity = cell_data[i, 6] * self.opacity / 255.0 # 透明度
sprite.blend_type = cell_data[i, 7] # 混合方式
end
end
end
end
end
#==============================================================================
# 作者:guoxiaomi 脚本来自 rpg.blue
#==============================================================================