- 注册时间
- 2005-4-15
- 最后登录
- 2008-6-21
⑦老手
暗夜下可怜人
- 积分
- 6150
|
基本指令:
- 首先要明确“显示图片”的脚本(事件中的脚本)调用方法:
- # 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=新图片名,的方法就可以保持原有编号图片的移动状态,整个图片强化的核心就是该步,只要对事件操作具体一定能力,可以延伸出许多正常情况难以达成的效果,具体应用,自己慢慢体会。
复制代码
结束。
范例下载:
点偶下载 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|