Project1

标题: 为什么显示数值会卡?? [打印本页]

作者: pudding    时间: 2010-7-24 08:17
标题: 为什么显示数值会卡??
我很郁闷...怎么别人写的脚本显示的数值都不卡?
但是我写的脚本会卡的呢?
不过在新的工程里的确不卡.
但在我的游戏里卡的不得了~
  1. class Hp_Window  < Window_Base
  2.   def initialize  
  3.     super(-15, -16, 740, 580)
  4.     self.contents = Bitmap.new(width - 32, height - 32)
  5.     self.opacity = 0
  6.     self.z = 998
  7.     self.visible = true
  8.   end
  9.   #--------------------------------------------------------------------------
  10.   # ● 刷新画面
  11.   #--------------------------------------------------------------------------
  12.   def update
  13.     value_x = -188
  14.     actor = $game_party.actors[0]  #主角
  15.     draw_2hp(actor, 209 + value_x, 8) #生命条
  16.     system_picture(0,0)
  17.     draw_hp_background(0 + value_x,0)    # HP底图
  18.     draw_mp_background(312 + value_x,8)  # MP底图
  19.     draw_hp(actor, 209 + value_x, 8) #生命条
  20.     draw_mp(actor, 312 + value_x, 8) #能量条
  21.     draw_map_exp(actor, 246 + value_x, 29)   #经验条
  22. end
  23.    #----------------------------------------------------------------------------
  24.   # ● 显示文字
  25.   #----------------------------------------------------------------------------
  26.   def draw_2hp(actor,x,y)
  27.     self.contents.clear
  28.     self.contents.font.size = 11  # 文字的字号
  29.     self.contents.draw_text(x+10,  y, 410, 904, $game_party.item_number(1).to_s, 1)
  30.     self.contents.draw_text(x+10,  y, 488, 904, $game_party.item_number(2).to_s, 1)
  31.     self.contents.draw_text(x+10,  y, 566, 904, $game_party.item_number(3).to_s, 1)
  32.     self.contents.draw_text(x+10,  y, 644, 904, $game_party.item_number(4).to_s, 1)
  33.   end
  34.    #----------------------------------------------------------------------------
  35.   # ● 底图
  36.   #----------------------------------------------------------------------------
  37.   def draw_hp_background(x,y)
  38.     hp_background = RPG::Cache.picture("HPdi")
  39.     hp_back = Rect.new(0, 0, hp_background.width, hp_background.height)
  40.     self.contents.blt(x, y, hp_background, hp_back)
  41.   end
  42.   def system_picture(x,y)
  43.     sy_picture = RPG::Cache.picture("system_picture")
  44.     s_picture = Rect.new(0, 0, sy_picture.width, sy_picture.height)
  45.     self.contents.blt(x, y, sy_picture, s_picture)
  46.   end
  47.   def draw_mp_background(x,y)
  48.     hp_background = RPG::Cache.picture("MP")
  49.     hp_back = Rect.new(0, 0, hp_background.width, hp_background.height)
  50.     self.contents.blt(x, y, hp_background, hp_back)
  51.   end
  52.   #----------------------------------------------------------------------------
  53.   # ● 生命条
  54.   #----------------------------------------------------------------------------
  55. def draw_hp(actor,x,y)
  56.     hp = RPG::Cache.picture("HP条")
  57.     hp_w = hp.width * actor.hp / [actor.maxhp,1].max
  58.     rect2 = Rect.new(0,0,hp_w,hp.height)
  59.     self.contents.blt(x,y,hp,rect2)
  60.   end #def HP
  61.   #----------------------------------------------------------------------------
  62.   # ● 能量条
  63.   #----------------------------------------------------------------------------
  64.    def draw_mp(actor,x,y)
  65.     mp = RPG::Cache.picture("MP条")
  66.     mp_w = mp.width * (actor.maxsp-actor.sp)  / [actor.maxsp,1].max
  67.     rect3 = Rect.new(0,0,mp_w,mp.height)
  68.     self.contents.blt(x,y,mp,rect3)
  69.   end #def MP
  70.   #----------------------------------------------------------------------------
  71.   # ● 描绘地图界面经验条
  72.   #----------------------------------------------------------------------------
  73.   def draw_map_exp(actor, x, y)
  74.     bitmap = RPG::Cache.picture("EXP条")
  75.     actor = $game_party.actors[0]
  76.     if actor.nextexp != 0
  77.       jisuan = actor.nowexp.to_f / actor.nextexp
  78.     else
  79.       jisuan = 1
  80.     end
  81.     if actor.level < 99 # 最大等级
  82.       nw = bitmap.width * jisuan
  83.     else
  84.       nw = bitmap.width
  85.     end  
  86.     src_rect = Rect.new(0, 0, nw, bitmap.height)
  87.     self.contents.blt( x, y, bitmap, src_rect)
  88.   end
  89. #==============================================================================
  90. # ■ Game_Actor
  91. #==============================================================================
  92. class Game_Actor
  93.   #--------------------------------------------------------------------------
  94.   # ● 获取目前经验
  95.   #--------------------------------------------------------------------------
  96.   def nowexp
  97.      return @exp - @exp_list[@level]
  98.   end
  99.   #--------------------------------------------------------------------------
  100.   # ● 下一等级还需的经验
  101.   #--------------------------------------------------------------------------
  102.   def nextexp
  103.     return @exp_list[@level+1] > 0 ? @exp_list[@level+1] - @exp_list[@level] : 0
  104.   end
  105. end
