设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
Project1 查看内容

“显示图片”强化

2007-5-29 00:00| 发布者: 雷子| 查看: 11056| 评论: 0|原作者: 美兽

摘要:   作者 美兽 版本 没有 相关网址 点此进入讨论贴 范例工程 点击下载   教程内容 基本指令:  首先要明确“显示图片”的脚本(事件中的脚本)调用方法:   

 

作者

美兽

版本

没有

相关网址

点此进入讨论贴

范例工程

点击下载


 

教程内容

基本指令:

 首先要明确“显示图片”的脚本(事件中的脚本)调用方法:
   #     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=新图片名,的方法就可以保持原有编号图片的移动状态,整个图片强化的核心就是该步,只要对事件操作具体一定能力,可以延伸出许多正常情况难以达成的效果,具体应用,自己慢慢体会。
 
 

教程的通用说明

本站发布的教程,大多经过一些测试,应该都能够实现相应功能。但不保证所有的教程都是最优化的制作方法。

相关问题,点击发布贴进行讨论。谢谢您的鼓励与支持。


鲜花
拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-30 07:23

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

返回顶部