查看: 2255|回复: 0

[已经过期] 烛光系统和阴影精灵脚本无法一起使用

[复制链接]
梦石
0
星屑
17561
在线时间
4249 小时
注册时间
2013-7-18
回帖
2491
发表于 2015-12-29 20:24:19 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 y967 于 2015-12-29 20:26 编辑

烛光系统

[pre lang="ruby" line="1"]=begin
  HN_Light version 1.0.1.0 for VX Ace
        by 半生


  要HN_RG_BITMAP(ver 0.1.2.1以降)

2012/01/08 ver 1.0.1.2
 队列歩行の仲间に対応

2015/04/25 Xp移植
  By RyanBern

=end

# ----- 在这里设定-----
module HN_Light
  # 简略化0:(精细)~2:(粗暴,负荷轻)
  SIMPLIFY = 1
  
  # 表示黑暗处的不透明度,数值为0-255,越大则不可见度越高
  DARK_OPACITY = 190
  
  # 玩家的烛光类型使用的变量号码
  PLAYER_LIGHT_TYPE = 13
  
  # 黑暗判断上使用的开关
  DARK_SWITCH = 73

  # 烛光事件识别用的正规表达式
  REGEX_LIGHT = /@LIGHT(\d+)/

  # 烛光图像的目录
  LIGHT_IMG_DIR = "Graphics/Pictures/"

  # 烛光Bitmap设定
  LIGHTS = [
  # [文件名  ,格栅数, 放大率,  Y偏移值, 色相]
    ["light6",     1,    5.0,        0,    0],
    ["light6",     1,    7.5,        0,    0],
    ["light6",     1,    10.0,        0,    0],
    ["light5",     1,    12.0,      -16,    0],
    ["light5",     1,    5.0,        0,    0],
    ["light5",     1,    15.0,        0,    0],
    ["light7",     1,    3.0,      -16,    0],
    ["light8",     1,    0.5,        0,    0],
    ["light9",     1,    2.0,        0,    0],
  ]
end
#  ----- 在这里设定 -----

module HN_Light
  # 事件mix-in用
  module LightEvent
    attr_reader :light_type
    def initialize
      super()
      @light_type = 0
    end

    def check_light
      @light_type = 0
      return if @list.nil?
      @list.each do |command|
        break if @light_type > 0
        if command.code == 108 or command.code == 408
          command.parameters.each do |line|
            if line =~ REGEX_LIGHT
              @light_type = $1.to_i
              break
            end
          end
        end
      end # END @list.each
    end

  end # END module LightEvent


  class Light
    attr_reader :bitmap
    attr_reader :cells
    attr_reader :width
    attr_reader :height
    attr_reader :ox
    attr_reader :oy
    def initialize(light_type, s_zoom = 1)
      light = LIGHTS[light_type - 1]
      if light.nil?
        # 本来不应该来这里
        @bitmap = Bitmap.new(32, 32)
        @cels = 1
        @zoom = 1.0
        @oy = 16
        @ox = 16
        @width  = 32
        @height = 32
      else
        @bitmap = Bitmap.new(LIGHT_IMG_DIR + light[0])
        @bitmap.invert()
        @cells = light[1].to_i
        @cells = 1 if (@cells < 1 or @cells > @bitmap.width)
        @zoom = light[2].to_f
        @zoom = 1.0 if @zoom <= 0.0
        @zoom /= s_zoom
        @width  = @bitmap.width / @cells
        @height = @bitmap.height

        # 缩放处理
        if @zoom != 1.0
          new_width  = (@width * @zoom).round
          new_height = (@height * @zoom).round
          if new_width * new_height < 1
            @zoom = 1.0
          else
            @width = new_width
            @height = new_height
            new_bitmap = Bitmap.new(@width * @cells, @height)
            new_bitmap.stretch_blt(new_bitmap.rect,@bitmap, @bitmap.rect)
            @bitmap.dispose
            @bitmap = new_bitmap
          end
        end
        @ox = @width / 2
        @oy = @height / 2 - light[3].to_i / s_zoom

        # 色相変换
        if ( (hue = light[4].to_i) != 0)
          @bitmap.hue_change(hue)
        end
      end
    end # End def initialize

    # 色调转换
    def dispose
      @bitmap.dispose
      @bitmap = nil
    end
  end

