幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1833|回复: 4

[原创]“显示图片”强化。

[复制链接]

79

主题

617

帖子

6150

积分

⑦老手

暗夜下可怜人

积分
6150
发表于 2007-5-6 21:08:15 | 显示全部楼层 |阅读模式
基本指令:
  1.   首先要明确“显示图片”的脚本(事件中的脚本)调用方法:
  2.     #     name         : 文件名
  3.     #     origin       : 原点
  4.     #     x            : X 坐标
  5.     #     y            : Y 坐标
  6.     #     zoom_x       : X 方向放大率
  7.     #     zoom_y       : Y 方向放大率
  8.     #     opacity      : 不透明度
  9.     #     blend_type   : 合成方式
  10.     #     duration     : 时间
  11.   显示图片
  12.   $game_screen.pictures[number].show(name, origin, x, y, zoom_x, zoom_y, opacity, blend_type)   移动图片
  13.   $game_screen.pictures[number].move(duration, origin, x, y, zoom_x, zoom_y, opacity, blend_type)旋转图片:
  14.   $game_screen.pictures[number].rotate(速度)
  15.   删除图片:
  16.   $game_screen.pictures[number].erase
复制代码

一:突破上限:
  1. 1、修改范围:Game_Screen类
  2.     @pictures = [nil]
  3.     for i in 1..100
  4.       @pictures.push(Game_Picture.new(i))
  5.     end
  6.    其中@pictures是容纳图片的数组,默认为100,若想扩充先需要把这里的上限扩大,这里暂时改为200
  7.     for i in 1..200
  8.       @pictures.push(Game_Picture.new(i))
  9.     end
  10. 2、修改范围:Game_Screen类
  11.    为新增加的部分添节刷新方法,找到
  12.     if $game_temp.in_battle
  13.       for i in 51..100
  14.         @pictures[i].update
  15.       end
  16.     else
  17.       for i in 1..50
  18.         @pictures[i].update
  19.       end
  20.     end
  21.     这里是对图片的刷新,其中$game_temp.in_battle表示在战斗中,全句之意,若在战斗中则刷新50-100号图片,反之刷新1-50号图片,这里改为:
  22.     if $game_temp.in_battle
  23.       for i in 51..100
  24.         @pictures[i].update
  25.       end
  26.     else
  27.       for i in 1..200
  28.         @pictures[i].update
  29.       end
  30.      end
  31. 3、修改范围:Sprite_Picture类
  32.    光有肚量还不行,必须让其显示,找到
  33.    for i in 1..50
  34.      @picture_sprites.push(Sprite_Picture.new(@viewport2,
  35.      $game_screen.pictures[i]))
  36.    end
  37.    修改为
  38.    for i in 1..200
  39.      @picture_sprites.push(Sprite_Picture.new(@viewport2,
  40.      $game_screen.pictures[i]))
  41.    end
  42. 4、修改范围:Spriteset_Battle类
  43.    找到:
  44.     for i in 51..100
  45.       @picture_sprites.push(Sprite_Picture.new(@viewport3,
  46.         $game_screen.pictures[i]))
  47.     end
  48.     可以见到战斗场景添加是51..100编号的图片,这部分修改并非必要,因为虽然事件中的“显示图片”只可以填写1..50的编号,实际上处于战斗时解释器会自动将编号增加50以对应51..100。因为事件的显示图片调用的是解释器中的command_231方法:
  49.   def command_231
  50.     # 获取图片编号
  51.     number = @parameters[0] + ($game_temp.in_battle ? 50 : 0)
  52.    而直接利用$game_screen.pictures[number].show来显示图片则不会有这种问题。
  53.    注意图片数量上限越高,刷新的消耗也越高,请自己处理好需求与效率的平衡。
复制代码

二:图片旋转:
  1. 1、修改范围:Game_Picture类
  2.    RM默认是利用$game_screen.pictures[number].rotate(速度)处理旋转,“速度”是个增量,若想让图片旋转指定的角度则比较麻烦。
  3.    将:
  4.    attr_reader   :angle                    # 旋转角度
  5.    改为:
  6.    attr_accessor   :angle                    # 旋转角度
  7.    之后可利用$game_screen.pictures[number].angle直接指定图片的角度。
复制代码
  1. 2、修改范围:Game_Picture类
  2.    为旋转定义新的移动方法。:
  3.     @move_angle = 0           # 新角度
  4.     @rotate_duration = 0      # 旋转时间
  5.    然后定义为新变量赋值的新方法:
  6.    #--------------------------------------------------------------------------
  7.    # ● 旋转移动
  8.    #     angle : 新角度
  9.    #     duration : 时间
  10.    #--------------------------------------------------------------------------  
  11.    def rotate_move(angle,duration)
  12.        @move_angle = (angle - @angle) / duration
  13.        @rotate_duration = duration
  14.        return
  15.    end  
  16.    最后在update的部分添加处理旋转的刷新即可。
  17.     if @rotate_duration > 0
  18.        @angle += @move_angle
  19.        @rotate_duration -= 1
  20.     end
  21.    这样通过$game_screen.pictures[number].rotate_move(新角度,时间)的方式就可以实现指定角度的旋转移动。
