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

Project1

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

[已经过期] 如何解决抢线程脚本与双远景图商业素材冲突?

 关闭 [复制链接]

Lv1.梦旅人

孙悟空

梦石
0
星屑
55
在线时间
15 小时
注册时间
2007-8-22
帖子
448
跳转到指定楼层
1
发表于 2011-4-3 18:37:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如何解决抢线程脚本与双远景图商业素材冲突?
  1. #===============================================================================
  2. # ** CPU speed Script
  3. #
  4. # by Goldencolor V1.0
  5. # 2009.10.19
  6. #前言:今天刚学了Java线程。然后就有个想法。RGSS如果加入线程速度可能会更快。事件也加速#的
  7. #用这个脚本可以提速。如果在用提帧数差不多可以到。邪恶 -_-!可以到150帧左右
  8. #找啊找啊找= =b找到了。由于最近比较忙~没有时间发。
  9. #注意:不要乱该。。这个关系RPGXP抢CPU的速度(线程)
  10. #===============================================================================
  11. # Class Antilag Settings
  12. #-------------------------------------------------------------------------------
  13. # 设置CPU线程
  14. #===============================================================================
  15. class Antilag_Settings
  16.   
  17.   attr_accessor :event
  18.   attr_accessor :max_cpu_utilization
  19.   attr_accessor :cpu_tolerance
  20.   #-----------------------------------------------------------------------------
  21.   # 初始化对象
  22.   #-----------------------------------------------------------------------------
  23.   def initialize
  24.     @event = true
  25.     @high_priority = true
  26.     @max_cpu_utilization = 70
  27.     #这个是控制优先级。
  28.     @cpu_tolerance = 20
  29.     @SetPriorityClass = Win32API.new('kernel32', 'SetPriorityClass',
  30.                                      ['p', 'i'], 'i')
  31.     @GetProcessTimes = Win32API.new('kernel32', 'GetProcessTimes',
  32.                                     ['i','p','p','p','p'], 'i')
  33.   end
  34.   #-----------------------------------------------------------------------------
  35.   # 更改优先级 on(true)/off(false)
  36.   #-----------------------------------------------------------------------------
  37.   def high_priority=(value)
  38.     @high_priority = value

  39.     if @high_priority
  40.       @SetPriorityClass.call(-1, 0x00000080) # 高质量
  41.       # 设置CPU优先级80为高。110为实时。20为标准。
  42.     else
  43.       @SetPriorityClass.call(-1, 0x00000020) # 标准优先
  44.     end
  45.   end
  46.   #-----------------------------------------------------------------------------
  47.   # 返回现在的CPU使用率
  48.   #-----------------------------------------------------------------------------
  49.   def get_cpu_utilization
  50.     # 使用API获取内核用户调用时间
  51.     creation_time = '0' * 10
  52.     exit_time = '0' * 10
  53.     kernel_time = '0' * 10
  54.     user_time = '0' * 10
  55.     @GetProcessTimes.call(-1, creation_time, exit_time, kernel_time, user_time)
  56.     kernel_time = kernel_time.unpack('l2')
  57.     user_time = user_time.unpack('l2')
  58.     kernel_time = kernel_time[0] + kernel_time[1]
  59.     user_time = user_time[0] + user_time[1]
  60.     # 计算不同的CPU使用率
  61.     if @old_time != nil
  62.       timer_difference = Time.new - @old_timer
  63.       time_difference = kernel_time + user_time - @old_time
  64.       result = time_difference / timer_difference / 100000
  65.     else
  66.       result = $antilag.max_cpu_utilization
  67.     end
  68.     # 节约CPU使用(还是计算)
  69.     @old_timer = Time.new
  70.     @old_time = kernel_time + user_time
  71.     return result
  72.   end
  73. end
  74. $antilag = Antilag_Settings.new
  75. #==============================================================================
  76. # ■ Scene_Map
  77. #------------------------------------------------------------------------------
  78. #  处理地图画面的类。
  79. #==============================================================================
  80. class Scene_Map
  81.   #-----------------------------------------------------------------------------
  82.   # 刷新模块, 增加平滑帧数
  83.   #-----------------------------------------------------------------------------
  84.   alias f0tzis_anti_lag_scene_map_update update
  85.   def update
  86.     f0tzis_anti_lag_scene_map_update
  87.     if Graphics.frame_count % 20 == 0 and $antilag.max_cpu_utilization <= 100
  88.       # 计算CPU最大限度利用和当前的利用率
  89.       abs = $antilag.max_cpu_utilization - $antilag.get_cpu_utilization
  90.       # 如果改变帧速率的差异
  91.       if abs.abs >= $antilag.max_cpu_utilization * $antilag.cpu_tolerance/100.0
  92.         Graphics.frame_rate = [[10, Graphics.frame_rate + abs / 2].max, 40].min
  93.       end
  94.     end
  95.   end
  96. end
  97. #==============================================================================
  98. # Game_Event Class
  99. # 处理事件
  100. #===============================================================================
  101. class Game_Event
  102.   # 这里不需要理会
  103.   def in_range?
  104.         
  105.     # 如果TRUE 返回一个虚拟的事件
  106.     # 自动启动/并行处理事件或者一个空的事件
  107.     if not $antilag.event or (@trigger == 3 or @trigger == 4 or
  108.     (@list != nil and @list[0].code == 108 and @list[0].parameters == ['']))
  109.       return true
  110.     end
  111.          
  112.     screne_x = $game_map.display_x
  113.     screne_x -= 256
  114.     screne_y = $game_map.display_y
  115.     screne_y -= 256
  116.     screne_width = $game_map.display_x
  117.     screne_width += 2816
  118.     screne_height = $game_map.display_y
  119.     screne_height += 2176
  120.    
  121.     return false if @real_x <= screne_x
  122.     return false if @real_x >= screne_width
  123.     return false if @real_y <= screne_y
  124.     return false if @real_y >= screne_height
  125.     return true
  126.             
  127.   end
  128.   #-----------------------------------------------------------------------------
  129.   # ● 更新画面
  130.   #-----------------------------------------------------------------------------
  131.   alias f0tzis_anti_lag_game_event_update update
  132.   def update
  133.     return if not self.in_range?      
  134.     f0tzis_anti_lag_game_event_update
  135.   end
  136.   
  137. end
  138. #==============================================================================
  139. # ■ Sprite_Character
  140. #------------------------------------------------------------------------------
  141. #  角色显示用脚本。监视 Game_Character 类的实例、
  142. # 自动变化脚本状态。
  143. #==============================================================================
  144. class Sprite_Character < RPG::Sprite
  145.   #-----------------------------------------------------------------------------
  146.   # ● 更新画面
  147.   #-----------------------------------------------------------------------------
  148.   alias f0tzis_anti_lag_sprite_char_update update
  149.   def update
  150.     return if @character.is_a?(Game_Event) and not @character.in_range?
  151.     f0tzis_anti_lag_sprite_char_update
  152.   end
  153.   
  154. end

  155. #===============================================================================
  156. # ■ Game_Map
  157. #
  158. # 处理地图的类。包含卷动以及可以通行的判断功能。
  159. #===============================================================================
  160. class Game_Map
  161.   def update
  162.     # 还原必要的地图
  163.     if $game_map.need_refresh
  164.       refresh
  165.     end
  166.      # 滚动中的情况下
  167.     if @scroll_rest > 0
  168.       # 滚动速度变化为地图坐标系的距离
  169.       distance = 2 ** @scroll_speed
  170.       # 执行滚动
  171.       case @scroll_direction
  172.       when 2    # 下  
  173.         scroll_down(distance)
  174.       when 4    # 左  
  175.         scroll_left(distance)
  176.       when 6    # 右
  177.         scroll_right(distance)
  178.       when 8    # 上
  179.         scroll_up(distance)
  180.       end
  181.       # 滚动距离的减法运算
  182.       @scroll_rest -= distance
  183.     end
  184.     # 更新地图事件
  185.     for event in @events.values
  186.       if in_range?(event) or event.trigger == 3 or event.trigger == 4
  187.         event.update
  188.       end
  189.     end
  190.     # 更新公共事件
  191.     for common_event in @common_events.values
  192.       common_event.update
  193.     end
  194.     # 处理雾的滚动
  195.     @fog_ox -= @fog_sx / 8.0
  196.     @fog_oy -= @fog_sy / 8.0
  197.     # 处理雾的色调变更
  198.     if @fog_tone_duration >= 1
  199.       d = @fog_tone_duration
  200.       target = @fog_tone_target
  201.       @fog_tone.red = (@fog_tone.red * (d - 1) + target.red) / d
  202.       @fog_tone.green = (@fog_tone.green * (d - 1) + target.green) / d
  203.       @fog_tone.blue = (@fog_tone.blue * (d - 1) + target.blue) / d
  204.       @fog_tone.gray = (@fog_tone.gray * (d - 1) + target.gray) / d
  205.       @fog_tone_duration -= 1
  206.     end
  207.     # 处理雾的不透明度变更
  208.     if @fog_opacity_duration >= 1
  209.       d = @fog_opacity_duration
  210.       @fog_opacity = (@fog_opacity * (d - 1) + @fog_opacity_target) / d
  211.       @fog_opacity_duration -= 1
  212.     end
  213.   end
  214.   def in_range?(object)
  215.     diff_x = ($game_map.display_x - object.real_x).abs  # 绝对值
  216.     diff_y = ($game_map.display_x - object.real_x).abs  # 绝对值
  217.     width = 128 * 24   # size * tiles
  218.     height = 128 * 19  # size * tiles
  219.     return !((diff_x > width) or (diff_y > height))
  220.   end
  221. end
  222. #===============================================================================
  223. #  ■ Spriteset_Map
  224. #
  225. #  处理地图画面活动块和元件的类。
  226. #===============================================================================
  227. class Spriteset_Map
  228.   #--------------------------------------------------------------------------
  229.   # ● 刷新画面
  230.   #--------------------------------------------------------------------------
  231.   def update
  232.     # 远景与现在的情况有差异发情况下
  233.     if @panorama_name != $game_map.panorama_name or
  234.       @panorama_hue != $game_map.panorama_hue
  235.       @panorama_name = $game_map.panorama_name
  236.       @panorama_hue = $game_map.panorama_hue
  237.       if @panorama.bitmap != nil
  238.         @panorama.bitmap.dispose
  239.         @panorama.bitmap = nil
  240.       end
  241.       if @panorama_name != ""
  242.         @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
  243.       end
  244.       Graphics.frame_reset
  245.     end
  246.     # 雾与现在的情况有差异的情况下
  247.     if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue
  248.       @fog_name = $game_map.fog_name
  249.       @fog_hue = $game_map.fog_hue
  250.       if @fog.bitmap != nil
  251.         @fog.bitmap.dispose
  252.         @fog.bitmap = nil
  253.       end
  254.       if @fog_name != ""
  255.         @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
  256.       end
  257.       Graphics.frame_reset
  258.     end
  259.     # 刷新元件地图
  260.     @tilemap.ox = $game_map.display_x / 4
  261.     @tilemap.oy = $game_map.display_y / 4
  262.     @tilemap.update
  263.     # 刷新远景平面
  264.     @panorama.ox = $game_map.display_x / 8
  265.     @panorama.oy = $game_map.display_y / 8
  266.     # 刷新雾平面
  267.     @fog.zoom_x = $game_map.fog_zoom / 100.0
  268.     @fog.zoom_y = $game_map.fog_zoom / 100.0
  269.     @fog.opacity = $game_map.fog_opacity
  270.     @fog.blend_type = $game_map.fog_blend_type
  271.     @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
  272.     @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
  273.     @fog.tone = $game_map.fog_tone
  274.     # 刷新角色活动块
  275.     for sprite in @character_sprites
  276.       if in_range?(sprite.character)
  277.         sprite.update
  278.       end
  279.     end
  280.     # 刷新天候图形
  281.     @weather.type = $game_screen.weather_type
  282.     @weather.max = $game_screen.weather_max
  283.     @weather.ox = $game_map.display_x / 4
  284.     @weather.oy = $game_map.display_y / 4
  285.     @weather.update
  286.     # 刷新图片
  287.     for sprite in @picture_sprites
  288.       sprite.update
  289.     end
  290.     # 刷新计时器块
  291.     @timer_sprite.update
  292.     # 设置画面的色调与震动位置
  293.     @viewport1.tone = $game_screen.tone
  294.     @viewport1.ox = $game_screen.shake
  295.     # 设置画面的闪烁色
  296.     @viewport3.color = $game_screen.flash_color
  297.     # 刷新显示端口
  298.     @viewport1.update
  299.     @viewport3.update
  300.   end
  301.   def in_range?(object)
  302.     diff_x = ($game_player.real_x - object.real_x).abs  # 绝对值
  303.     diff_y = ($game_player.real_y - object.real_y).abs  # 绝对值
  304.     width = 128 * 24   # size * tiles
  305.     height = 128 * 19  # size * tiles
  306.     return !((diff_x > width) or (diff_y > height))
  307.   end
  308. end
  309. #===============================================================================
  310. # ■ Interpreter
  311. #
  312. # 执行事件命令的解释器
  313. #===============================================================================
  314. class Interpreter
  315.   #-----------------------------------------------------------------------------
  316.   # * 脚本
  317.   #-----------------------------------------------------------------------------
  318.   def command_355
  319.     # script 设置第一行
  320.     script = @list[@index].parameters[0] + "\n"
  321.     # 循环
  322.     loop do
  323.       # 下一个事件指令在脚本 2 行以上的情况下
  324.       if @list[@index+1].code == 655
  325.         # 添加到 script 2 行以后
  326.         script += @list[@index+1].parameters[0] + "\n"
  327.       # 事件指令不在脚本 2 行以上的情况下
  328.       else
  329.         # 中断循环
  330.         break
  331.       end
  332.       # 推进索引
  333.       @index += 1
  334.     end
  335.     # 评价
  336.     result = eval(script)
  337.     #---------------------------------------------------------------------------
  338.     # 返回值为 false 的情况下
  339.     # NEW: the last word of the code mustnt be false!
  340.     #---------------------------------------------------------------------------
  341.     if result == false and script[script.length-6..script.length-2] != 'false'
  342.       # 结束
  343.       return false
  344.     end
  345.     # 继续
  346.     return true
  347.   end
  348. end
  349. #咳咳少了几行代码
  350. $antilag.max_cpu_utilization = 75                              
  351. $antilag.cpu_tolerance = 20      
  352. $antilag.high_priority = true   
  353. $antilag.event = true
  354. #自动回滚标准
  355. if $antilag.max_cpu_utilization>=100
  356.        $antilag.max_cpu_utilization=70
  357. end                 # 分歧结束。

  358.    
复制代码
如上是抢线程脚本,使用抢线程后,角色行走时远景图就会跟着一起移动……求教,应该如何修改抢线程脚本内的Spriteset_Map或是其他部分,才能兼容双远景图和抢线程?

Lv1.梦旅人

虱子

梦石
0
星屑
121
在线时间
1782 小时
注册时间
2010-6-19
帖子
3597
2
发表于 2011-4-3 22:10:40 | 只看该作者
把抢线程的163-215行删掉看看

http://rpg.blue/thread-175056-1-2.html
PVZ型塔防物一个
http://rpg.blue/thread-155199-1-2.html
RMXP技术讨论区手动认可帖,得到答案请认可
回复

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
42 小时
注册时间
2008-8-12
帖子
57
3
发表于 2011-4-3 23:32:57 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-29 06:40

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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