end

class Game_Event
  include HN_Light::LightEvent
  alias :_hn_light__setup :refresh unless method_defined?(:_hn_light__setup)
  def refresh
    _hn_light__setup
    check_light()
  end
end

class Game_Player
  def light_type
    return $game_variables[HN_Light::PLAYER_LIGHT_TYPE]
  end
end

class Game_Map
  attr_reader :light_events

  # 更新烛光事件列表
  def refresh_lights
    @light_events = []
    @events.values.each do |event|
      if (event.light_type > 0)
        @light_events.push(event)
      end
    end
  end

  alias :_hn_light__setup_events :setup unless method_defined?(:_hn_light__setup_events)
  def setup(map_id)
    _hn_light__setup_events(map_id)
    refresh_lights()
  end

  alias :_hn_light__refresh :refresh unless method_defined?(:_hn_light__refresh)
  def refresh
    _hn_light__refresh()
    refresh_lights()
  end
end

class Sprite_Dark < Sprite
  @@base_color = Color.new(255,255,255,HN_Light::DARK_OPACITY)

  def initialize(viewport = nil)
    super(viewport)
    @width = 640
    @height = 480

    case HN_Light::SIMPLIFY
    when 1
      @zoom = 2
    when 2
      @zoom = 4
    else
      @zoom = 1
    end
    @width /= @zoom
    @height /= @zoom
    self.zoom_x = @zoom.to_f
    self.zoom_y = @zoom.to_f

    self.bitmap = Bitmap.new(@width, @height)
    self.bitmap.fill_rect(self.bitmap.rect, @@base_color)
    self.blend_type = 2 # 混合型(减算)
    self.z = 800
    self.visible = false
    @light_cache = {}
  end

  # 追加烛光
  def add_light(charactor)
    return if charactor.nil?
    light_type = charactor.light_type
    return if (light_type < 1 or light_type > HN_Light::LIGHTS.size)
    unless @light_cache.key?(light_type)
      @light_cache[light_type] = HN_Light::Light.new(light_type, @zoom)
    end
    light = @light_cache[light_type]

    # 画面外什麽都不做
    if @zoom == 1
      return if (charactor.screen_x < 0  - light.width + light.ox)
      return if (charactor.screen_x > @width + light.ox)
      return if (charactor.screen_y < 0 - light.height + light.oy)
      return if (charactor.screen_y > @height + light.oy)
    else
      return if (charactor.screen_x < 0  - (light.width + light.ox) * @zoom)
      return if (charactor.screen_x > (@width + light.ox)  * @zoom)
      return if (charactor.screen_y < 0 - (light.height + light.oy) * @zoom)
      return if (charactor.screen_y > (@height + light.oy) * @zoom)
    end

    # 动画判定
    if light.cells > 1
      index = (Graphics.frame_count / 4) % light.cells
      rect = Rect.new(index * light.width , 0, light.width, light.height)
    else
      rect = light.bitmap.rect
    end
    if @zoom != 1
      p_x = charactor.screen_x / @zoom - light.ox
      p_y = (charactor.screen_y - 16) / @zoom - light.oy
    else
      p_x = charactor.screen_x - light.ox
      p_y = charactor.screen_y - 16 - light.oy
    end

    # 乗算合成(3)
    self.bitmap.blend_blt(p_x, p_y, light.bitmap, rect, 3)
  end


  def refresh
    self.bitmap.fill_rect(self.bitmap.rect, @@base_color)
    $game_map.light_events.each do |event|
      next if HN_Light::LIGHTS[event.light_type - 1].nil?
      add_light(event)
    end
    add_light($game_player)
  end

  # 更新
  def update
    super
    refresh()
  end

  #--------------------------------------------------------------------------
  # ● 解放
  #--------------------------------------------------------------------------
  def dispose
    self.bitmap.dispose
    @light_cache.values.each do |light|
      light.dispose
    end
    super
  end
