Project1

标题: 开始游戏后黑屏,堆栈过深 [打印本页]

作者: zxlxp2006    时间: 2013-2-17 20:19
标题: 开始游戏后黑屏,堆栈过深
本帖最后由 zxlxp2006 于 2013-2-17 20:32 编辑

好吧我又来问问题了
试着搜索了一下没找到管用的办法。
刚打开的时候没事,点开始游戏后就会直接黑屏掉。

按F12后,系统弹出了:
Ocorreu um erro em SystemStackError, durante opera??o de script. stack level too deep.
脚本运行过程中发生错误SystemStackError。堆栈过深。
……的提示,然后就自动关闭了。

重启过系统,没有用,可能不是电脑本身的问题。

用的是天圣的AVG范例系统,CG鉴赏那一块都还能正常运行就是一开始游戏就黑屏……

系统是在我加了这两段事件后突然就出了问题的:



我猜可能跟那个ED有关……
求帮助,感激不尽,如果需要具体的工程请提出来。
(全废党给跪了……)

需要用到工程么?我先把我改过的脚本粘上来。
  1. =begin

  2. ★修改方面的罗嗦★

  3. 素材替换和排版参见Scene_Menu,这个就不说了。

  4. 这系统其实用起来原理很简单,自定义的部分也多,当然最麻烦的也在于此。
  5. 脚本里你需要修改的大部分只是数字,我会尽可能详细地解释,也欢迎repo使用中
  6. 出现的问题。

  7. =end

  8. class Window_CG < Window_Base
  9.   #--------------------------------------------------------------------------
  10.   # ● 初始化窗口
  11.   #--------------------------------------------------------------------------
  12.   def initialize
  13.     super(-16, -16, 656, 496) #去掉因为边框而导致的坐标误差
  14.     self.contents = Bitmap.new(width - 32, height - 32)
  15.     self.opacity = 0
  16.     refresh
  17.   end
  18.   #--------------------------------------------------------------------------
  19.   # ● 刷新
  20.   #--------------------------------------------------------------------------
  21.   def refresh
  22.     self.contents.clear
  23. #从这里开始进入缩略图出现与否的判定。做好教程里提到的『三步骤』之后,
  24. #系统已经记录了你继承的物品数据。接下来就是直接用其判定。
  25. #注意3号变量被用来记录当前选定CG的编号。
  26. #请看下面的例子。
  27. #=========================================================
  28. if $game_party.item_number(1) > 0 #1号物品(CG1)如果已经获得的话
  29.     bitmap=Bitmap.new("Graphics/pictures/CG1_s")  #显示CG1的缩略图
  30.     src_rect = Rect.new(0, 0, bitmap.width, bitmap.height)  
  31.     if $game_variables[3] == 1
  32.     self.contents.blt(100, 40, bitmap, src_rect,255)
  33.     #前两个数字是坐标可自定义。最后一个数字是判定当该CG被选中时透明度是正常的。
  34.     else        #否则透明度降低表示尚未被选中。
  35.       self.contents.blt(100, 40, bitmap, src_rect,155)
  36.       end
  37.   end
  38. #=========================================================
  39. #这是CG2的设置,改几个小地方即可
  40.   if $game_party.item_number(2) > 0 #这里是对应的2号物品
  41.     bitmap=Bitmap.new("Graphics/pictures/CG2_s")  #显示CG2的缩略图
  42.     src_rect = Rect.new(0, 0, bitmap.width, bitmap.height)  
  43.     if $game_variables[3] == 2 #选中CG变量改为2
  44.     self.contents.blt(250, 40, bitmap, src_rect,255) #坐标……
  45.     else                    
  46.       self.contents.blt(250, 40, bitmap, src_rect,155)  
  47.       end
  48.       end

  49. #=========================================================

  50.     #以此类推,做好你的CG3、CG4……这样基础排版就已经完成了。
  51.    #没有得到的CG,因为物品数为0,所以不会显示出来。底图上可以画个空框啥的……
  52.   if $game_party.item_number(3) > 0 #这里是对应的3号物品
  53.     bitmap=Bitmap.new("Graphics/pictures/CG3_s")  #显示CG2的缩略图
  54.     src_rect = Rect.new(0, 0, bitmap.width, bitmap.height)  
  55.     if $game_variables[3] == 3 #选中CG变量改为3
  56.     self.contents.blt(400, 40, bitmap, src_rect,255) #坐标……
  57.     else                    
  58.       self.contents.blt(400, 40, bitmap, src_rect,155)
  59.     end
  60.     end
  61.   ##########
  62.   if $game_party.item_number(4) > 0
  63.     bitmap=Bitmap.new("Graphics/pictures/CG4_s")  
  64.     src_rect = Rect.new(0, 0, bitmap.width, bitmap.height)  
  65.     if $game_variables[3] == 4
  66.     self.contents.blt(100, 180, bitmap, src_rect,255)
  67.     else                    
  68.       self.contents.blt(100, 180, bitmap, src_rect,155)
  69.     end
  70.     end
  71.   ##########
  72.   if $game_party.item_number(5) > 0
  73.     bitmap=Bitmap.new("Graphics/pictures/CG5_s")
  74.     src_rect = Rect.new(0, 0, bitmap.width, bitmap.height)  
  75.     if $game_variables[3] == 5
  76.     self.contents.blt(250, 180, bitmap, src_rect,255)
  77.     else                    
  78.       self.contents.blt(250, 180, bitmap, src_rect,155)
  79.     end
  80.     end
  81.   ##########
  82.   if $game_party.item_number(6) > 0
  83.     bitmap=Bitmap.new("Graphics/pictures/bg01_s")
  84.     src_rect = Rect.new(0, 0, bitmap.width, bitmap.height)  
  85.     if $game_variables[3] == 6
  86.     self.contents.blt(400, 180, bitmap, src_rect,255)
  87.     else                    
  88.       self.contents.blt(400, 180, bitmap, src_rect,155)
  89.     end
  90.     end
  91.   ##########
  92. end
  93. end

  94. #==============================================================================
  95. # ■ Scene_CG
  96. #------------------------------------------------------------------------------
  97. #  处理CG鉴赏画面的类。
  98. #==============================================================================

  99. class Scene_CG
  100. #--------------------------------------------------------------------------
  101. # ● 主处理
  102. #--------------------------------------------------------------------------
  103.   def main
  104.     $game_variables[3] = 0 #初始化变量
  105.     @cg_window = Window_CG.new
  106.     @back = Sprite.new
  107.     @back.bitmap = RPG::Cache.picture("ui_log")
  108.     # 执行过渡
  109.     Graphics.transition
  110.     # 主循环
  111.     loop do
  112.       # 刷新游戏画面
  113.       Graphics.update
  114.       # 刷新输入信息
  115.       Input.update
  116.       # 刷新画面
  117.       update
  118.       # 如果画面被切换的话就中断循环
  119.       if $scene != self
  120.         break
  121.       end
  122.     end
  123.     # 准备过渡
  124.     Graphics.freeze
  125.     # 释放窗口
  126. #    @command_window.dispose
  127.     @cg_window.dispose
  128.     @back.dispose
  129.   end
  130. #--------------------------------------------------------------------------
  131. # ● 刷新画面
  132. #--------------------------------------------------------------------------
  133.   def update
  134.   $mouse_x, $mouse_y = Mouse.get_mouse_pos #获得鼠标的即时坐标
  135.     # 按下 B 键的情况下
  136.     if Input.trigger?(Input::B)
  137.       # 演奏取消 SE
  138.       $game_system.se_play($data_system.cancel_se)
  139.       # 切换到菜单画面
  140.       $scene = Scene_Title.new
  141.       return
  142.     end
  143.   #
  144.    
  145.     #【重点注意】关于鼠标的刷新。其实原理就是判断鼠标是否落在缩略图上。
  146.      
  147.     #如果落在上面了,则给变量赋值表示选中了某CG。否则将变量清零。
  148.      
  149.     #以CG1为例,上面设置过X坐标100,Y坐标40(左上角原点坐标)。
  150.     #宽高分别是120和90(按你自己做的缩略图大小)。
  151.      
  152.     #所以,CG左上角在(100,40)处,右上角在(220,40)处,左下角在(100,130)处,
  153.      
  154.     #右下角在(220,130)处。(还搞不清的自己画个长方形就知道怎么回事了)
  155.    
  156.     #所以鼠标的X坐标如果在100~220之间同时Y坐标在40~130之间,
  157.    
  158.     #即表示鼠标移动到了这张缩略图上。

  159.    
  160.   if $mouse_x <= 220 and $mouse_x >= 100 and $mouse_y <= 130 and $mouse_y >= 40
  161.      if $game_party.item_number(1) > 0 #CG已经获得时才进行判定
  162.    if $game_variables[3] != 1 #如果现在还没选中该CG的话
  163.     $game_system.se_play($data_system.cursor_se)
  164.     $game_variables[3] = 1    #当前选定CG1
  165.     @cg_window.refresh #刷新一下CG窗口,让原本半透明的CG正回来
  166.     end
  167.     end
  168.    
  169.   elsif $mouse_x <= 370 and $mouse_x >= 250 and $mouse_y <= 130 and $mouse_y >= 40
  170.     if $game_party.item_number(2) > 0 #CG2已经获得时才进行判定
  171.     if $game_variables[3] != 2 #如果现在还没选中该CG的话
  172.     $game_system.se_play($data_system.cursor_se)
  173.     $game_variables[3] = 2   #当前选定CG2
  174.     @cg_window.refresh
  175.     end
  176.     end #这是第二张CG的判定范例。需要更多请用elsif继续接下去。
  177.    
  178.   elsif $mouse_x <= 520 and $mouse_x >= 400 and $mouse_y <= 130 and $mouse_y >= 40
  179.     if $game_party.item_number(3) > 0 #CG3已经获得时才进行判定
  180.     if $game_variables[3] != 3 #如果现在还没选中该CG的话
  181.     $game_system.se_play($data_system.cursor_se)
  182.     $game_variables[3] = 3   #当前选定CG3
  183.     @cg_window.refresh
  184.     end
  185.     end
  186.   
  187.   elsif $mouse_x <= 220 and $mouse_x >= 100 and $mouse_y <= 270 and $mouse_y >= 180
  188.     if $game_party.item_number(4) > 0 #CG4已经获得时才进行判定
  189.     if $game_variables[3] != 4 #如果现在还没选中该CG的话
  190.     $game_system.se_play($data_system.cursor_se)
  191.     $game_variables[3] = 4   #当前选定CG4
  192.     @cg_window.refresh
  193.     end
  194.     end
  195.    
  196.   elsif $mouse_x <= 370 and $mouse_x >= 250 and $mouse_y <= 270 and $mouse_y >= 180
  197.     if $game_party.item_number(5) > 0 #CG5已经获得时才进行判定
  198.     if $game_variables[3] != 5 #如果现在还没选中该CG的话
  199.     $game_system.se_play($data_system.cursor_se)
  200.     $game_variables[3] = 5   #当前选定CG5
  201.     @cg_window.refresh
  202.     end
  203.     end
  204.   
  205.   elsif $mouse_x <= 520 and $mouse_x >= 400 and $mouse_y <= 270 and $mouse_y >= 180
  206.     if $game_party.item_number(6) > 0
  207.     if $game_variables[3] != 6
  208.     $game_system.se_play($data_system.cursor_se)
  209.     $game_variables[3] = 6   
  210.     @cg_window.refresh
  211.     end
  212.     end
  213.    
  214.   else
  215.     $game_variables[3] = 0
  216.     @cg_window.refresh
  217.   end

  218.    if Input.trigger?(Input::C)
  219.     if $game_variables[3] != 0 #有CG被选中的时候
  220.     $game_system.se_play($data_system.decision_se)
  221.     $game_map.setup(2) #移动到2号地图。(地图ID在新建地图可看到)编号自己能改。
  222.     $game_player.moveto(0,0)
  223.     $game_player.refresh
  224.     $game_map.autoplay
  225.     $game_map.update
  226.     $scene = Scene_Map.new
  227.     #接下来显示出CG或者制作回想之类的内容就都是那张地图上的事情了。
  228.     #因为3号变量已经被赋值,所以直接利用条件分歧显示不同图片即可。
  229.   end
  230. end   

  231. end
  232. end
