设为首页收藏本站同能贴吧 切换语言 繁体中文
开启辅助访问 切换到窄版
扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 120|回复: 0

[转载发布] Sprite Reflections and Wave Effects

[复制链接]
累计送礼:
0 个
累计收礼:
1 个
  • TA的每日心情
    开心
    2026-7-12 04:10
  • 签到天数: 209 天

    连续签到: 2 天

    [LV.7]常住居民III

    9015

    主题

    864

    回帖

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    7
    卡币
    58751
    OK点
    16
    推广点
    0
    同能卷
    50
    积分
    68660

    灌水之王

    发表于 2026-7-22 21:19:02 | 显示全部楼层 |阅读模式
    This is one of the first scripts I made back in 2012.

    Back in the early era of XP, JmsPlDnl y Rataime made a Sprite Reflection script for that maker, and it was widely used. I took that idea to make another one, but in another way. In my version, each event and player has a copy of its graphic, flipped and with a Z below 0. That means usually you don't see it, but if you define a transparent water autotile and use a panorama or a similar trick to define the background of the water, you can see the reflection in between.

    Author: Wecoc
    Release Date: July 2012
    Last Version: January 2018

    Terms of Use
    - Giving credits (Wecoc) for using this script is optional, but appreciated.
    - The Wave Effect Addon is an edit of a code by Zecomeia, so you should credit her.
    - You can repost this code.
    - You can edit this code freely, and distribute the edits as well.
    - This code can be used on commercial games.

    Code
                    Ruby:       
    1. #==============================================================================
    2. # ** [XP] Sprite_Reflection v1.2
    3. #------------------------------------------------------------------------------
    4. # Author: Wecoc (no credits required)
    5. #==============================================================================
    6. #==============================================================================
    7. # ** Sprite_Reflection
    8. #==============================================================================
    9. class Sprite_Reflection < RPG::Sprite
    10.   #--------------------------------------------------------------------------
    11.   attr_accessor :character
    12.   #--------------------------------------------------------------------------
    13.   # * Initialize
    14.   #--------------------------------------------------------------------------
    15.   def initialize(viewport=nil, character=nil)
    16.     super(viewport)
    17.     @character = character
    18.     update
    19.   end
    20.   #--------------------------------------------------------------------------
    21.   # * Update
    22.   #--------------------------------------------------------------------------
    23.   def update
    24.     super
    25.     if @tile_id != @character.tile_id or
    26.        @character_name != @character.character_name or
    27.        @character_hue != @character.character_hue
    28.       @tile_id = @character.tile_id
    29.       @character_name = @character.character_name
    30.       @character_hue = @character.character_hue
    31.       if @tile_id >= 384
    32.         self.bitmap = RPG::Cache.tile($game_map.tileset_name,
    33.           @tile_id, @character.character_hue)
    34.         self.src_rect.set(0, 0, 32, 32)
    35.         self.ox = 16
    36.         self.oy = 32
    37.       else
    38.         self.bitmap = RPG::Cache.character(@character.character_name,
    39.           @character.character_hue)
    40.         @cw = bitmap.width / 4
    41.         @ch = bitmap.height / 4
    42.         self.ox = @cw / 2
    43.         self.oy = @ch
    44.       end
    45.     end
    46.     self.visible = (not @character.transparent && @character.reflection)
    47.     self.mirror = true
    48.     self.angle = 180
    49.     if @tile_id == 0
    50.       sx = @character.pattern * @cw
    51.       sy = (@character.direction - 2) / 2 * @ch
    52.       self.src_rect.set(sx, sy, @cw, @ch)
    53.     end
    54.     self.x = @character.screen_x - 1
    55.     self.y = @character.screen_y
    56.     self.z = @character.screen_z(@ch) - 999
    57.     self.opacity = @character.opacity
    58.     self.blend_type = @character.blend_type
    59.     self.bush_depth = @character.bush_depth
    60.   end
    61. end
    62. #==============================================================================
    63. # ** Game_Character
    64. #==============================================================================
    65. class Game_Character
    66.   #--------------------------------------------------------------------------
    67.   # * Initialize
    68.   #--------------------------------------------------------------------------
    69.   attr_accessor :reflection
    70.   alias reflect_ini initialize unless $@
    71.   def initialize
    72.     reflect_ini
    73.     @reflection = true
    74.   end
    75. end
    76. #==============================================================================
    77. # ** Spriteset_Map
    78. #==============================================================================
    79. class Spriteset_Map
    80.   #--------------------------------------------------------------------------
    81.   # * Initialize
    82.   #--------------------------------------------------------------------------
    83.   alias reflect_ini initialize unless $@
    84.   def initialize
    85.     @reflection_sprites = []
    86.     reflect_ini
    87.     for i in 0...@character_sprites.size
    88.       s = @character_sprites[i]
    89.       sprite = Sprite_Reflection.new(@viewport1, s.character)
    90.       @reflection_sprites.push(sprite)
    91.     end
    92.     update
    93.   end
    94.   #--------------------------------------------------------------------------
    95.   # * Dispose
    96.   #--------------------------------------------------------------------------
    97.   alias reflect_dis dispose unless $@
    98.   def dispose
    99.     reflect_dis
    100.     for sprite in @reflection_sprites
    101.       sprite.dispose
    102.     end
    103.   end
    104.   #--------------------------------------------------------------------------
    105.   # * Update
    106.   #--------------------------------------------------------------------------
    107.   alias reflect_upd update unless $@
    108.   def update
    109.     reflect_upd
    110.     for sprite in @reflection_sprites
    111.       sprite.update
    112.     end
    113.   end
    114. end
    复制代码


    Usage
    To define if the player or an event has reflection, simply use this on a script call:
                    Code:       
    1. $game_player.reflection = true / false
    2. $game_map.events[ID].reflection = true / false
    复制代码


    Related scripts
    By the same time, Zecomeia made a code for Wave Effects.

    Long time ago I made some edits of that code, I'll include it here with some instructions as well.

    Spoiler: Wave Effects
                    Ruby:       
    1. #==============================================================================
    2. # ** [XP] Wave Effect
    3. #------------------------------------------------------------------------------
    4. # By:         Zecomeia
    5. # Date:       01/03/2010
    6. # Version:    1.0
    7. # Edit by:    Wecoc
    8. # Edit Date:  26/07/2017
    9. #------------------------------------------------------------------------------
    10. # www.colmeia-do-ze.blogspot.com
    11. #==============================================================================
    12. class Sprite
    13.   attr_accessor   :wave_amp
    14.   attr_accessor   :wave_length
    15.   attr_accessor   :wave_speed
    16.   attr_accessor   :wave_phase
    17.   attr_accessor   :temp_bitmap
    18.   alias wave_effect_ini initialize unless $@
    19.   def initialize(viewport=nil)
    20.     @wave_amp = 0
    21.     @wave_length = 72
    22.     @wave_speed = 720
    23.     @wave_phase = 0.25
    24.     wave_effect_ini(viewport)
    25.     @temp_bitmap = nil
    26.   end
    27.   alias wave_effect_upd update unless $@
    28.   def update
    29.     # the wave effect only works if wave_amp
    30.     # propertie is a number more than zero
    31.     wave_effect if @wave_amp > 0
    32.     wave_effect_upd
    33.   end
    34.   # Return the width of image, because when use
    35.   # obj.bitmap.width the value will be more than
    36.   # the original value(because effect)
    37.   def width
    38.     return (self.bitmap.width - @wave_amp * 2)
    39.   end
    40.   def wave_effect
    41.     return if self.bitmap.nil?
    42.     @temp_bitmap = self.bitmap if @temp_bitmap.nil?
    43.     cw = @temp_bitmap.width + (@wave_amp * 2)
    44.     ch = @temp_bitmap.height
    45.     # Follow the VX wave effect, each horizontal line
    46.     # has 8 pixel of height. This device provides less
    47.     # lag in game.
    48.     divisions = @temp_bitmap.height / 8
    49.     divisions += 1 if @temp_bitmap.height % 8 != 0
    50.     self.bitmap = Bitmap.new(cw, ch)
    51.     for i in 0..divisions
    52.       x = @wave_amp * Math.sin(i * 2 * Math::PI / (@wave_length / 8).to_i +
    53.       (@wave_phase * Math::PI) / 180.0)
    54.       src_rect = Rect.new(0, i*8, @temp_bitmap.width, 8)
    55.       dest_rect = Rect.new(@wave_amp + x, i * 8, @temp_bitmap.width, 8)
    56.       self.bitmap.stretch_blt(dest_rect, @temp_bitmap, src_rect)
    57.     end
    58.     # frame rate: VX = 60 | XP = 40
    59.     # wave speed compatibility VX to XP: wave_speed * 60/40
    60.     # then: wave_speed * 1.5
    61.     @wave_phase += @wave_speed * 1.5 / @wave_length
    62.     @wave_phase -= 360 if @wave_phase > 360
    63.     @wave_phase += 360 if @wave_phase < 0
    64.   end
    65. end
    66. for Klass in [Game_Character, Game_Battler, Game_Picture]
    67.   class Klass
    68.     attr_accessor   :wave_amp
    69.     attr_accessor   :wave_length
    70.     attr_accessor   :wave_speed
    71.     alias wave_effect_ini initialize unless $@
    72.     def initialize(*args)
    73.       wave_effect_ini(*args)
    74.       @wave_amp = 0
    75.       @wave_length = 72
    76.       @wave_speed = 720
    77.     end
    78.   end
    79. end
    80. class Spriteset_Map
    81.   alias wave_effect_upd update unless $@
    82.   def update
    83.     wave_effect_upd
    84.     for i in 0...@character_sprites.size
    85.       sprite = @character_sprites[i]
    86.       if i == @character_sprites.size - 1
    87.         sprite.wave_amp     = $game_player.wave_amp
    88.         sprite.wave_length  = $game_player.wave_length
    89.         sprite.wave_speed   = $game_player.wave_speed
    90.       else
    91.         event = $game_map.events[i + 1]
    92.         next if event.nil?
    93.         sprite.wave_amp     = event.wave_amp
    94.         sprite.wave_length  = event.wave_length
    95.         sprite.wave_speed   = event.wave_speed
    96.       end
    97.     end
    98.     for i in 0...@picture_sprites.size
    99.       picture = $game_screen.pictures[i + 1]
    100.       sprite = @picture_sprites[i]
    101.       sprite.wave_amp     = picture.wave_amp
    102.       sprite.wave_length  = picture.wave_length
    103.       sprite.wave_speed   = picture.wave_speed
    104.     end
    105.   end
    106. end
    107. class Spriteset_Battle
    108.   alias wave_effect_upd update unless $@
    109.   def update
    110.     wave_effect_upd
    111.     for i in 0...@enemy_sprites.size
    112.       enemy = $game_troop.enemies.reverse[i]
    113.       next if enemy.nil? or !enemy.exist?
    114.       sprite = @enemy_sprites[i]
    115.       sprite.wave_amp     = enemy.wave_amp
    116.       sprite.wave_length  = enemy.wave_length
    117.       sprite.wave_speed   = enemy.wave_speed
    118.     end
    119.     for i in 0...@actor_sprites.size
    120.       actor = $game_party.actors[i]
    121.       next if actor.nil? or !actor.exist?
    122.       sprite = @actor_sprites[i]
    123.       sprite.wave_amp     = actor.wave_amp
    124.       sprite.wave_length  = actor.wave_length
    125.       sprite.wave_speed   = actor.wave_speed
    126.     end
    127.     for i in 0...@picture_sprites.size
    128.       picture = $game_screen.pictures[i + 51]
    129.       sprite = @picture_sprites[i]
    130.       sprite.wave_amp     = picture.wave_amp
    131.       sprite.wave_length  = picture.wave_length
    132.       sprite.wave_speed   = picture.wave_speed
    133.     end
    134.   end
    135. end
    复制代码


    To use it you should use
    1. sprite.wave_amp = n
    复制代码
    , where the n is the desired amplitude and the sprite may be:

                    Code:       
    1. $game_player              # The player
    2. $game_map.events[ID]      # Event
    3. $game_screen.pictures[ID] # Picture
    4. $game_party.actors[ID]    # Battler (Actor, by party ID)
    5. $game_actors[ID]          # Battler (Actor, by actor ID)
    6. $game_troop.enemies[ID]   # Battler (Enemy, by troop ID)
    复制代码


    Finally, this little AddOn uses both scripts to implement the wave effect on the reflections.

    Spoiler: Sprite Reflection's Wave AddOn
                    Ruby:       
    1. #==============================================================================
    2. # ** [XP] Sprite Reflection's Wave AddOn
    3. #------------------------------------------------------------------------------
    4. # This code uses Sprite_Reflection 1.2 and Wave Effect
    5. #==============================================================================
    6. class Sprite_Reflection
    7.   #----------------------------------------------------------------------------
    8.   DEFAULT_WAVE_AMP = 2
    9.   DEFAULT_WAVE_LENGTH = 128
    10.   DEFAULT_WAVE_SPEED = 720
    11.   #----------------------------------------------------------------------------
    12.   alias wave_addon_ini initialize unless $@
    13.   def initialize(*args)
    14.     wave_addon_ini(*args)
    15.     @wave_amp = DEFAULT_WAVE_AMP
    16.     @wave_length = DEFAULT_WAVE_LENGTH
    17.     @wave_speed = DEFAULT_WAVE_SPEED
    18.   end
    19. end
    20. class Sprite
    21.   def remove_wave
    22.     @wave_amp = 0
    23.     self.bitmap = @temp_bitmap.clone
    24.   end
    25. end
    26. class Scene_Map
    27.   attr_reader :spriteset
    28. end
    29. class Spriteset_Map
    30.   attr_reader :reflection_sprites
    31. end
    32. class Interpreter
    33.   def reflection_sprite(event_id)
    34.     return if !$scene.is_a?(Scene_Map)
    35.     spriteset = $scene.spriteset
    36.     return if spriteset.nil?
    37.     sprites = spriteset.reflection_sprites
    38.     case event_id
    39.     when -1 # Player
    40.       sprite = sprites.select do |sprite|
    41.         sprite.character == $game_player
    42.       end[0]
    43.     when 0 # Current Character
    44.       sprite = sprites.select do |sprite|
    45.         sprite.character == $game_map.events[@event_id]
    46.       end[0]
    47.     else # Character ID
    48.       sprite = sprites.select do |sprite|
    49.         sprite.character == $game_map.events[event_id]
    50.       end[0]
    51.     end
    52.     return sprite
    53.   end
    54. end
    复制代码


    To get the sprite and apply the Wave Effect changes, use:
                    Code:       
    1. reflection_sprite(-1) # Player
    2. reflection_sprite(0)  # Current event
    3. reflection_sprite(1)  # Event with ID 1
    复制代码


    For example:
    1. reflection_sprite(-1).wave_amp = 4
    复制代码

    If you want to remove the effect, setting the wave_amp to 0 is not enough since the current waves will still be visible.
    To completely remove it use:
    1. reflection_sprite(-1).remove_wave
    复制代码
    That's all.


    本贴来自国际rpgmaker官方论坛作者:Wecoc处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:https://forums.rpgmakerweb.com/threads/sprite-reflections-and-wave-effects.138188/
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    简体中文
    繁體中文
    English(英语)
    日本語(日语)
    Deutsch(德语)
    Русский язык(俄语)
    بالعربية(阿拉伯语)
    Türkçe(土耳其语)
    Português(葡萄牙语)
    ภาษาไทย(泰国语)
    한어(朝鲜语/韩语)
    Français(法语)
    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2026-8-4 12:52 , Processed in 0.140770 second(s), 52 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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