查看: 5563|回复: 15

[已经解决] 那个大哥有办法将这个VA烛光移植到XP上啊?

[复制链接]
梦石
0
星屑
858
在线时间
929 小时
注册时间
2006-6-26
回帖
1377
发表于 2015-4-24 17:23:15 | 显示全部楼层 |阅读模式
悬赏6星屑已解决
本帖最后由 1243852 于 2015-4-24 21:24 编辑

XP上面,找到了两个烛光系统, 一个是挖黑。 一个叫新烛光。 。   
挖黑不好操控,且bug太多。    比如我想把黑夜和灯光开关分开。先黑夜,然后使用某物品后再灯光。。。这种效果很难实现。
bug ,读档有问题。。 菜单打开再关闭,烛光效果和黑夜效果都消失了。


新烛光,那个太坑了,基本上就是把一张半透明的白色圈圈图,覆盖在角色身上。。角色看起来模糊,却并没有光亮。  





之前打算用VA来做游戏,所以查到过VA的这个日站过来的烛光。


原帖地址:  http://rpg.blue/thread-224000-1-1.html
超好用


但是没找到XP版本的,希望有人能把这个烛光  移植到XP。。 或者找得到XP版本的,发给我,也行,,多谢。


这是原帖的范例工程:
VA烛光.zip (1.63 MB, 下载次数: 342)


这是代码


[pre lang="ruby"]
=begin
  HN_Light version 1.0.1.0 for VX Ace
        by 半生
http://www.tktkgame.com

  要HN_RG_BITMAP(ver 0.1.2.1以降)

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

=end

# ----- 在这里设定-----
module HN_Light
  # 简略化0:(精细)~2:(粗暴,负荷轻)
  SIMPLIFY = 1
  
  # 家的烛光类型使用的变量号码
  PLAYER_LIGHT_TYPE = 12

  # 队友的烛光类型使用的变量号码
  FOLLOWER_LIGHT_TYPE = 12
  
  # 黑暗判断上使用的开
  DARK_SWITCH = 11
  
  # 烛光事件识别用的正规表达式
  REGEX_LIGHT = /@LIGHT(\d+)/
  
  # 烛光图像的目录
  LIGHT_IMG_DIR = "Graphics/Pictures/"
  
  # 烛光Bitmap设定
  LIGHTS = [
  # [FILENAME, CELLS, ZOOM, OFFSET_Y, HUE]
    ["light5",     1,  1.5,        0,   0],
    ["light2",     1,  1.0,        0,   0],
    ["light3",     1,  0.8,        0,   0],
    ["light4",     1,  1.0,      -16,   0],
    ["light5",     1,  2.0,        0,   0],
    ["light6",     1,  1.0,        0,   0],
    ["light7",     1,  3.0,      -16,   0],
    ["light1",     1,  0.5,        0,   0],
    ["light6",     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 :setup_page unless method_defined?(:_hn_light__setup)
  def setup_page(new_page)
    _hn_light__setup(new_page)
    check_light()
  end
end

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

class Game_Follower
  def light_type
    return 0 if !self.visible?
    return $game_variables[HN_Light::FOLLOWER_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_events unless method_defined?(:_hn_light__setup_events)
  def setup_events
    _hn_light__setup_events()
    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)

  def initialize(viewport = nil)
    super(viewport)
    @width = Graphics.width
    @height = Graphics.height
   
    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 = 500
    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)
    $game_player.followers.each{|f| add_light(f)}
  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]

最佳答案

查看完整内容

好久不做移植了,不知道这次会不会出错。
我是不是可以签名了?
梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2015-4-24 17:23:16 | 显示全部楼层
好久不做移植了,不知道这次会不会出错。
Project7.rar (352.78 KB, 下载次数: 152)

点评

看5L回复  发表于 2015-4-25 11:41
你直接告诉我改那一行就是了  发表于 2015-4-25 10:38
不好意思,请教两个问题1、 我想让光线的范围大一些。。2、我不希望黑暗是纯黑暗,我希望肉眼还是能看清的。  发表于 2015-4-25 10:37
哈哈哈哈,真是谢谢了,,这就是我要的效果。不过到时候有没有bug我就不知道了,到时候再麻烦你吧。多谢了。  发表于 2015-4-25 10:15
回复

使用道具 举报

梦石
0
星屑
34457
在线时间
5096 小时
注册时间
2012-11-19
回帖
4715

开拓者

发表于 2015-4-24 21:07:32 | 显示全部楼层
要移植哪个脚本最好贴出来,大哥们都是伸手党。
像这样又要翻网页,又要下工程的,,,
本人对VA的脚本不熟,刚打好酱油。

点评

明白。 多谢提点。  发表于 2015-4-24 21:21
xp vx va mv  va mz 各类型脚本/插件定制
回复

使用道具 举报

梦石
0
星屑
1232
在线时间
1017 小时
注册时间
2011-4-30
回帖
1464
发表于 2015-4-25 06:43:44 来自手机 | 显示全部楼层
va和xp脚本差距很大吗?只要把特殊的方法修改一下应该就可以了吧。脚本嘛,最基础的还是相似的。
回复

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2015-4-25 11:41:02 | 显示全部楼层
第一个问题,范例中脚本34~45里面是关于脚本烛光设置的,其中ZOOM那一行表示放大率,找到相应的把放大率设置的大一点即可(范例里面使用light5,也就是第一行,放大率为2.5,如果嫌范围不够就把它改大一些)
第二个问题,脚本182行,@@base_color = Color.new(255, 255, 255)那里,改成下面这样:
[pre lang="Ruby"]@@base_color = Color.new(255, 255, 255, 128)[/pre]
最后一个128表示通明度,数值越小可见度越高。

点评

好的,多谢  发表于 2015-4-25 12:18
回复

使用道具 举报

梦石
0
星屑
858
在线时间
929 小时
注册时间
2006-6-26
回帖
1377
 楼主| 发表于 2015-4-25 20:45:03 | 显示全部楼层
RyanBern 发表于 2015-4-25 11:41
第一个问题,范例中脚本34~45里面是关于脚本烛光设置的,其中ZOOM那一行表示放大率,找到相应的把放大率设 ...

哥,出问题了。。。
QQ图片20150425203907.jpg


你看。。试了很多张地图都是这样,,地图下面的一些地方,就变成亮的了。。看起来像是花屏。

点评

应该是,我改成800后,就没有出现了。  发表于 2015-4-25 21:10
初步判断是z坐标的问题,试着把208行self.z = 500(如果找不到就搜索下)换成更大的数  发表于 2015-4-25 21:02
我是不是可以签名了?
回复

使用道具 举报

梦石
0
星屑
228
在线时间
87 小时
注册时间
2023-5-23
回帖
10
发表于 2023-8-22 11:38:12 | 显示全部楼层
谢谢大佬

点评

这挖坟挖的,我以为什么新功能练练手……  发表于 2023-8-22 14:11
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部