基本指令:
首先要明确“显示图片”的脚本(事件中的脚本)调用方法: # name : 文件名 # origin : 原点 # x : X 坐标 # y : Y 坐标 # zoom_x : X 方向放大率 # zoom_y : Y 方向放大率 # opacity : 不透明度 # blend_type : 合成方式 # duration : 时间 显示图片 $game_screen.pictures[number].show(name, origin, x, y, zoom_x, zoom_y, opacity, blend_type) 移动图片 $game_screen.pictures[number].move(duration, origin, x, y, zoom_x, zoom_y, opacity, blend_type)旋转图片: $game_screen.pictures[number].rotate(速度) 删除图片: $game_screen.pictures[number].erase
一:突破上限:
1、修改范围:Game_Screen类 @pictures = [nil] for i in 1..100 @pictures.push(Game_Picture.new(i)) end 其中@pictures是容纳图片的数组,默认为100,若想扩充先需要把这里的上限扩大,这里暂时改为200 for i in 1..200 @pictures.push(Game_Picture.new(i)) end 2、修改范围:Game_Screen类 为新增加的部分添节刷新方法,找到 if $game_temp.in_battle for i in 51..100 @pictures[i].update end else for i in 1..50 @pictures[i].update end end 这里是对图片的刷新,其中$game_temp.in_battle表示在战斗中,全句之意,若在战斗中则刷新50-100号图片,反之刷新1-50号图片,这里改为: if $game_temp.in_battle for i in 51..100 @pictures[i].update end else for i in 1..200 @pictures[i].update end end 3、修改范围:Sprite_Picture类 光有肚量还不行,必须让其显示,找到 for i in 1..50 @picture_sprites.push(Sprite_Picture.new(@viewport2, $game_screen.pictures[i])) end 修改为 for i in 1..200 @picture_sprites.push(Sprite_Picture.new(@viewport2, $game_screen.pictures[i])) end 4、修改范围:Spriteset_Battle类 找到: for i in 51..100 @picture_sprites.push(Sprite_Picture.new(@viewport3, $game_screen.pictures[i])) end 可以见到战斗场景添加是51..100编号的图片,这部分修改并非必要,因为虽然事件中的“显示图片”只可以填写1..50的编号,实际上处于战斗时解释器会自动将编号增加50以对应51..100。因为事件的显示图片调用的是解释器中的command_231方法: def command_231 # 获取图片编号 number = @parameters[0] + ($game_temp.in_battle ? 50 : 0) 而直接利用$game_screen.pictures[number].show来显示图片则不会有这种问题。
注意图片数量上限越高,刷新的消耗也越高,请自己处理好需求与效率的平衡。
二:图片旋转:
1、修改范围:Game_Picture类 RM默认是利用$game_screen.pictures[number].rotate(速度)处理旋转,“速度”是个增量,若想让图片旋转指定的角度则比较麻烦。 将: attr_reader :angle # 旋转角度 改为: attr_accessor :angle # 旋转角度 之后可利用$game_screen.pictures[number].angle直接指定图片的角度。
2、修改范围:Game_Picture类
为旋转定义新的移动方法。: @move_angle = 0 # 新角度 @rotate_duration = 0 # 旋转时间
然后定义为新变量赋值的新方法: #-------------------------------------------------------------------------- # ● 旋转移动 # angle : 新角度 # duration : 时间 #-------------------------------------------------------------------------- def rotate_move(angle,duration) @move_angle = (angle - @angle) / duration @rotate_duration = duration return end
最后在update的部分添加处理旋转的刷新即可。 if @rotate_duration > 0 @angle += @move_angle @rotate_duration -= 1 end
这样通过$game_screen.pictures[number].rotate_move(新角度,时间)的方式就可以实现指定角度的旋转移动。
三:图片翻转: 实际RM的精灵对象提供了现成的翻转方法,只是RGSS未引进,我们手工将其添加进来。
1、修改范围:Game_Picture类 添加新属性 attr_accessor :mirror # 翻转 并在initialize部分初始化 @mirror = false 2、修改范围:Sprite_Picture类 在update部分添加新属性的刷新 self.mirror = @picture.mirror 以后便可利用$game_screen.pictures[number].mirror=true/false直接指定图片是否翻转
3、修改范围:Game_Picture类 定义翻转移动方法 先在initialize部分添加四个操作用变量: @move_mirror = false # 翻转标志 @mirror_duration = 0 # 翻转时间 @mirror_duration_half = 0 # 翻转点 @mirror_zoom = 0 # 翻转缩放量
定义为新变量赋值的新方法: #-------------------------------------------------------------------------- # ● 翻转移动 #-------------------------------------------------------------------------- def mir_move(mir,duration) return if @mirror == mir @mirror_duration_half = duration / 2 @mirror_duration = @mirror_duration_half * 2 @mirror_zoom = @zoom_x / @mirror_duration_half @move_mirror = mir return end
最后在update的部分添加处理翻转的刷新即可。 if @mirror_duration > 0 if @move_mirror == @mirror @zoom_x += @mirror_zoom else @zoom_x -= @mirror_zoom end @mirror_duration -= 1 if @mirror_duration == @mirror_duration_half @mirror = @move_mirror end end
这样通过$game_screen.pictures[number].mir_move(是否翻转,时间)的方式就可以实现渐变翻转。
四:图片半透明化: 这里的透明并非指影响全局的opacity属性,而是几乎未曾有人使用的bush_depth属性,我也只是在做小游戏时用过一次。 引用F1 bush_depth 精灵的草木繁茂处深度。所谓草木繁茂处深度,是半透明显示精灵下部的点数。根据这个效果,能简单地表现人物脚下象是隐藏在草木繁茂处一样。 她的性质限制了其发挥能力,只能从图片底部向上处理精灵,若想在其她边缘变化,必须先将图片旋转合适的角度。
1、修改范围:Game_Picture类 添加新属性 attr_accessor :bush_depth # 繁茂度 并在initialize部分初始化 @bush_depth = 0 # 繁茂度 2、修改范围:Sprite_Picture类 在update部分添加新属性的刷新 self.bush_depth = @picture.bush_depth 以后便可利用$game_screen.pictures[number].bush_depth=数值,直接指定图片的半透明点数。
3、修改范围:Game_Picture类 定义繁茂移动方法 先在initialize部分添加操作用变量: @move_bush = 0 # 繁茂增量 @bush_duration = 0 # 繁茂变化时间
定义为新变量赋值的新方法: #-------------------------------------------------------------------------- # ● 繁茂移动 #-------------------------------------------------------------------------- def bush_move(depth,duration) return if duration == 0 @move_bush = (depth - @bush_depth).to_f / duration @bush_duration = duration return end
最后在update的部分添加处理繁茂变化的刷新即可。 if @bush_duration > 0 @bush_depth += @move_bush @bush_duration -= 1 end
这样通过$game_screen.pictures[number].bush_move(深度,时间)的方式就可以实现渐变繁茂变化。
五:图片原点: 默认显示图片只有左上与中间两个原点显示,这在一些特殊场合(如模拟弹跳效果)时变的很不方便,当然这个“原点”可以增加。
修改范围:Sprite_Picture类 查找到: # 设置传送原点 if @picture.origin == 0 self.ox = 0 self.oy = 0 else self.ox = self.bitmap.width / 2 self.oy = self.bitmap.height / 2 end 可以见到,当原点==0时,原点为(0,0)即左上角; 除此以外原点为(self.bitmap.width / 2,self.bitmap.height / 2)即中心,我们将其改为case的形式,方便添加新的原点,例如==2时为右下角,==3时为底边中点,你可以随自己想法任意添加,而==11时根据101与102号变量(宽、高百分比)设定原点,当==12根据101与102号变量直接执行原点数值。 case @picture.origin when 0 self.ox = 0 self.oy = 0 when 1 self.ox = self.bitmap.width / 2 self.oy = self.bitmap.height / 2 when 2 self.ox = self.bitmap.width self.oy = self.bitmap.height when 3 self.ox = self.bitmap.width / 2 self.oy = self.bitmap.height when 11 self.ox = $game_variables[101].to_f / 100 * self.bitmap.width self.oy = $game_variables[102].to_f / 100 * self.bitmap.height when 12 self.ox = $game_variables[101] self.oy = $game_variables[102] end
六:图片属性直接指定: 默认情况下是禁止更改图片的单独某个属性,例如name,zoom_x等,这是对一些只需更改单独属性的操作变的麻烦,让我们把这种限制解除掉。
修改范围:Game_Picture类 将所有的attr_reader改为attr_accessor,即: #-------------------------------------------------------------------------- # ● 定义实例变量 #-------------------------------------------------------------------------- attr_reader :number # 图片编号 attr_reader :name # 文件名 attr_reader :origin # 原点 attr_reader :x # X 坐标 attr_reader :y # Y 坐标 attr_reader :zoom_x # X 方向放大率 attr_reader :zoom_y # Y 方向放大率 attr_reader :opacity # 不透明度 attr_reader :blend_type # 合成方式 attr_reader :tone # 色调
改为:
#-------------------------------------------------------------------------- # ● 定义实例变量 #-------------------------------------------------------------------------- attr_accessor :number # 图片编号 attr_accessor :name # 文件名 attr_accessor :origin # 原点 attr_accessor :x # X 坐标 attr_accessor :y # Y 坐标 attr_accessor :zoom_x # X 方向放大率 attr_accessor :zoom_y # Y 方向放大率 attr_accessor :opacity # 不透明度 attr_accessor :blend_type # 合成方式 attr_accessor :tone # 色调 如此,图片的每个属性都可单独设置,例如通过$game_screen.pictures[number].opacity=数值,直接更改图片的透明度,这一小步的修改实际的意义是非常重大的,例如当图片处于移动中时,若想更换图片,默认情况下只能通过.show的方式,但如此移动会被中断,但通过$game_screen.pictures[number].name=新图片名,的方法就可以保持原有编号图片的移动状态,整个图片强化的核心就是该步,只要对事件操作具体一定能力,可以延伸出许多正常情况难以达成的效果,具体应用,自己慢慢体会。 |