赞 | 0 |
VIP | 17 |
好人卡 | 0 |
积分 | 1 |
经验 | 1022914 |
最后登录 | 2017-2-4 |
在线时间 | 10 小时 |
Lv1.梦旅人 月下可怜人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 10 小时
- 注册时间
- 2005-11-23
- 帖子
- 4085
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
基本指令:
首先要明确“显示图片”的脚本(事件中的脚本)调用方法:
# 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.update
end
else
for i in 1..50
@pictures.update
end
end
这里是对图片的刷新,其中$game_temp.in_battle表示在战斗中,全句之意,若在战斗中则刷新50-100号图片,反之刷新1-50号图片,这里改为:
if $game_temp.in_battle
for i in 51..100
@pictures.update
end
else
for i in 1..200
@pictures.update
end
end
3、修改范围:Sprite_Picture类
光有肚量还不行,必须让其显示,找到
for i in 1..50
@picture_sprites.push(Sprite_Picture.new(@viewport2,
$game_screen.pictures))
end
修改为
for i in 1..200
@picture_sprites.push(Sprite_Picture.new(@viewport2,
$game_screen.pictures))
end
4、修改范围:Spriteset_Battle类
找到:
for i in 51..100
@picture_sprites.push(Sprite_Picture.new(@viewport3,
$game_screen.pictures))
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=新图片名,的方法就可以保持原有编号图片的移动状态,整个图片强化的核心就是该步,只要对事件操作具体一定能力,可以延伸出许多正常情况难以达成的效果,具体应用,自己慢慢体会。
结束。
范例下载:
http://rpg.blue/UP_PIC/200705/显示图片加强范例.rar
|
|