end


class Spriteset_Map  
  # 动画判定
  def create_dark
    @dark_sprite = Sprite_Dark.new(@viewport1)
  end

  # 更新黑暗Sprite
  def update_dark
    if (@dark_sprite.visible = $game_switches[HN_Light::DARK_SWITCH])
      @dark_sprite.update
    end
  end

  # 破弃黑暗Sprite
  def dispose_dark
    @dark_sprite.dispose
  end

  # 初期化
  alias :_dark__initialize :initialize unless private_method_defined?(:_dark__initialize)
  def initialize
    _dark__initialize()
    create_dark()
    update_dark()
  end

  # 更新
  alias :_dark__update :update unless method_defined?(:_dark__update)
  def update
    _dark__update()
    update_dark() if !@dark_sprite.nil? and !@dark_sprite.disposed?
  end

  # 结束处理
  alias :_dark__dispose :dispose unless method_defined?(:_dark__dispose)
  def dispose
    dispose_dark()
    _dark__dispose()
  end
end[/pre]


阴影精灵

[pre lang="ruby" line="1"]#使用方法:不透明的物体在光源旁边会产生一个阴影。

#所以,在光源的事件里面(例如火),请在第一页加上一个注释“s”(请不要带引号)

#然后将此脚本命名为“人物阴影”插入到main上方即可。


#==============================================================================

# ■ 阴影精灵 (渐变精灵 )

# 以 Genzai Kawakami的阴影脚本为基础,
#  Rataime为其重写和更新,
#  Boushy 为其添加附属功能

#  精灵使者汉化

#==============================================================================


CATERPILLAR_COMPATIBLE = true


class Game_Party

attr_reader :characters

end


class Sprite_Shadow < RPG::Sprite


attr_accessor :character


def initialize(viewport, character = nil,source = nil,anglemin=0,anglemax=0,distancemax=0)

   super(viewport)

   @anglemin=anglemin.to_f

   @anglemax=anglemax.to_f

   @distancemax=distancemax.to_f

   @character = character

   @source = source

   update

end


def update

   super


   if (@tile_id != @character.tile_id or

      @character_name != @character.character_name or

      @character_hue != @character.character_hue)# and ( @character.screen_x >= 0 and  @character.screen_x <=640 and  @character.screen_y>=0 and  @character.screen_y <= 480)

     @tile_id = @character.tile_id

     @character_name = @character.character_name

     @character_hue = @character.character_hue
     if   @character_name.include?("AC") and  not   @character_name.include?("=4")
            if @character.direction == 4
      self.mirror = false
    else
       self.mirror = true
     end
     else
            if @character.direction == 4
      self.mirror = true
    else
       self.mirror = false
     end
     end
     if @tile_id >= 384

       self.bitmap = RPG::Cache.tile($game_map.tileset_name,

         @tile_id, @character.character_hue)

       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)

       @cw = bitmap.width / 4

       @cw = bitmap.width / 4
    if not   @character_name.include?("=4")
       @ch = bitmap.height / 4
     else
       @ch = bitmap.height / 4
       end


       self.ox = @cw / 2

       self.oy = @ch

     end

   end

   self.visible = (not @character.transparent)

    if @tile_id == 0
      # 设置传送目标的矩形
    if not   @character_name.include?("=4")
      if @character.pattern >= 4
      sx = (@character.pattern - 4) * @cw
        else
      sx = @character.pattern * @cw
    end
      if @character.pattern >= 4
        sy = (4 - 2) / 2 * @ch  
       else
      sy = (2 - 2) / 2 * @ch
      end
      self.src_rect.set(sx, sy, @cw, @ch)
    else
            sx = @character.pattern * @cw
      sy = (@character.direction - 2) / 2 * @ch
      self.src_rect.set(sx, sy, @cw, @ch)
      end
    end

   self.x = @character.screen_x

   self.y = @character.screen_y-5

   self.z = @character.screen_z(@ch)-1

   self.opacity = @character.opacity

   self.blend_type = @character.blend_type

   self.bush_depth = @character.bush_depth

   #if @character.animation_id != 0

     #animation = $data_animations[@character.animation_id]

    # animation(animation, true)

    # @character.animation_id = 0

   #end

   @deltax=@source.x-self.x

   @deltay= @source.y-self.y

   self.angle = 57.3*Math.atan2(@deltax, @deltay )

   @angle_trigo=self.angle+90

   if @angle_trigo<0

     @angle_trigo=360+@angle_trigo

   end

   self.color = Color.new(0, 0, 0)

   @distance = ((@deltax ** 2) + (@deltay ** 2))

   if$game_map.shadows==-1

     self.opacity = 0
   else

     self.opacity = 1200000/(@distance+6000)   
   end

   if @character.screen_x >= 640 or @character.screen_x <= 0 or @character.screen_y >= 480 or @character.screen_y <= 0
   self.opacity = 0
     end   

   @distance = @distance ** 0.5

   if @distancemax !=0 and @distance>=@distancemax

     self.opacity=0

   end

   if @anglemin !=0 or @anglemax !=0

      if (@angle_trigo<@anglemin or @angle_trigo>@anglemax) and @anglemin<@anglemax

        self.opacity=0

      end

      if (@angle_trigo<@anglemin and @angle_trigo>@anglemax) and @anglemin>@anglemax

        self.opacity=0

      end     

   end