复制代码

三:图片翻转:
    实际RM的精灵对象提供了现成的翻转方法,只是RGSS未引进,我们手工将其添加进来。
  1. 1、修改范围:Game_Picture类
  2.    添加新属性
  3.    attr_accessor :mirror                   # 翻转
  4.    并在initialize部分初始化
  5.    @mirror = false
  6. 2、修改范围:Sprite_Picture类
  7.    在update部分添加新属性的刷新
  8.    self.mirror = @picture.mirror
  9.    以后便可利用$game_screen.pictures[number].mirror=true/false直接指定图片是否翻转。
复制代码
  1. 3、修改范围:Game_Picture类
  2.    定义翻转移动方法
  3.    先在initialize部分添加四个操作用变量:
  4.     @move_mirror = false       # 翻转标志
  5.     @mirror_duration = 0       # 翻转时间   
  6.     @mirror_duration_half = 0  # 翻转点   
  7.     @mirror_zoom = 0           # 翻转缩放量
  8.    定义为新变量赋值的新方法:
  9.    #--------------------------------------------------------------------------
  10.    # ● 翻转移动
  11.    #--------------------------------------------------------------------------  
  12.    def mir_move(mir,duration)
  13.        return if @mirror == mir
  14.        @mirror_duration_half = duration / 2     
  15.        @mirror_duration = @mirror_duration_half * 2  
  16.        @mirror_zoom = @zoom_x / @mirror_duration_half
  17.        @move_mirror = mir
  18.        return
  19.    end   
  20.    最后在update的部分添加处理翻转的刷新即可。
  21.     if @mirror_duration > 0      
  22.        if @move_mirror == @mirror
  23.           @zoom_x += @mirror_zoom         
  24.        else
  25.           @zoom_x -= @mirror_zoom         
  26.        end
  27.        @mirror_duration -= 1
  28.        if @mirror_duration == @mirror_duration_half  
  29.           @mirror = @move_mirror
  30.        end              
  31.     end
  32.    这样通过$game_screen.pictures[number].mir_move(是否翻转,时间)的方式就可以实现渐变翻转。
复制代码

四:图片半透明化:
    这里的透明并非指影响全局的opacity属性,而是几乎未曾有人使用的bush_depth属性,我也只是在做小游戏时用过一次。
    引用F1
    bush_depth
    精灵的草木繁茂处深度。所谓草木繁茂处深度,是半透明显示精灵下部的点数。根据这个效果,能简单地表现人物脚下象是隐藏在草木繁茂处一样。
    她的性质限制了其发挥能力,只能从图片底部向上处理精灵,若想在其她边缘变化,必须先将图片旋转合适的角度。
  1. 1、修改范围:Game_Picture类
  2.    添加新属性
  3.    attr_accessor :bush_depth      # 繁茂度
  4.    并在initialize部分初始化
  5.    @bush_depth = 0                # 繁茂度
  6. 2、修改范围:Sprite_Picture类
  7.    在update部分添加新属性的刷新
  8.    self.bush_depth = @picture.bush_depth
  9.    以后便可利用$game_screen.pictures[number].bush_depth=数值,直接指定图片的半透明点数。
复制代码
  1. 3、修改范围:Game_Picture类
  2.    定义繁茂移动方法
  3.    先在initialize部分添加操作用变量:
  4.     @move_bush = 0             # 繁茂增量
  5.     @bush_duration = 0          # 繁茂变化时间
  6.    定义为新变量赋值的新方法:
  7.    #--------------------------------------------------------------------------
  8.    # ● 繁茂移动
  9.    #--------------------------------------------------------------------------  
  10.    def bush_move(depth,duration)
  11.        return if duration == 0
  12.        @move_bush = (depth - @bush_depth).to_f / duration
  13.        @bush_duration = duration
  14.        return
  15.    end  
  16.    最后在update的部分添加处理繁茂变化的刷新即可。
  17.     if @bush_duration > 0
  18.        @bush_depth += @move_bush
  19.        @bush_duration -= 1
  20.     end
  21.    这样通过$game_screen.pictures[number].bush_move(深度,时间)的方式就可以实现渐变繁茂变化。
复制代码

