Project1

标题: “防止事件过多卡机”脚本求助 [打印本页]

作者: 陆亚    时间: 2007-7-9 01:54
提示: 作者被禁止或删除 内容自动屏蔽
作者: 陆亚    时间: 2007-7-9 01:54
提示: 作者被禁止或删除 内容自动屏蔽
作者: kaze    时间: 2007-7-9 01:55
  1. 防止事件过多卡机

  2. 作者
  3. Near Fantastica
  4.   版本与更新
  5. 2005年12月

  6. ver 3

  7. 相关网址
  8.   点此进入讨论贴
  9.   范例工程



  10. 脚本功能
  11. 防止事件卡机。介绍如下:

  12. This script uses my view range script to limit which events are being updated... therefore a large map with lots of events 300 + can still run at 40 fps... this is probably not a final version as I can think of a few more ways to limit event lag...

  13. “这个脚本用我的视野范围去限制刷新的事件,因此一个有300多个事件的大地图仍然可以运行在40的帧速率。这可能不是最后一个版本,我还在考虑更多的方法减少事件的拖慢”

  14. 使用方法
  15. main前插入脚本即可

  16. 注意!只有屏幕内的事件才会刷新。自动事件请注意放的位置

  17. 其它
  18. 没什么了



  19.   
  20. --------------------------------------------------------------------------------


  21.   
  22.    脚本内容

  23. #======================================
  24. # ■ Anti Event Lag Script
  25. #======================================
  26. #  By: Near Fantastica
  27. #   Date: 12.06.05
  28. #   Version: 3
  29. #======================================

  30. #======================================
  31. # ■ Game_Map
  32. #======================================

  33. class Game_Map
  34. #--------------------------------------------------------------------------
  35. def in_range?(object)
  36. screne_x = $game_map.display_x
  37. screne_x -= 256
  38. screne_y = $game_map.display_y
  39. screne_y -= 256
  40. screne_width = $game_map.display_x
  41. screne_width += 2816
  42. screne_height = $game_map.display_y
  43. screne_height += 2176
  44. return false if object.real_x <= screne_x
  45. return false if object.real_x >= screne_width
  46. return false if object.real_y <= screne_y
  47. return false if object.real_y >= screne_height
  48. return true
  49. end
  50. #--------------------------------------------------------------------------
  51. def update
  52. if $game_map.need_refresh
  53.    refresh
  54. end
  55. if @scroll_rest > 0
  56.    distance = 2 ** @scroll_speed
  57.    case @scroll_direction
  58.    when 2
  59.      scroll_down(distance)
  60.    when 4
  61.      scroll_left(distance)
  62.    when 6  
  63.      scroll_right(distance)
  64.    when 8  
  65.      scroll_up(distance)
  66.    end
  67.    @scroll_rest -= distance
  68. end
  69. for event in @events.values
  70.    if in_range?(event) or event.trigger == 3 or event.trigger == 4
  71.      event.update
  72.    end
  73. end
  74. for common_event in @common_events.values
  75.    common_event.update
  76. end
  77. @fog_ox -= @fog_sx / 8.0
  78. @fog_oy -= @fog_sy / 8.0
  79. if @fog_tone_duration >= 1
  80.    d = @fog_tone_duration
  81.    target = @fog_tone_target
  82.    @fog_tone.red = (@fog_tone.red * (d - 1) + target.red) / d
  83.    @fog_tone.green = (@fog_tone.green * (d - 1) + target.green) / d
  84.    @fog_tone.blue = (@fog_tone.blue * (d - 1) + target.blue) / d
  85.    @fog_tone.gray = (@fog_tone.gray * (d - 1) + target.gray) / d
  86.    @fog_tone_duration -= 1
  87. end
  88. if @fog_opacity_duration >= 1
  89.    d = @fog_opacity_duration
  90.    @fog_opacity = (@fog_opacity * (d - 1) + @fog_opacity_target) / d
  91.    @fog_opacity_duration -= 1
  92. end
  93. end
  94. end

  95. #======================================
  96. # ■ Spriteset_Map
  97. #======================================

  98. class Spriteset_Map
  99. #--------------------------------------------------------------------------
  100. def in_range?(object)
  101. screne_x = $game_map.display_x
  102. screne_x -= 256
  103. screne_y = $game_map.display_y
  104. screne_y -= 256
  105. screne_width = $game_map.display_x
  106. screne_width += 2816
  107. screne_height = $game_map.display_y
  108. screne_height += 2176
  109. return false if object.real_x <= screne_x
  110. return false if object.real_x >= screne_width
  111. return false if object.real_y <= screne_y
  112. return false if object.real_y >= screne_height
  113. return true
  114. end
  115. #--------------------------------------------------------------------------
  116. def update
  117. if @panorama_name != $game_map.panorama_name or
  118.     @panorama_hue != $game_map.panorama_hue
  119.    @panorama_name = $game_map.panorama_name
  120.    @panorama_hue = $game_map.panorama_hue
  121.    if @panorama.bitmap != nil
  122.      @panorama.bitmap.dispose
  123.      @panorama.bitmap = nil
  124.    end
  125.    if @panorama_name != ""
  126.      @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
  127.    end
  128.    Graphics.frame_reset
  129. end
  130. if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue
  131.    @fog_name = $game_map.fog_name
  132.    @fog_hue = $game_map.fog_hue
  133.    if @fog.bitmap != nil
  134.      @fog.bitmap.dispose
  135.      @fog.bitmap = nil
  136.    end
  137.    if @fog_name != ""
  138.      @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
  139.    end
  140.    Graphics.frame_reset
  141. end
  142. @tilemap.ox = $game_map.display_x / 4
  143. @tilemap.oy = $game_map.display_y / 4
  144. @tilemap.update
  145. @panorama.ox = $game_map.display_x / 8
  146. @panorama.oy = $game_map.display_y / 8
  147. @fog.zoom_x = $game_map.fog_zoom / 100.0
  148. @fog.zoom_y = $game_map.fog_zoom / 100.0
  149. @fog.opacity = $game_map.fog_opacity
  150. @fog.blend_type = $game_map.fog_blend_type
  151. @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
  152. @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
  153. @fog.tone = $game_map.fog_tone
  154. i=0
  155. for sprite in @character_sprites
  156.    if sprite.character.is_a?(Game_Event)
  157.      if in_range?(sprite.character) or sprite.character.trigger == 3 or sprite.character.trigger == 4
  158.        sprite.update
  159.        i+=1
  160.      end
  161.    else
  162.      sprite.update
  163.      i+=1
  164.    end
  165. end
  166. #p i
  167. @weather.type = $game_screen.weather_type
  168. @weather.max = $game_screen.weather_max
  169. @weather.ox = $game_map.display_x / 4
  170. @weather.oy = $game_map.display_y / 4
  171. @weather.update
  172. for sprite in @picture_sprites
  173.    sprite.update
  174. end
  175. @timer_sprite.update
  176. @viewport1.tone = $game_screen.tone
  177. @viewport1.ox = $game_screen.shake
  178. @viewport3.color = $game_screen.flash_color
  179. @viewport1.update
  180. @viewport3.update
  181. end
  182. end

