设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2256|回复: 6
打印 上一主题 下一主题

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

[复制链接]

Lv4.逐梦者

梦石
0
星屑
7495
在线时间
1152 小时
注册时间
2016-9-10
帖子
165

开拓者

跳转到指定楼层
1
发表于 2019-2-20 20:45:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

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

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

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

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

谢谢



RUBY 代码复制
  1. #==============================================================================
  2. # ■ 隐藏房间黑块 v2.0
  3. #  by:VIPArcher time:20150211
  4. #  -- 本脚本来自 [url]http://rm.66rpg.com[/url] 使用或转载请保留以上信息。
  5. #==============================================================================
  6. # 使用说明:
  7. #  · 指定遮罩块颜色可在设置的第一行注释上<color=Color.new(R,G,B)>
  8. #  · 在需要用黑块遮罩的地图上建一个事件,事件名为 "Black_Room"并且在该事件里注释上
  9. #  需要遮罩的矩形范围,一行注释设定一个遮罩块,注释示例参考如下:
  10. #  · 使用颜色RGB都为12的颜色填充区域ID为和1,2的区域踏入时隐藏该黑色遮罩块
  11. #     <color=Color.new(12,12,12) regid=[1,2]>
  12. #  · 使用颜色RGB都为12的颜色填充x坐标10,y坐标12,宽度4格,高度6格的的区域遮罩
  13. #     <color=Color.new(100,255,255) x=10 y=12 w=4 h=6>
  14. #  · 使用文件名都为 遮罩_A.png 的图片填充x坐标10,y坐标12,触发隐藏区域ID为3的遮罩
  15. #     <name=遮罩_A x=10 y=12 regid=[3]>
  16. #  · 使用脚本默认颜色填充触发隐藏区域ID为8的遮罩 <black regid=[8]>
  17. #   使用图片做为遮罩块必须设置踏入的矩形。文件放在"\Graphics\Parallaxes"文件夹下
  18. #==============================================================================
  19. $VIPArcherScript ||= {};$VIPArcherScript[:black_room] = 20170913
  20. #-------------------------------------------------------------------------------
  21. module VIPArcher end
  22. #==============================================================================
  23. # ★ 设定部分 ★
  24. #==============================================================================
  25. module VIPArcher::BlackRoom
  26.   Z = 200                              # 遮罩块的Z值
  27.   SW = 1                              # 该开关开启时遮罩块不可见
  28.   Edge = 16                           # 遮罩块边距留空的距离
  29.   Room_Color = Color.new(0,0,0)       # 默认遮罩块填充的颜色
  30.   Event_Name = 'Black_Room'           # 设置遮罩块的事件名
  31.   Opacity_Speed = 16                  # 透明度变化的速度
  32.   File_Path = "Graphics/Parallaxes/"  # 如果使用图片遮罩图片的路径
  33. end
  34. #==============================================================================
  35. # ☆ 设定结束 ☆
  36. #==============================================================================
  37. class Sprite_BlackRoom < Sprite
  38.   include VIPArcher::BlackRoom
  39.   def initialize(settings, viewport = nil)
  40.     super(viewport)
  41.     @settings, self.z, @player = settings, Z, $game_player
  42.     get_size_pos
  43.     create_bitmap
  44.   end
  45.   #--------------------------------------------------------------------------
  46.   # ● 设置遮罩图位置大小信息
  47.   #--------------------------------------------------------------------------
  48.   def get_size_pos
  49.     if @settings['rect']
  50.       r = @settings['rect'].scan(/\d+/).collect(&:to_i)
  51.       @rect = Rect.new(r[0], r[1], r[2], r[3])
  52.       self.x, self.y = @rect.x * 32, @rect.y * 32
  53.       @bitmap_width  = @rect.width  - @rect.x + 1
  54.       @bitmap_height = @rect.height - @rect.y + 1
  55.     elsif @settings['regid']
  56.       @res, @pos = @settings['regid'].scan(/\d+/).collect(&:to_i), []
  57.       $game_map.data.xsize.times do |x|
  58.         $game_map.data.ysize.times do |y|
  59.           @pos.push [x,y] if @res.include?($game_map.data[x, y, 3] >> 8)
  60.         end
  61.       end
  62.       return p "似乎备注了未设置区域ID的遮罩块" if @pos.size.zero?
  63.       @pos.each do |p|
  64.         @min_x = p[0] if !@min_x || @min_x > p[0]
  65.         @min_y = p[1] if !@min_y || @min_y > p[1]
  66.         @max_x = p[0] if !@max_x || @max_x < p[0]
  67.         @max_y = p[1] if !@max_y || @max_y < p[1]
  68.       end
  69.       @bitmap_width  = (@max_x - @min_x + 1) * 32 + Edge * 2
  70.       @bitmap_height = (@max_y - @min_y + 1) * 32 + Edge * 2
  71.       self.x, self.y = (@min_x * 32 - Edge), (@min_y * 32 - Edge)
  72.     end
  73.     self.x = @settings['x'].to_i * 32 if @settings['x']
  74.     self.y = @settings['y'].to_i * 32 if @settings['y']
  75.     @bitmap_width = @settings['w'].to_i * 32 if @settings['w']
  76.     @bitmap_height = @settings['h'].to_i * 32 if @settings['h']
  77.     if @settings['x'] && @settings['h']
  78.       @rect = Rect.new(
  79.         @settings['x'].to_i,  @settings['y'].to_i,
  80.         @settings['x'].to_i + @settings['w'].to_i - 1,
  81.         @settings['y'].to_i + @settings['h'].to_i - 1
  82.       )
  83.     end
  84.   end
  85.   #--------------------------------------------------------------------------
  86.   # ● 创建遮罩图像
  87.   #--------------------------------------------------------------------------
  88.   def create_bitmap
  89.     if @settings['name']
  90.       self.bitmap = Cache.load_bitmap(File_Path, @settings['name'])
  91.     else
  92.       self.bitmap = Bitmap.new(@bitmap_width, @bitmap_height)
  93.       color = @settings['color'] ? eval(@settings['color']) : Room_Color
  94.       if @pos && !@pos.size.zero?
  95.         @pos.each do |pos|
  96.           bitmap.fill_rect(
  97.             (pos[0] - @min_x) * 32,
  98.             (pos[1] - @min_y) * 32,
  99.             32 + Edge * 2, 32 + Edge * 2, color
  100.           )
  101.         end
  102.       else
  103.         self.bitmap.fill_rect(Edge, Edge, @bitmap_width - Edge * 2,
  104.           @bitmap_height - Edge * 2, color)
  105.       end
  106.     end
  107.   end
  108.   #--------------------------------------------------------------------------
  109.   # ● 释放
  110.   #--------------------------------------------------------------------------
  111.   def dispose
  112.     super
  113.     self.bitmap.dispose
  114.   end
  115.   #--------------------------------------------------------------------------
  116.   # ● 位置判定
  117.   #--------------------------------------------------------------------------
  118.   def character_pos?
  119.     if @rect
  120.       @player.x > @rect.width  || @player.x <  @rect.x ||
  121.       @player.y > @rect.height || @player.y <  @rect.y
  122.     elsif @res
  123.       !@res.include?($game_map.region_id(@player.x, @player.y + 1)) &&
  124.       !@res.include?($game_map.region_id(@player.x - 1, @player.y)) &&
  125.       !@res.include?($game_map.region_id(@player.x + 1, @player.y)) &&
  126.       !@res.include?($game_map.region_id(@player.x, @player.y - 1)) &&
  127.       !@res.include?($game_map.region_id(@player.x,     @player.y))
  128.     end
  129.   end
  130.   #--------------------------------------------------------------------------
  131.   # ● 更新透明度
  132.   #--------------------------------------------------------------------------
  133.   def update_opacity
  134.     self.opacity += character_pos? ? Opacity_Speed : - Opacity_Speed
  135.     self.opacity = 0 if $game_switches[SW]
  136.   end
  137.   #--------------------------------------------------------------------------
  138.   # ● 更新位置
  139.   #--------------------------------------------------------------------------
  140.   def update_position
  141.     self.ox = $game_map.display_x * 32
  142.     self.oy = $game_map.display_y * 32
  143.   end
  144.   #--------------------------------------------------------------------------
  145.   # ● 更新画面
  146.   #--------------------------------------------------------------------------
  147.   def update
  148.     super
  149.     update_opacity
  150.     update_position
  151.   end
  152. end
  153. #-------------------------------------------------------------------------------
  154. class Spriteset_Map
  155.   include VIPArcher::BlackRoom
  156.   #--------------------------------------------------------------------------
  157.   # ● 生成黑色遮罩块
  158.   #--------------------------------------------------------------------------
  159.   alias black_room_create_characters create_characters
  160.   def create_characters
  161.     black_room_create_characters
  162.     room_sprite_dispose if @black_room_sprites
  163.     @black_room_sprites = []
  164.     $game_map.events.values.each do |event|
  165.       if event.instance_variable_get(:@event).name =~ /#{Event_Name}/i
  166.         event.list.each do |command|
  167.           get_black_room_setup(command) if [108, 408].include?(command.code)
  168.         end if event.list
  169.       end
  170.     end
  171.   end
  172.   #--------------------------------------------------------------------------
  173.   # ● 获取遮罩块设置
  174.   #--------------------------------------------------------------------------
  175.   def get_black_room_setup(command)
  176.     command.parameters.each do |line|
  177.       settings = {}
  178.       if line =~ /<name *= *(.*?) +(.*?)>/i
  179.         settings['name'] = $1
  180.       elsif line =~ /<color *= *(.*?) +(.*?)>/i
  181.         settings['color'] = $1
  182.       else
  183.         line =~ /<black( +)(.*?)>/i
  184.       end
  185.       get_settings(settings, $2)
  186.     end
  187.   end
  188.   #--------------------------------------------------------------------------
  189.   # ● 解析备注生成遮罩块
  190.   #--------------------------------------------------------------------------
  191.   def get_settings(settings, opt)
  192.     opt.scan(/(\w+) *= *([\d\[,\]]*)/) do |key, value|
  193.       (settings[key] ||= '') << value
  194.     end
  195.     sprite = Sprite_BlackRoom.new(settings, @viewport1)
  196.     sprite.opacity = 0 unless sprite.character_pos?
  197.     @black_room_sprites.push(sprite)
  198.   end
  199.   #--------------------------------------------------------------------------
  200.   # ● 释放遮罩块
  201.   #--------------------------------------------------------------------------
  202.   alias black_room_dispose dispose
  203.   def dispose
  204.     black_room_dispose
  205.     @black_room_sprites.each {|sprite| sprite.dispose }
  206.   end
  207.   #--------------------------------------------------------------------------
  208.   # ● 更新遮罩块
  209.   #--------------------------------------------------------------------------
  210.   alias black_room_update update
  211.   def update
  212.     black_room_update
  213.     @black_room_sprites.each {|sprite| sprite.update }
  214.   end
  215. end

Lv4.逐梦者

梦石
0
星屑
19284
在线时间
3074 小时
注册时间
2013-1-11
帖子
1288
2
发表于 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

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7495
在线时间
1152 小时
注册时间
2016-9-10
帖子
165

开拓者

3
 楼主| 发表于 2019-2-21 12:48:46 | 只看该作者
@张咚咚
首先感谢
不过报错了


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

点评

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

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7495
在线时间
1152 小时
注册时间
2016-9-10
帖子
165

开拓者

4
 楼主| 发表于 2019-2-21 22:44:01 | 只看该作者
本帖最后由 devil033 于 2019-2-21 22:45 编辑

@张咚咚
还是报错


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

点评

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

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-25 17:51

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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