Project1
标题:
增加行走图的行走动作
[打印本页]
作者:
风缘
时间:
2011-4-13 02:40
标题:
增加行走图的行走动作
应 淡忆已然 要求所写的脚本,实现行走图的行走动作可任意,并兼容八方向脚本。
若要使用八方向脚本,需要修改八方向脚本一个地方,请参看代码中的说明。
最后附上工程。
增加行走动作.rar
(358.57 KB, 下载次数: 302)
2011-4-13 02:40 上传
点击文件名下载附件
#===============================================================================
# 行走运作增加脚本
# By 风缘
# 使用说明:
# 1. 素材规格: ?x4 的行走图,行走动作可以任意
# 2. 文件名格式
# 2.1 必须包括 $ ,以指明是单张行走图,$ 可以在文件的任何位置
# 2.2 若要自动识别行走动作数,扩展名的 '.' 号前
# 加上 '_xx',目前只支持 2 位数字,以防误识别
# 2.3 例如:$act_12.png, $people_5.png
# 2.4 对不符合规格的行走图,一律视为原版的行走图,识别算法兼容原版
# 3. 可以与 八方向脚本 配合使用
# 3.1 八方向脚本地址 http://rpg.blue/article-41031.html
# 3.2 本脚本页必须放在八方向脚本页前
# 3.3 八方向脚本需要修改一个地方,函数 update_src_rect_for_slant 的第二行,
# 把 pattern = @character.pattern < 3 ? @character.pattern : 1
# pattern = @character.pattern < @character.pattern_limit ? @character.pattern : 1
# (以下写给脚本作者)
# 4. 本脚本由暴力修改实现,故不保证与其它脚本兼容性,但可以通过微量修改其它脚本以兼容本脚本,下述修改原理
# 4.1 Game_Character 类增加字段 last_character_name 和 pattern_limit, 以及函数 pattern_limit
# 4.2 修改 Game_Character 的 update_animation, 把 patern 界限由定值改为变值
# @pattern = (@pattern + 1) % self.pattern_limit
# 4.3 修改 Sprite_Character 的 update_bitmap
# 把 @cw = bitmap.width / 3
# 修改为 @cw = bitmap.width / @character.pattern_limit
# 4.4 修改 Sprite_Character 的 update_src_rect
# 把 pattern = @character.pattern < 3 ? @character.pattern : 1
# 修改为 pattern = @character.pattern < @character.pattern_limit ? @character.pattern : 1
# 5. 本工程自带的示例是原版的多人行走图,故显示出来的行走图有两人并排,并非 bug
# 6. 如果有任何 Bug ,请跟脚本发布贴回复或站内消息联系
#
#===============================================================================
#==============================================================================
# ■ Game_Character
#------------------------------------------------------------------------------
# 涉及角色的类。本类作为 Game_Player 类与 Game_Event 的超级类
# 使用。
#==============================================================================
class Game_Character
################# 这是我习惯的变量声明方式 #############################
attr_reader :last_character_name # 记录上次角色图文件
attr_reader :pattern_limit # 本角色行走图一行的画格数(动作数目)
########################################################################
def pattern_limit
# 设置默认画格数(VX 默认值)
@pattern_limit = 3 if @pattern_limit == nil
# 如果行走图没改变,刚返回已设定值
return @pattern_limit if (@last_character_name == @character_name)
# 更新 @last_character_name
@last_character_name = @character_name
# 以下开始解析文件名,以匹配文件规格
#######################################################
# PS: 追求高效和优美的同学可以用一个正则表达式实现,
# 我这样实现为了直观易懂
#######################################################
# 计算画格
# 去掉扩展名和 '#' 后序后,以 _{画格数} 结束
if (character_name != nil and character_name.include?("$"))
# 去掉扩展名,兼顾处理没扩展名的图
idx = character_name.rindex(".")
tmp_name = idx != nil ? character_name[0...idx] : character_name
if tmp_name != nil and not tmp_name.empty?
# 去掉可能的 # 号,以支持八方向
tmp_name = tmp_name[0...-1] if (character_name[-1] == '#')
# 检测是否有规定的结尾
_idx = tmp_name.rindex("_")
# 限制最多 99 画格,也就是说 '_' 后只能有两个数字
unless _idx == nil or _idx < tmp_name.size - 3
# 提取数字,赋值。如非数字或是 0,不处理
pat = tmp_name[_idx+1..-1]
@pattern_limit = pat.to_i if pat.to_i != 0
end
end
end
return @pattern_limit
end
#--------------------------------------------------------------------------
# ● 动画计数更新
#--------------------------------------------------------------------------
def update_animation
speed = @move_speed + (dash? ? 1 : 0)
if @anime_count > 18 - speed * 2
if not @step_anime and @stop_count > 0
@pattern = @original_pattern
else
@pattern = (@pattern + 1) % self.pattern_limit
end
@anime_count = 0
end
end
end
#==============================================================================
# ■ Sprite_Character
#------------------------------------------------------------------------------
# 角色显示用活动块。监视 Game_Character 类的实例、
# 自动变化活动块状态。
#==============================================================================
class Sprite_Character
#--------------------------------------------------------------------------
# ● 更新传送源的位图
#--------------------------------------------------------------------------
def update_bitmap
if @tile_id != @character.tile_id or
@character_name != @character.character_name or
@character_index != @character.character_index
@tile_id = @character.tile_id
@character_name = @character.character_name
@character_index = @character.character_index
if @tile_id > 0
sx = (@tile_id / 128 % 2 * 8 + @tile_id % 8) * 32;
sy = @tile_id % 256 / 8 % 16 * 32;
self.bitmap = tileset_bitmap(@tile_id)
self.src_rect.set(sx, sy, 32, 32)
self.ox = 16
self.oy = 32
else
self.bitmap = Cache.character(@character_name)
sign = @character_name[/^[\!\$]./]
if sign != nil and sign.include?(')
@cw = bitmap.width / @character.pattern_limit
@ch = bitmap.height / 4
else
@cw = bitmap.width / 12
@ch = bitmap.height / 8
end
self.ox = @cw / 2
self.oy = @ch
end
end
end
#--------------------------------------------------------------------------
# ● 更新传送源矩形
#--------------------------------------------------------------------------
def update_src_rect
if @tile_id == 0
index = @character.character_index
pattern = @character.pattern < @character.pattern_limit ? @character.pattern : 1
sx = (index % 4 * 3 + pattern) * @cw
sy = (index / 4 * 4 + (@character.direction - 2) / 2) * @ch
self.src_rect.set(sx, sy, @cw, @ch)
end
end
end
复制代码
作者:
gaofei677
时间:
2013-7-1 02:47
报告一个错误
第136行,最后面括号里面应该写("$")
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1