复制代码

作者: IamI    时间: 2010-7-24 08:19
囧……我把你那贴结了你就新开了么……
每帧都进行描绘操作是肯定都卡的,你可以添加一个监视,当数值发生改变时进行重绘。
作者: 普林    时间: 2010-7-24 08:22
新建工程,把原来所用的东西复制到新工程里试试。

作者: pudding    时间: 2010-7-24 08:25
我以为是你让我开新贴,才这么快就了结帖子..开帖子我也觉得很麻烦
我觉得很深奥...不明白...也不会弄  
作者: 普林    时间: 2010-7-24 09:21
本帖最后由 普林 于 2010-7-24 09:25 编辑


1.地图复制进去
2.脚本复制进去
3.素材复制进去
--------------------
以前我遇到过类似卡脚本的问题,通过以上方式解决。
作者: 小角色    时间: 2010-7-24 09:33
即时刷新血槽是肯定要卡的。。。不是数值的问题
def update

    value_x = -188

    actor = $game_party.actors[0]  #主角

    draw_2hp(actor, 209 + value_x, 8) #生命条

    system_picture(0,0)

    draw_hp_background(0 + value_x,0)    # HP底图

    draw_mp_background(312 + value_x,8)  # MP底图

    draw_hp(actor, 209 + value_x, 8) #生命条

    draw_mp(actor, 312 + value_x, 8) #能量条

    draw_map_exp(actor, 246 + value_x, 29)   #经验条

end

这一段能加个条件句判断数值发生变化了再刷新就好了
作者: pudding    时间: 2010-7-24 10:43
怎么判断数值发生变化了?  {:4_83:}
作者: 春日结乃    时间: 2010-7-24 10:50
例如要描绘$game_variables[1](变量1号)
  1. def update
  2.   #——如果变量1号和记录变量不相同 也就是说变量1号发生了改变
  3.   if @spring_variable != $game_variables[1]
  4.     @spring_variable = $game_variables[1] #——记录
  5.     refresh #——描绘
  6.   end
  7. end
