查看: 2753|回复: 6

[已经解决] 怎么在事件脚本中刷新Sprite

[复制链接]
梦石
0
星屑
7650
在线时间
1162 小时
注册时间
2016-9-10
回帖
145

开拓者

发表于 2019-2-20 20:45:26 | 显示全部楼层 |阅读模式

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

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

×
使用了VIPArcher大大的隐藏房间黑块脚本,在事件页的首行注释后可以建立隐藏黑块

但我并非是在事件的首页注释的,而是在事件的第二页注释的

当进入地图时,事件首页没有注释,所以不会建立黑块
当我触发事件开关到第二页时,黑块不会自动生成,需要离开地图再回来才能显示黑块

所以想请教一下,怎么在触发事件后, 刷新一下,可以马上显示或隐藏黑块

谢谢



[pre lang="ruby"]
#==============================================================================
# ■ 隐藏房间黑块 v2.0
#  by:VIPArcher time:20150211
#  -- 本脚本来自 http://rm.66rpg.com 使用或转载请保留以上信息。
#==============================================================================
# 使用说明:
#  · 指定遮罩块颜色可在设置的第一行注释上<color=Color.new(R,G,B)>
#  · 在需要用黑块遮罩的地图上建一个事件,事件名为 "Black_Room"并且在该事件里注释上
#  需要遮罩的矩形范围,一行注释设定一个遮罩块,注释示例参考如下:
#  · 使用颜色RGB都为12的颜色填充区域ID为和1,2的区域踏入时隐藏该黑色遮罩块
#     <color=Color.new(12,12,12) regid=[1,2]>
#  · 使用颜色RGB都为12的颜色填充x坐标10,y坐标12,宽度4格,高度6格的的区域遮罩
#     <color=Color.new(100,255,255) x=10 y=12 w=4 h=6>
#  · 使用文件名都为 遮罩_A.png 的图片填充x坐标10,y坐标12,触发隐藏区域ID为3的遮罩
#     <name=遮罩_A x=10 y=12 regid=[3]>
#  · 使用脚本默认颜色填充触发隐藏区域ID为8的遮罩 <black regid=[8]>
#   使用图片做为遮罩块必须设置踏入的矩形。文件放在"\Graphics\Parallaxes"文件夹下
#==============================================================================
$VIPArcherScript ||= {};$VIPArcherScript[:black_room] = 20170913
#-------------------------------------------------------------------------------
module VIPArcher end
#==============================================================================
# ★ 设定部分 ★
#==============================================================================
module VIPArcher::BlackRoom
  Z = 200                              # 遮罩块的Z值
  SW = 1                              # 该开关开启时遮罩块不可见
  Edge = 16                           # 遮罩块边距留空的距离
  Room_Color = Color.new(0,0,0)       # 默认遮罩块填充的颜色
  Event_Name = 'Black_Room'           # 设置遮罩块的事件名
  Opacity_Speed = 16                  # 透明度变化的速度
  File_Path = "Graphics/Parallaxes/"  # 如果使用图片遮罩图片的路径
