查看: 2051|回复: 7

[已经过期] 这次来问【一个有点难口述的问题】和【一个残留的问题】

[复制链接]
梦石
0
星屑
60
在线时间
32 小时
注册时间
2016-6-23
回帖
16
发表于 2016-12-30 23:23:49 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 RaidenInfinity 于 2016-12-30 23:35 编辑

大家好,我是音无。

今天想问的问题有两个——

1.一个有点难口述的问题:
大概是之前有一个坛友问过的——人物走几帧会卡顿。我这儿的情况是走到地图的某一个固定位置,就会在某一帧突然肉眼可见的人物向前平移了一小格(但是因为只是一瞬间所以难以截图),到了下一帧恢复正常。只会在某些特定的位置出现,不是随机出现的(奔跑和走动均有出现,奔跑时明显)。

听说是要用到1.1的官方补丁,但是找不到啊——

如果实在不行,我只能换台电脑重新建工程了(手头目前只有这台常用的台式机Orz)......

2.(似乎是)一个上次没有解决干净的问题(?):
上次发帖说到pop message和半身像的冲突,版主很给力地解决了我的疑难,在此再一次感谢版主!

这次的问题个半身像还是有关——

算不算是地图缩放脚本和半身像脚本的冲突?

画地图时背景是透明的,出现的问题如图所示Orz

地图缩放脚本:

[pre lang="ruby"]
#==============================================================================
# ■ RGSS3 マップズーム Ver1.00 by 星潟
# ■ RGSS3 地图缩放 Ver1.00 by 星潟      翻译:戏蹑群星斗
#------------------------------------------------------------------------------
#地图缩放。就是这样。
#由于缩放状态保存的数据将被保留(就是存档会保留缩放)。请注意
#==============================================================================
# 使用事件命令的脚本。
#------------------------------------------------------------------------------
# map_zoom(150)
#
# 在这种情况下,它会放大到150%。
#------------------------------------------------------------------------------
# map_zoom(300)
#
# 在这种情况下,它会放大到300%。
#------------------------------------------------------------------------------
# map_zoom
#
# 在这种情况下,放大解除。
#==============================================================================
# 100未満のズーム(縮小)や2000%を超えるのズームには制限をかけてあります。
# 因此,100是最小值,最大值2000。
#==============================================================================
class Game_System
  attr_accessor :zoom_mode
  #--------------------------------------------------------------------------
  # ズームモード
  #--------------------------------------------------------------------------
  def zoom_mode
    @zoom_mode ||= 100
  end
end
class Spriteset_Map
  #--------------------------------------------------------------------------
  # ビューポートの作成
  #--------------------------------------------------------------------------
  alias create_viewports_zoommap create_viewports
  def create_viewports
    create_viewports_zoommap
    @zoommap = ZoomMap.new(@viewport1,@viewport2)
  end
  #--------------------------------------------------------------------------
  # 更新処理
  #--------------------------------------------------------------------------
  alias update_zoommap update
  def update
    @zoommap.update
    update_zoommap
  end
  #--------------------------------------------------------------------------
  # 解放処理
  #--------------------------------------------------------------------------
  alias dispose_zoommap dispose
  def dispose
    @zoommap.dispose
    dispose_zoommap
  end
end
class ZoomMap < Sprite_Base
  #--------------------------------------------------------------------------
  # 初期化
  #--------------------------------------------------------------------------
  def initialize(v1,v2)
    super(v2)
    @viewport_data = v1
    @zoom_rate = $game_system.zoom_mode
    @zoom_bitmap = nil
  end
  #--------------------------------------------------------------------------
  # 解放
  #--------------------------------------------------------------------------
  def dispose
    @zoom_bitmap.dispose if @zoom_bitmap && !@zoom_bitmap.disposed?
    super
  end
  #--------------------------------------------------------------------------
  # 更新処理
  #--------------------------------------------------------------------------
  def update
    self.visible = @zoom_rate != 100
    @zoom_bitmap.dispose if @zoom_bitmap && !@zoom_bitmap.disposed?
    if $game_system.zoom_mode != 100 or @zoom_rate != 100
      if @zoom_rate != $game_system.zoom_mode
        d = (@zoom_rate - $game_system.zoom_mode).to_i
        case d
        when 0..9;i = 1
        when 10..99;i = 2
        when 100..999;i = 3
        else; i = 4
        end
        @zoom_rate += (@zoom_rate < $game_system.zoom_mode) ? i : -i
      end
      zm = @zoom_rate.to_f / 100
      @viewport_data.z += 10000000
      @zoom_bitmap = Graphics.snap_to_bitmap
      self.bitmap = @zoom_bitmap
      w = self.bitmap.width
      h =self.bitmap.height
      self.ox = [[0,((w * zm / 2) - w / 2) / zm + (($game_player.screen_x - w / 2).to_f)].max,(w * zm - w) / zm].min
      self.oy = [[0,((h * zm / 2) - h / 2) / zm + (($game_player.screen_y - 16 - h / 2).to_f)].max,(h * zm - h) / zm].min
      self.zoom_x = zm
      self.zoom_y = zm
      self.visible = true
      @viewport_data.z -= 10000000
    end
    super
  end