五:图片原点:
    默认显示图片只有左上与中间两个原点显示,这在一些特殊场合(如模拟弹跳效果)时变的很不方便,当然这个“原点”可以增加。
  1.    修改范围:Sprite_Picture类
  2.    查找到:
  3.     # 设置传送原点
  4.     if @picture.origin == 0
  5.       self.ox = 0
  6.       self.oy = 0
  7.     else
  8.       self.ox = self.bitmap.width / 2
  9.       self.oy = self.bitmap.height / 2
  10.     end
  11.    可以见到,当原点==0时,原点为(0,0)即左上角;
  12.    除此以外原点为(self.bitmap.width / 2,self.bitmap.height / 2)即中心,我们将其改为case的形式,方便添加新的原点,例如==2时为右下角,==3时为底边中点,你可以随自己想法任意添加,而==11时根据101与102号变量(宽、高百分比)设定原点,当==12根据101与102号变量直接执行原点数值。
  13.     case @picture.origin
  14.     when 0
  15.       self.ox = 0
  16.       self.oy = 0
  17.     when 1
  18.       self.ox = self.bitmap.width / 2
  19.       self.oy = self.bitmap.height / 2
  20.     when 2
  21.       self.ox = self.bitmap.width
  22.       self.oy = self.bitmap.height  
  23.     when 3
  24.       self.ox = self.bitmap.width / 2
  25.       self.oy = self.bitmap.height      
  26.     when 11
  27.       self.ox = $game_variables[101].to_f / 100 * self.bitmap.width
  28.       self.oy = $game_variables[102].to_f / 100 * self.bitmap.height   
  29.     when 12
  30.       self.ox = $game_variables[101]
  31.       self.oy = $game_variables[102]
  32.     end
复制代码

六:图片属性直接指定:
    默认情况下是禁止更改图片的单独某个属性,例如name,zoom_x等,这是对一些只需更改单独属性的操作变的麻烦,让我们把这种限制解除掉。
  1.     修改范围:Game_Picture类
  2.     将所有的attr_reader改为attr_accessor,即:
  3.     #--------------------------------------------------------------------------
  4.     # ● 定义实例变量
  5.     #--------------------------------------------------------------------------
  6.     attr_reader   :number                   # 图片编号
  7.     attr_reader   :name                     # 文件名
  8.     attr_reader   :origin                   # 原点
  9.     attr_reader   :x                        # X 坐标
  10.     attr_reader   :y                        # Y 坐标
  11.     attr_reader   :zoom_x                   # X 方向放大率
  12.     attr_reader   :zoom_y                   # Y 方向放大率
  13.     attr_reader   :opacity                  # 不透明度
  14.     attr_reader   :blend_type               # 合成方式
  15.     attr_reader   :tone                     # 色调
  16.     改为:
  17.     #--------------------------------------------------------------------------
  18.     # ● 定义实例变量
  19.     #--------------------------------------------------------------------------
  20.     attr_accessor   :number                   # 图片编号
  21.     attr_accessor   :name                     # 文件名
  22.     attr_accessor   :origin                   # 原点
  23.     attr_accessor   :x                        # X 坐标
  24.     attr_accessor   :y                        # Y 坐标
  25.     attr_accessor   :zoom_x                   # X 方向放大率
  26.     attr_accessor   :zoom_y                   # Y 方向放大率
  27.     attr_accessor   :opacity                  # 不透明度
  28.     attr_accessor   :blend_type               # 合成方式
  29.     attr_accessor   :tone                     # 色调
  30.    
  31.     如此,图片的每个属性都可单独设置,例如通过$game_screen.pictures[number].opacity=数值,直接更改图片的透明度,这一小步的修改实际的意义是非常重大的,例如当图片处于移动中时,若想更换图片,默认情况下只能通过.show的方式,但如此移动会被中断,但通过$game_screen.pictures[number].name=新图片名,的方法就可以保持原有编号图片的移动状态,整个图片强化的核心就是该步,只要对事件操作具体一定能力,可以延伸出许多正常情况难以达成的效果,具体应用,自己慢慢体会。
复制代码

    结束。

    范例下载:
    点偶下载

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
希望破灭是因为发现真实,宁可背负罪孽也要维护爱我之人,永远的娜乌西卡!!!!!!
回复

使用道具 举报

好人卡的 该用户已被删除
发表于 2007-5-6 21:26:14 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

0

主题

9

帖子

112

积分

③业余

积分
112
发表于 2007-5-6 21:51:08 | 显示全部楼层
............算了,路过罢
回复 支持 反对

使用道具 举报

90

主题

785

帖子

1278万

积分

版主

Rank: 7Rank: 7Rank: 7

积分
12786515
QQ
发表于 2007-5-7 12:20:11 | 显示全部楼层
美兽大人又发些邪恶物了......

考虑到图片翻转...嗯... [s:4]
回复 支持 反对

使用道具 举报

2

主题

23

帖子

255

积分

③业余

积分
255
发表于 2007-10-23 11:37:15 | 显示全部楼层
牛B啊·~~
新手~~大家帮帮我~~ 谢谢了~~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2025-6-21 13:28 , Processed in 0.011916 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表