じ☆ve冰风 发表于 2026-7-19 09:18:33

Custom Bushes

This simple script allows changing how the "bush" effect is displayed in both the player and events. It's very easy to use, paste it above the script Main and follow the instructions I'll give below.

Author: Wecoc
First Release: September 2016
Last Version: October 2016

Terms of use
- Giving credits (Wecoc) for using this script is optional, but appreciated.
- 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.

                Ruby:       
#==============================================================================
# ** Custom Bush v1.2
#------------------------------------------------------------------------------
#Author: Wecoc (credits are optional)
#==============================================================================

module Custom_Bush
DEPTH = 12                  # Default depth
COLOR = Color.new(0, 0, 0, 0) # Default color
OPACITY = 160               # Default opacity
TEMPLATE = ''               # Template
end

#==============================================================================
# ** Game_Character
#==============================================================================

class Game_Character

attr_writer:bush_depth

attr_accessor :bush_color
attr_accessor :bush_opacity
attr_accessor :bush_template

alias custom_bush_ini initialize unless $@
def initialize
    custom_bush_ini
    @bush_depth = Custom_Bush::DEPTH
    @bush_color = Custom_Bush::COLOR
    @bush_opacity = Custom_Bush::OPACITY
    @bush_template = Custom_Bush::TEMPLATE
end

def bush_depth
    return 0 if @tile_id > 0 or @always_on_top
    if @jump_count == 0 and $game_map.bush?(@x, @y)
      return @bush_depth
    else
      return 0
    end
end
end

#==============================================================================
# ** Sprite_Character
#==============================================================================

class Sprite_Character < RPG::Sprite

attr_accessor :bush_color
attr_accessor :bush_opacity
attr_accessor :bush_template

def initialize(viewport, character = nil)
    super(viewport)
    @character = character
    @bush_depth = 0
    @bush_color = Custom_Bush::COLOR
    @bush_opacity = Custom_Bush::OPACITY
    @bush_template = Custom_Bush::TEMPLATE
    update
end

def bush_depth
    @bush_depth
end

def bush_depth=(bush_depth)
    @bush_depth = bush_depth
end

def refresh_bush
    return if @bush_depth == 0
    bush_depth = @bush_depth
    if @template_bitmap != nil
      bush_depth += @template_bitmap.height / 2
    end
    for iy in 0...bush_depth
      for ix in 0...bitmap.width
      for dy in 0..4
          x = ix
          y = (@ch * dy) - bush_depth + iy
          bitmap_color = self.bitmap.get_pixel(x, y)
          if @template_bitmap != nil && iy < @template_bitmap.height
            tx = ix % (bitmap.width / 4)
            tx = tx % @template_bitmap.width
            ty = iy
            template_color = @template_bitmap.get_pixel(tx, ty)
            next if template_color.alpha == 0
            next if template_color == Color.new(0,0,0)
          end
          next if bitmap_color.alpha == 0
          r = bitmap_color.red
          g = bitmap_color.green
          b = bitmap_color.blue
          bc = @bush_color
          r = (r * (255 - bc.alpha) + (bc.red* bc.alpha)) / 255
          g = (g * (255 - bc.alpha) + (bc.green * bc.alpha)) / 255
          b = (b * (255 - bc.alpha) + (bc.blue* bc.alpha)) / 255
          a = (bitmap_color.alpha * @bush_opacity) / 255
          self.bitmap.set_pixel(x, y, Color.new(r,g,b,a))
      end
      end
    end
end

def update
    super
    if @bush_template != @character.bush_template or @template_bitmap.nil?
      bush_template = @character.bush_template
      if bush_template != ''
      @template_bitmap = RPG::Cache.picture(bush_template) rescue nil
      else
      @template_bitmap = nil
      end
    end
    if @tile_id != @character.tile_id or
      @character_name != @character.character_name or
      @character_hue != @character.character_hue or
      @bush_depth != @character.bush_depth or
      @bush_color != @character.bush_color or
      @bush_opacity != @character.bush_opacity or
      @bush_template != @character.bush_template
      @tile_id = @character.tile_id
      @character_name = @character.character_name
      @character_hue = @character.character_hue
      if @tile_id >= 384
      self.bitmap = RPG::Cache.tile($game_map.tileset_name,
          @tile_id, @character.character_hue).clone
      self.src_rect.set(0, 0, 32, 32)
      self.ox = 16
      self.oy = 32
      else
      self.bitmap = RPG::Cache.character(@character.character_name,
          @character.character_hue).clone
      @cw = bitmap.width / 4
      @ch = bitmap.height / 4
      self.ox = @cw / 2
      self.oy = @ch
      self.bush_depth = @character.bush_depth
      self.bush_color = @character.bush_color
      self.bush_opacity = @character.bush_opacity
      self.bush_template = @character.bush_template
      refresh_bush
      end
    end
    self.visible = (not @character.transparent)
    if @tile_id == 0
      sx = @character.pattern * @cw
      sy = (@character.direction - 2) / 2 * @ch
      self.src_rect.set(sx, sy, @cw, @ch)
    end
    self.x = @character.screen_x
    self.y = @character.screen_y
    self.z = @character.screen_z(@ch)
    self.opacity = @character.opacity
    self.blend_type = @character.blend_type
    if @character.animation_id != 0
      animation = $data_animations[@character.animation_id]
      animation(animation, true)
      @character.animation_id = 0
    end
end
end


Instructions
On the very beginning of the code you can change the default bush depth, color and opacity. You can also define Picture as a template.

You can change that from an event as well, here's how you would change the bush depth on the player or a certain event:
$game_player.bush_depth = VALUE
$game_map.events[1].bush_depth = VALUE

By default it's 12, if you change it to 0 that would mean the bush effect would never effect that event.

Similarly, this changes the color of the sprite part inside the bush. Eatch RGBA value goes from 0 to 255.
$game_player.bush_color = Color.new(R, G, B, A)
By default on XP only the opacity is changed, but changing the color is a nice touch in my opinion.

To change the opacity use this:
$game_player.bush_opacity = VALUE

Finally, you can define a template like this, and using a width higher than the character's will work like an animated template, like this.
$game_player.bush_template = 'PICTURE NAME'

Spoiler: Screen


Here I defined that second template example on all those events and the player. I also changed the opacity to 0 and the depth on some of the events.
I hope you like it
data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7


本贴来自国际rpgmaker官方论坛作者:Wecoc处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:https://forums.rpgmakerweb.com/threads/custom-bushes.138663/
页: [1]
查看完整版本: Custom Bushes