end
class Game_Interpreter
  #--------------------------------------------------------------------------
  # ズーム
  #--------------------------------------------------------------------------
  def map_zoom(rate = 100)
    $game_system.zoom_mode = [[rate,100].max,2000].min
  end
end
[/pre]

半身像脚本:

[pre lang="ruby"]
#encoding:utf-8
#==============================================================================
# ■ 半身像对话框 by LBQ
#------------------------------------------------------------------------------
#  一个简单的半身像对话框罢了= =
#------------------------------------------------------------------------------
# ■ 用法一览
#     1:如何将半身像应用到游戏中?
#       ——如果想要把一个脸图替换成半身像,则需要找到这个脸图的编号,比如说拉尔
#           夫,就是Actor1的编号0,之后去在Graphics/Busts这个文件夹里面拷贝一个
#           叫做Actor1_0的图像,这个图像会被当做半身像替换原有图像。
#==============================================================================
$imported ||= {}
$imported[:LBQ_Bust]=true

module LBQ
  module Bust
    FOLDER="Busts"
    SUB1=[/【/,    "\\{\\c[6]-- "]
    SUB2=[/】/,    " --\\c[0]\\}"]

    TEXT_FOR_NEXT="[next]"
    TEXT_FOR_END ="[end]"

    INDENT=150 #半身像的缩进
  end
end

module Cache
  def self.busts(filename)
    load_bitmap("Graphics/#{LBQ::Bust::FOLDER}/", filename)
  end
end



class Sprite_Bust < Sprite_Base
  attr_accessor   :bust_graphics
  attr_accessor   :status

  def initialize(vp=nil)
    super(vp)
    @bust_graphics=nil
    @status=:nothing
  end

  def slide_in
    @status=:sliding_in
  end

  def slide_out
    @status=:sliding_out
    if $game_message.do_not_slide_out
      @status=:slided_out
      set_pos
    end
  end




  def set_pos(slide_in=true)
    self.x=0 - self.bitmap.width
    self.y=Graphics.height-self.bitmap.height

    self.x=0 unless slide_in
  end


  def set_graphics(bust_graphics)
    self.bitmap=Cache.busts(bust_graphics)
  end



  def update
    super
    case @status
    when :nothing
      # Do Nothing
    when :sliding_in
      #Slide In
      self.x+=12
      if self.x>=0
        self.x=0
        @status=:slided_in
      end

    when :sliding_out
      self.x-=12
      if self.x<= -self.bitmap.width
        self.x= -self.bitmap.width
        @status=:slided_out
      end
      #Slide Out
    when :slided_in
      #Slided in
    when :slided_out
      #Sliede out
    end

  end


end


class Game_Message
  attr_accessor   :bust_name
  attr_accessor   :bust
  attr_accessor   :have_bust
  attr_accessor   :do_not_slide_out

  alias lbq_bust_shot_game_message_init initialize
  def initialize
    lbq_bust_shot_game_message_init
    @bust_name=""
    @bust=nil
    @have_bust=false
    @do_not_slide_out=false
  end



  #--------------------------------------------------------------------------
  # ● 添加内容
  #--------------------------------------------------------------------------
  def add(text)
    new_text=text.gsub(LBQ::Bust::SUB1[0],LBQ::Bust::SUB1[1])
    new_text2=new_text.gsub(LBQ::Bust::SUB2[0],LBQ::Bust::SUB2[1])
    if new_text2.include? LBQ::Bust::TEXT_FOR_NEXT
      new_text2.delete!(LBQ::Bust::TEXT_FOR_NEXT)
      $game_message.do_not_slide_out=true
    end

    if new_text2.include? LBQ::Bust::TEXT_FOR_END
      new_text2.delete!(LBQ::Bust::TEXT_FOR_END)
      $game_message.do_not_slide_out=false
    end
    @texts.push(new_text2)
  end
end