复制代码

作者: 美丽晨露    时间: 2013-2-17 20:39
本帖最后由 美丽晨露 于 2013-2-17 20:59 编辑

脚本貌似没有问题的
可能是事件引起的某些冲突吧
作者: 弗雷德    时间: 2013-2-18 08:30
确切来讲应该是脚本在执行过程中陷入死循环了,已经超出俺的能力范围了,呼叫大神吧。
作者: zhangbanxian    时间: 2013-2-18 15:18
这个问题应该是由于alias了内建类的方法造成的,和你那个事件无关,你可以试试一个脚本一个脚本删过来看看哪个出错
作者: 美丽晨露    时间: 2013-2-18 17:42
如果事件页能提供一下
或许能找到问题
作者: zhangbanxian    时间: 2013-2-20 11:38
用这个替换main试试,话说我很好奇你的rm用的是什么语言的- -b
  1.   class Reset < Exception
  2.   end
  3.   def rgss_main
  4.   yield
  5.   rescue Reset
  6.   ObjectSpace.each_object do |i|
  7.   next unless i.respond_to?(:dispose)
  8.   begin
  9.   i.dispose
  10.   rescue RGSSError
  11.   end
  12.   end
  13.   Graphics.freeze
  14.   retry
  15.   end
  16.   rgss_main{
  17.   begin
  18.   # 准备过渡
  19.   # 设置系统默认字体
  20.   Font.default_name = (["黑体"])
  21.   Graphics.freeze
  22.   # 生成场景对像 (标题画面)
  23.   $scene = Scene_Title.new
  24.   # $scene 为有效的情况下调用main 过程
  25.   while $scene != nil
  26.   $scene.main
  27.   end
  28.   # 淡入淡出
  29.   Graphics.transition(20)
  30.   rescue Errno::ENOENT
  31.   # 补充 Errno::ENOENT 以外错误
  32.   # 无法打开文件的情况下、显示信息后结束
  33.   filename = $!.message.sub("Nosuch file or directory - ", "")
  34.   print("找不到文件 #{filename}。")
  35.   end
  36.   }
复制代码





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