Project1

标题: 如何在场景中正确调用窗口?已解决 [打印本页]

作者: 飞翔的小鸟3    时间: 2017-10-1 22:31
标题: 如何在场景中正确调用窗口?已解决
本帖最后由 飞翔的小鸟3 于 2017-10-2 13:02 编辑

我在场景中调用窗口,但是窗口很快就消失了,查了一下
https://rpg.blue/forum.php?mod=viewthread&tid=126881&highlight=窗口%2B消失

说是要在场景中调(另外一个说用变量调用,大概是a=XX.new,但是a.initialize发生错误,也不知道为什么),然后,我思考了一下,写下如下代码:
我写的窗口:
class Window_shortcut < Window_Command
  def initialize
    super(0,0)
    update_placement
    make_command_list
    music_command_window
    activate
  end
  def update_placement
    self.x = (Graphics.width - width) / 2
    self.y = (Graphics.height * 1.6 - height) / 2
  end
  def make_command_list
    add_command("1", :blood_volume)
    add_command("2", :Bomb_residue)
    add_command("3", :change_weapon)
  end
  def music_command_window
    set_handler(:blood_volume, method(:run_blood_volume))
    set_handler(:Bomb_residue, method(:run_Bomb_residue))
    set_handler(:change_weapon, method(:run_change_weapon))
  end
  def run_blood_volume
  end
  def run_Bomb_residue
  end
  def run_change_weapon
  end
end


我在场景中调用的方法(Scene_Map里面)

def start
    super
    SceneManager.clear
    $game_player.straighten
    $game_map.refresh
    $game_message.visible = false
    create_spriteset
    create_all_windows
    @menu_calling = false
    if $shortcut_window_ok == 1
      Window_shortcut.new
      a = Window_shortcut.new
      a.activate
      $shortcut_window_ok = 0
    end

  end
#========================
  def shortcut_window
    if Kboard.keyboard(0x09)
      if $shortcut_num == nil or $shortcut_num == 0
      $shortcut_num = 1
      $shortcut_window_ok = 1
      SceneManager.call(Scene_Map)
      else
      a = Window_shortcut.new
      a.dispose
      $shortcut_num = 0
      end
    end
  end

  #--------------------------------------------------------------------------
  # ● 更新画面
  #--------------------------------------------------------------------------
  def update
    super
    $game_map.update(true)
    $game_player.update
    $game_timer.update
    @spriteset.update
    update_scene if scene_change_ok?
    shortcut_window
  end

我call出了map的场景,然后调用窗口,还是消失了。
代码中Kboard.keyboard(0x09)指按下tab键

红字是我写的


作者: plmo43    时间: 2017-10-1 23:15
本帖最后由 plmo43 于 2017-10-2 02:00 编辑

update里没有刷新你自己新建的这个窗口,使用本地变量命名窗口然后在适当的地方update它就好了。脑抽造成误导,涂一下,十分抱歉。

不过如果这个窗口在游戏里经常显示的话,推荐你在Scene_Map一开始创建Window_shortcut,然后使用visible方法隐藏或显示并在适当的地方update它。
RUBY 代码复制
  1. def start
  2.     super
  3.     SceneManager.clear
  4.     $game_player.straighten
  5.     $game_map.refresh
  6.     $game_message.visible = false
  7.     create_spriteset
  8.     create_all_windows
  9.     @menu_calling = false
  10.  
  11.     @window_shortcut = Window_shortcut.new
  12.     @window_shortcut.activate
  13.     if $shortcut_window == 1
  14.       @window_shortcut.visible = true
  15.     else
  16.       @window_shortcut.visible = false
  17.     end
  18.  
  19.   end
  20.  
  21.   def shortcut_window
  22.     #@window_shortcut.update if @window_shortcut.visible == true
  23.     if Kboard.keyboard(0x09)
  24.       if @window_shortcut.visible == false
  25.         @window_shortcut.visible = true
  26.         $shortcut_window = 1
  27.       else
  28.         @window_shortcut.visible = false
  29.         $shortcut_window = 0
  30.       end
  31.     end
  32.   end




作者: 飞翔的小鸟3    时间: 2017-10-2 00:00
plmo43 发表于 2017-10-1 23:15
update里没有刷新你自己新建的这个窗口,使用本地变量命名窗口然后在适当的地方update它就好了。
不过如果 ...

我想了想,真的是没update吗?
我把你哪个update指令注释掉,依旧不消失,然后我想:不对啊。这时,忽然想到我用a做变量调出窗口,a为普通变量,执行完不就消失了吗,然后我用局部变量,原来的代码真的没问题了。
我想得对吗?
然后,你那个visible的办法真的不错,我都不知道有这个。谢谢了
作者: plmo43    时间: 2017-10-2 01:53
本帖最后由 plmo43 于 2017-10-2 02:01 编辑
飞翔的小鸟3 发表于 2017-10-2 00:00
我想了想,真的是没update吗?
我把你哪个update指令注释掉,依旧不消失,然后我想:不对啊。这时,忽然 ...

脑抽了一下,确实不用update,Scene_Base里有针对Window的统一刷新(Scene_Base 92~97),那问题就是本地变量的问题了……造成误区不好意思。

我那段代码22行可以注释掉。如果是在一开始创建的话,不需要刻意去dispose,Scene_Base里也一样有针对Window的统一的dispose方法(Scene_Base 101~106),切换Scene的时候会自动dispose掉。







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