end
#==============================================================================
# ☆ 设定结束 ☆
#==============================================================================
class Sprite_BlackRoom < Sprite
  include VIPArcher::BlackRoom
  def initialize(settings, viewport = nil)
    super(viewport)
    @settings, self.z, @player = settings, Z, $game_player
    get_size_pos
    create_bitmap
  end
  #--------------------------------------------------------------------------
  # ● 设置遮罩图位置大小信息
  #--------------------------------------------------------------------------
  def get_size_pos
    if @settings['rect']
      r = @settings['rect'].scan(/\d+/).collect(&:to_i)
      @rect = Rect.new(r[0], r[1], r[2], r[3])
      self.x, self.y = @rect.x * 32, @rect.y * 32
      @bitmap_width  = @rect.width  - @rect.x + 1
      @bitmap_height = @rect.height - @rect.y + 1
    elsif @settings['regid']
      @res, @pos = @settings['regid'].scan(/\d+/).collect(&:to_i), []
      $game_map.data.xsize.times do |x|
        $game_map.data.ysize.times do |y|
          @pos.push [x,y] if @res.include?($game_map.data[x, y, 3] >> 8)
        end
      end
      return p "似乎备注了未设置区域ID的遮罩块" if @pos.size.zero?
      @pos.each do |p|
        @min_x = p[0] if !@min_x || @min_x > p[0]
        @min_y = p[1] if !@min_y || @min_y > p[1]
        @max_x = p[0] if !@max_x || @max_x < p[0]
        @max_y = p[1] if !@max_y || @max_y < p[1]
      end
      @bitmap_width  = (@max_x - @min_x + 1) * 32 + Edge * 2
      @bitmap_height = (@max_y - @min_y + 1) * 32 + Edge * 2
      self.x, self.y = (@min_x * 32 - Edge), (@min_y * 32 - Edge)
    end
    self.x = @settings['x'].to_i * 32 if @settings['x']
    self.y = @settings['y'].to_i * 32 if @settings['y']
    @bitmap_width = @settings['w'].to_i * 32 if @settings['w']
    @bitmap_height = @settings['h'].to_i * 32 if @settings['h']
    if @settings['x'] && @settings['h']
      @rect = Rect.new(
        @settings['x'].to_i,  @settings['y'].to_i,
        @settings['x'].to_i + @settings['w'].to_i - 1,
        @settings['y'].to_i + @settings['h'].to_i - 1
      )
    end
  end
  #--------------------------------------------------------------------------
  # ● 创建遮罩图像
  #--------------------------------------------------------------------------
  def create_bitmap
    if @settings['name']
      self.bitmap = Cache.load_bitmap(File_Path, @settings['name'])
    else
      self.bitmap = Bitmap.new(@bitmap_width, @bitmap_height)
      color = @settings['color'] ? eval(@settings['color']) : Room_Color
      if @pos && !@pos.size.zero?
        @pos.each do |pos|
          bitmap.fill_rect(
            (pos[0] - @min_x) * 32,
            (pos[1] - @min_y) * 32,
            32 + Edge * 2, 32 + Edge * 2, color
          )
        end
      else
        self.bitmap.fill_rect(Edge, Edge, @bitmap_width - Edge * 2,
          @bitmap_height - Edge * 2, color)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 释放
  #--------------------------------------------------------------------------
  def dispose
    super
    self.bitmap.dispose
  end
  #--------------------------------------------------------------------------
  # ● 位置判定
  #--------------------------------------------------------------------------
  def character_pos?
    if @rect
      @player.x > @rect.width  || @player.x <  @rect.x ||
      @player.y > @rect.height || @player.y <  @rect.y
    elsif @res
      !@res.include?($game_map.region_id(@player.x, @player.y + 1)) &&
      !@res.include?($game_map.region_id(@player.x - 1, @player.y)) &&
      !@res.include?($game_map.region_id(@player.x + 1, @player.y)) &&
      !@res.include?($game_map.region_id(@player.x, @player.y - 1)) &&
      !@res.include?($game_map.region_id(@player.x,     @player.y))
    end
  end
  #--------------------------------------------------------------------------
  # ● 更新透明度
  #--------------------------------------------------------------------------
  def update_opacity
    self.opacity += character_pos? ? Opacity_Speed : - Opacity_Speed
    self.opacity = 0 if $game_switches[SW]
  end
  #--------------------------------------------------------------------------
  # ● 更新位置
  #--------------------------------------------------------------------------
  def update_position
    self.ox = $game_map.display_x * 32
    self.oy = $game_map.display_y * 32
  end
  #--------------------------------------------------------------------------
  # ● 更新画面
  #--------------------------------------------------------------------------
  def update
    super
    update_opacity
    update_position
  end