复制代码


还有个叫两行解决公共事件造成的拖沓的脚本
kaze手头上没有
作者: 精灵使者    时间: 2007-7-9 03:24
以下引用陆亚于2007-7-8 17:54:21的发言:


本帖为提问贴,由论坛自动悬赏论坛经验100点 *^__^*
自动事件位置的问题该怎么解决?我要做一个很大的地图。
有没有什么方法能让某些事件不受此脚本的约束?

如果是那样的话,你移动到的地方自动事件不能放在超过屏幕显示的位置。否则就无法执行。
作者: 陆亚    时间: 2007-7-9 17:55
提示: 作者被禁止或删除 内容自动屏蔽
作者: 精灵使者    时间: 2007-7-9 19:02
注意!只有屏幕内的事件才会刷新。自动事件请注意放的位置
一个屏幕的大小大约是20*15的格子范围。要保证你的自动事件放到人物移动的地点的20*15格范围内,可以保证他触发。至于触发以后就自动执行,不用管它了。
作者: 陆亚    时间: 2007-7-9 20:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: 精灵使者    时间: 2007-7-9 20:39
这个我应用的很多了。例如并行开关打开以后判断条件分歧,条件分歧运行的时候即时关闭并行事件开关,分歧内的东西可以接着运行。 [LINE]1,#dddddd[/LINE]系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~
作者: 陆亚    时间: 2007-7-9 20:58
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1