class Game_Interpreter
  alias lbq_bust_shot_command_101 command_101
  #--------------------------------------------------------------------------
  # ● 显示文字
  #--------------------------------------------------------------------------
  def command_101
    $game_message.bust=nil
      unless @params[0].empty?
        if File.exist?("Graphics/#{LBQ::Bust::FOLDER}/#{@params[0]}_#{@params[1]}.png")
          $game_message.have_bust=true
        else
          $game_message.have_bust=false
          $game_message.bust_name=""
        end
      end

    unless @params[3] == 2
      $game_message.have_bust=false
    end

    if $game_message.have_bust
      $game_message.bust_name="#{@params[0]}_#{@params[1]}"
      $game_message.bust=nil
      $game_message.bust=Sprite_Bust.new
      $game_message.bust.set_graphics($game_message.bust_name)
      $game_message.bust.z=99999
      unless $game_message.do_not_slide_out
        $game_message.bust.set_pos
        $game_message.bust.slide_in
      else
        $game_message.bust.set_pos(false)
        $game_message.bust.slide_in
      end
    end

    lbq_bust_shot_command_101
    if $game_message.have_bust
        $game_message.bust.slide_out
        Fiber.yield until $game_message.bust.status==:slided_out
    end
    $game_message.have_bust=false
    $game_message.bust_name=""

  end


  alias lbq_bust_int_update update
  def update
    lbq_bust_int_update
    $game_message.bust.update unless $game_message.bust.nil?
  end

end


class Window_Message
  #--------------------------------------------------------------------------
  # ● 获取换行位置
  #--------------------------------------------------------------------------
  def new_line_x
    value=0
    value=112 unless $game_message.face_name.empty?
    unless $game_message.face_name.empty? && $game_message.bust_name.empty?
      value=LBQ::Bust::INDENT
    end
   
    return value
  end
end


class Window_Message
  #--------------------------------------------------------------------------
  # ● 翻页处理
  #--------------------------------------------------------------------------
  def new_page(text, pos)
    contents.clear
    draw_face($game_message.face_name, $game_message.face_index, 0, 0) if $game_message.bust_name.empty?
    reset_font_settings
    pos[:x] = new_line_x
    pos[:y] = 0
    pos[:new_x] = new_line_x
    pos[:height] = calc_line_height(text)
    clear_flags
  end
end
[/pre]

以上就是问题了,求解!谢谢
QQ截图20161230231815.png
梦石
0
星屑
3557
在线时间
2337 小时
注册时间
2015-8-25
回帖
928

开拓者

发表于 2016-12-30 23:56:42 | 显示全部楼层
第一个问题,我猜的,应该是调过了分辨率?

新的分辨率长宽不是32的整数倍?

又或者是地图大小设定得过小。
回复

使用道具 举报

梦石
0
星屑
6891
在线时间
7027 小时
注册时间
2013-11-2
回帖
1263

开拓者剧作品鉴家

发表于 2016-12-31 00:08:56 | 显示全部楼层
本帖最后由 RaidenInfinity 于 2016-12-31 00:43 编辑

第一个问题,如果连什么都没有碰过的新工程都卡顿,99%是硬件(电脑)的锅。

如果有碰过分辨率,请确保是32的倍率,不管是宽还是高。
这是因为如果不是32的倍率,地图卷轴的机制会出问题。在靠近地图的边缘尤其会出现这种问题。

第二个问题……我只能感叹…又是日本人写的脚本。
用Graphics.snap_to_bitmap(屏幕截图)这种方式来做地图缩放真是醉得离谱。
这代表地图上不能有界面相关的事物,因为都会被截进去。
所以解决方法:把地图缩放删掉。
回复

使用道具 举报

梦石
0
星屑
60
在线时间
32 小时
注册时间
2016-6-23
回帖
16
 楼主| 发表于 2016-12-31 20:04:57 | 显示全部楼层
本帖最后由 音无梓燚 于 2016-12-31 22:17 编辑
RaidenInfinity 发表于 2016-12-31 00:08
第一个问题,如果连什么都没有碰过的新工程都卡顿,99%是硬件(电脑)的锅。

如果有碰过分辨率,请确保是3 ...


滚回去检测了分辨率,没有改变,看来应该是电脑硬件的锅了Orz第二个问题我试着用黑色图块把地图空余的透明部分遮住了貌似凑合着可以行得通——顺便问问:如果在这个电脑上做的时候第一个问题存在,那游戏完成后导出到另外一台正常的电脑上运行会卡吗?


删掉了地图缩放——好像不卡了?!但是我有个朋友也用这个脚本,我玩过她的游戏,但她那儿好像没有卡顿问题?

建了个新工程,发现不卡......

点评

那看来十之八九就是那脚本的锅了。1秒截图60次,不爆炸都难。建议别搞这种玩意儿吧… 另外这里要介绍下一个QQ群 113622890 有各路大佬能提供支援  发表于 2016-12-31 22:22
这地图缩放脚本的运行原理是每帧都截图然后放大。这截图非常耗效率,如果电脑不给力就是卡出翔。不过这只是推测,还是要看新工程的情况。  发表于 2016-12-31 21:23
请尝试删掉地图缩放脚本然后再看看还卡不卡。我真怀疑是这鬼东西的锅。新工程确定会卡吗?  发表于 2016-12-31 21:06
把你工程給一電腦比較好的朋友測試  发表于 2016-12-31 20:28
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部