end
#-------------------------------------------------------------------------------
class Spriteset_Map
  include VIPArcher::BlackRoom
  #--------------------------------------------------------------------------
  # ● 生成黑色遮罩块
  #--------------------------------------------------------------------------
  alias black_room_create_characters create_characters
  def create_characters
    black_room_create_characters
    room_sprite_dispose if @black_room_sprites
    @black_room_sprites = []
    $game_map.events.values.each do |event|
      if event.instance_variable_get(:@event).name =~ /#{Event_Name}/i
        event.list.each do |command|
          get_black_room_setup(command) if [108, 408].include?(command.code)
        end if event.list
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 获取遮罩块设置
  #--------------------------------------------------------------------------
  def get_black_room_setup(command)
    command.parameters.each do |line|
      settings = {}
      if line =~ /<name *= *(.*?) +(.*?)>/i
        settings['name'] = $1
      elsif line =~ /<color *= *(.*?) +(.*?)>/i
        settings['color'] = $1
      else
        line =~ /<black( +)(.*?)>/i
      end
      get_settings(settings, $2)
    end
  end
  #--------------------------------------------------------------------------
  # ● 解析备注生成遮罩块
  #--------------------------------------------------------------------------
  def get_settings(settings, opt)
    opt.scan(/(\w+) *= *([\d\[,\]]*)/) do |key, value|
      (settings[key] ||= '') << value
    end
    sprite = Sprite_BlackRoom.new(settings, @viewport1)
    sprite.opacity = 0 unless sprite.character_pos?
    @black_room_sprites.push(sprite)
  end
  #--------------------------------------------------------------------------
  # ● 释放遮罩块
  #--------------------------------------------------------------------------
  alias black_room_dispose dispose
  def dispose
    black_room_dispose
    @black_room_sprites.each {|sprite| sprite.dispose }
  end
  #--------------------------------------------------------------------------
  # ● 更新遮罩块
  #--------------------------------------------------------------------------
  alias black_room_update update
  def update
    black_room_update
    @black_room_sprites.each {|sprite| sprite.update }
  end
end

[/pre]
梦石
0
星屑
19426
在线时间
3082 小时
注册时间
2013-1-11
回帖
1207
发表于 2019-2-20 22:01:39 | 显示全部楼层
本帖最后由 张咚咚 于 2019-2-22 00:10 编辑

只要在事件的refresh刷新方法执行一遍(释放黑块,创建黑块)就可以了。
这一段加进去试试

  1. class Game_Event < Game_Character
  2.   alias qqeat_game_event_refresh refresh unless $@
  3.   def refresh
  4.     qqeat_game_event_refresh
  5.     s = SceneManager.scene.instance_variable_get(:@spriteset)
  6.     s.refresh if s
  7.   end
  8. end
  9. class Spriteset_Map
  10.   def refresh
  11.       (@black_room_sprites || []).each(&:dispose).clear
  12.       $game_map.events.values.each do |event|
  13.         if event.instance_variable_get(:@event).name =~ /#{VIPArcher::BlackRoom::Event_Name}/i
  14.           event.list.each do |command|
  15.             get_black_room_setup(command) if [108, 408].include?(command.code)
  16.           end if event.list
  17.         end
  18.       end
  19.   end
  20. end
复制代码

点评

可以了,多谢了大大  发表于 2019-2-22 00:17

评分

参与人数 1星屑 +40 收起 理由
VIPArcher + 40 认可答案

查看全部评分

回复 1 0

使用道具 举报

梦石
0
星屑
7650
在线时间
1162 小时
注册时间
2016-9-10
回帖
145

开拓者

 楼主| 发表于 2019-2-21 12:48:46 | 显示全部楼层
@张咚咚
首先感谢
不过报错了
133.png

另外想请教下, $@ 这个是什么意思?

点评

我测试没问题啊。。改了下,再试试。$@是解决alias重复操作的一个问题,一般就是解决按下F12后会弹错的问题  发表于 2019-2-21 18:17
回复

使用道具 举报

梦石
0
星屑
7650
在线时间
1162 小时
注册时间
2016-9-10
回帖
145

开拓者

 楼主| 发表于 2019-2-21 22:44:01 | 显示全部楼层
本帖最后由 devil033 于 2019-2-21 22:45 编辑

@张咚咚
还是报错
113.png

原以为我工程的问题,重开了新工程还是一样

点评

大意了,修复了。。  发表于 2019-2-22 00:11
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部