复制代码
大概写法就是这样。
作者: 春日结乃    时间: 2010-7-24 11:04
  1. def update
  2.   if @spring_hp != $game_party.actors[0].hp or @spring_sp != $game_party.actors[0].sp or @spring_exp != $game_party.actors[0].exp
  3.     value_x = -188
  4.     actor = $game_party.actors[0]  #主角
  5.     draw_2hp(actor, 209 + value_x, 8) #生命条
  6.     system_picture(0,0)
  7.     draw_hp_background(0 + value_x,0)    # HP底图
  8.     draw_mp_background(312 + value_x,8)  # MP底图
  9.     draw_hp(actor, 209 + value_x, 8) #生命条
  10.     draw_mp(actor, 312 + value_x, 8) #能量条
  11.     draw_map_exp(actor, 246 + value_x, 29)   #经验条
  12.     @spring_hp = $game_party.actors[0].hp
  13.     @spring_sp = $game_party.actors[0].sp
  14.     @spring_exp = $game_party.actors[0].exp
  15.   end
  16. end
复制代码
这样应该就不会卡了~~

卡的原因主要是因为每一帧都描绘。所以通过判断和记录,等到数值改变的时候才描绘,那么内存的压力就会减少很多。一般数值需要随时改变的,都需要用这个方式。
作者: pudding    时间: 2010-7-24 11:14
本帖最后由 pudding 于 2010-7-24 11:15 编辑

  我参考了一些范例.... 自己改了改
  1. class Scene_Map
  2.   #--------------------------------------------------------------------------
  3.   # ● 主处理
  4.   #--------------------------------------------------------------------------
  5.   alias fox_text_window_main main
  6.   def main
  7.     @HP_window = Hp_Window.new
  8.     @item_1_new = $game_party.item_number(1).to_s
  9.     @item_2_new = $game_party.item_number(2).to_s
  10.     @item_3_new = $game_party.item_number(3).to_s
  11.     @item_4_new = $game_party.item_number(4).to_s
  12.     fox_text_window_main
  13.     # 释放
  14.     @HP_window.dispose
  15.     if $scene.is_a?(Scene_Title)
  16.       # 淡入淡出画面
  17.       Graphics.transition
  18.       Graphics.freeze
  19.     end
  20.   end
  21.   #--------------------------------------------------------------------------
  22.   # ● 更新
  23.   #--------------------------------------------------------------------------
  24.   alias fox_text_window_update update
  25.   def update
  26.     # 刷新地图状态窗口
  27.     if @item_1_new != $game_party.item_number(1).to_s
  28.       @HP_window.refresh
  29.       @item_1_new = $game_party.item_number(1).to_s
  30.     end
  31.     if @item_2_new != $game_party.item_number(2).to_s
  32.       @HP_window.refresh
  33.       @item_2_new = $game_party.item_number(2).to_s
  34.     end
  35.     if @item_3_new != $game_party.item_number(3).to_s
  36.       @HP_window.refresh
  37.       @item_3_new = $game_party.item_number(3).to_s
  38.     end
  39.     if @item_4_new != $game_party.item_number(4).to_s
  40.       @HP_window.refresh
  41.       @item_4_new = $game_party.item_number(4).to_s
  42.     end
  43.     fox_text_window_update
  44.     if @HP_window.visible
  45.       @HP_window.update
  46.     end
  47.   end
  48. end
复制代码
加入后 问题就解决了..     真佩服自己!
噢 这里也改了改
  1.   def update
  2.     value_x = -188
  3.     actor = $game_party.actors[0]  #主角
  4.     system_picture(0,0)
  5.     draw_hp_background(0 + value_x,0)    # HP底图
  6.     draw_mp_background(312 + value_x,8)  # MP底图
  7.     draw_hp(actor, 209 + value_x, 8) #生命条
  8.     draw_mp(actor, 312 + value_x, 8) #能量条
  9.     draw_map_exp(actor, 246 + value_x, 29)   #经验条
  10.     end
  11.   #--------------------------------------------------------------------------
  12.   # ● 刷新画面
  13.   #--------------------------------------------------------------------------
  14.   def refresh
  15.     self.contents.clear
  16.     value_x = -188
  17.     actor = $game_party.actors[0]  #主角
  18.     draw_2hp(actor, 209 + value_x, 8) #显示文字
  19.   end
复制代码





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