end

end


#===================================================

# ■ 重定义 Sprite_Character

#===================================================


class Sprite_Character < RPG::Sprite

alias shadow_initialize initialize


def initialize(viewport, character = nil)

   @character = character
  # @character = nil
   super(viewport)

   @ombrelist=[]

   if (character.is_a?(Game_Event) and character.list!=nil and character.list[0].code == 108 and character.list[0].parameters == ["s"])

     if (character.list[1]!=nil and character.list[1].code == 108)

       @anglemin=character.list[1].parameters[0]

     end

     if (character.list[2]!=nil and character.list[2].code == 108)

       @anglemax=character.list[2].parameters[0]

     end

     if (character.list[3]!=nil and character.list[3].code == 108)

       @distancemax=character.list[3].parameters[0]

     end  

    for i in $game_map.events.keys.sort

     if ($game_map.events.is_a?(Game_Event) and not ($game_map.events.list[0].code == 108 && ($game_map.events.list[0].parameters == ["NotShadow"]) or $game_map.events.list[0].parameters == ["s"]) ) #$game_map.events.list!=nil and $game_map.events.list[0].code == 108 and $game_map.events.list[0].parameters == ["o"])

       @ombrelist[i+1] = Sprite_Shadow.new(viewport, $game_map.events,self,@anglemin,@anglemax,@distancemax)

     end

    end

    @ombrelist[1] = Sprite_Shadow.new(viewport, $game_player,self,@anglemin,@anglemax,@distancemax)

#===================================================

# ● 原装人物跟随兼容脚本

#===================================================

if CATERPILLAR_COMPATIBLE and $game_party.characters!=nil


for member in $game_party.characters

   @ombrelist.push(Sprite_Shadow.new(viewport, member,self,@anglemin,@anglemax,@distancemax))

end


end

#===================================================

# ● 兼容脚本结束

#===================================================

   end

   shadow_initialize(viewport, @character)

end


alias shadow_update update


def update
   shadow_update
   if @ombrelist!=[]

     for i in 1..@ombrelist.size
  # if @character.x >= 7 # character.x = @x -1
       if @ombrelist!=nil

         @ombrelist.update

       end
  # end
     end

   end

end  


end


#===================================================

# ■ 新定义类Scene_Save

#===================================================

class Scene_Save < Scene_File


alias shadows_write_save_data write_save_data


def write_save_data(file)

   $game_map.shadows = nil

   shadows_write_save_data(file)

end

end


#===================================================

# ■ 新定义类 Game_Map

#===================================================

class Game_Map

attr_accessor :shadows

end
[/pre]


问题:两个脚本都是用注释作为识别的,无法同时起作用,如何解决,要是可以,那就完美了

单独显示烛光和影子是可以的,但不能在烛光周围显示影子....




  
退隐....
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部