Project1

标题: 脚本中的动态是如何实现的? [打印本页]

作者: 小湖    时间: 2010-12-6 13:54
标题: 脚本中的动态是如何实现的?
本帖最后由 小湖 于 2010-12-6 20:42 编辑

例如给一个窗口类制作一个窗口移动的方法,比如每隔1帧窗口的x+1,现在我的方法是把窗口定义成全局对象,然后用公共事件做,可是扩展性太差了……想知道脚本中是如何实现的?
作者: 白鬼    时间: 2010-12-6 15:04
我记得有一个脚本,是模仿 魔兽世界 的效果的窗口类脚本。
具体的效果有点忘记了,如果没记错的话,窗口被激活后应该是动态拼组起来的,还伴有音效(好吧,这个无关紧要)
  1. # ————————————————————————————————————
  2. # 本脚本来自www.66rpg.com,仿魔兽式窗口。转载请保留此信息
  3. # ————————————————————————————————————

  4. #==============================================================================
  5. # ■ Warcraftization
  6. #------------------------------------------------------------------------------
  7. #  处理魔兽式菜单切换的模块。
  8. #==============================================================================

  9. module Warcraftization
  10. Dispose_effect = "Audio/SE/024-Door01"       # 菜单切换时音效
  11. Ini_efect = "Audio/SE/029-Door06"            # 切换结束时音效
  12. # 窗口移动的速度:反比,取整数,范围1-12,1最快,12最慢
  13. Speed = 7                                    # 窗口移动的速度           
  14. Elasticity = true                            # 窗口有无弹性

  15. #############################################################################
  16. #############################################################################
  17. # 处理速度的函数 (为了让直接调用 $scene = XXX.new 也生效,故每个Scene都调用)
  18. def speed
  19.    # 速度处理 (因为像素不可活算小数(分数),所以只能取一些公约数)
  20.    # (存档处因为数字比较特殊,所以这里的速度不影响它
  21.    #  有兴趣可以自己在下面的Scene_File调)
  22.    case Speed
  23.    when 1;$speed = 1
  24.    when 2;$speed = 2
  25.    when 3;$speed = 4
  26.    when 4;$speed = 5
  27.    when 5;$speed = 8
  28.    when 6;$speed = 10
  29.    when 7;$speed = 16
  30.    when 8;$speed = 20
  31.    when 9;$speed = 32
  32.    when 10;$speed = 40
  33.    when 11;$speed = 80
  34.    when 12;$speed = 160
  35.    end
  36. end
  37. # 弹力处理
  38. def elasticity (object)
  39.    if Elasticity then for i in 0 .. 5
  40.        object.y -= i * 2
  41.        Graphics.update
  42.      end;for i in 0 .. 5
  43.        object.y += i * 2
  44.        Graphics.update
  45.      end;for i in 0 .. 3
  46.        object.y -= i * 2
  47.        Graphics.update
  48.      end;for i in 0 .. 3
  49.        object.y += i * 2
  50.        Graphics.update
  51.      end;for i in 0 .. 1
  52.        object.y -= i * 2
  53.        Graphics.update
  54.      end;for i in 0 .. 1
  55.        object.y += i * 2
  56.        Graphics.update
  57.      end
  58.    end
  59. end
  60. end  
  61. #==============================================================================
  62. # ■ Scene_Menu
  63. #------------------------------------------------------------------------------
  64. #  处理菜单画面的类。
  65. #==============================================================================

  66. class Scene_Menu
  67. include Warcraftization
  68. #--------------------------------------------------------------------------
  69. # ● 主处理
  70. #--------------------------------------------------------------------------
  71. def main
  72.    speed
  73.    @spriteset = Spriteset_Map.new
  74.    # 生成命令窗口
  75.    s1 = $data_system.words.item
  76.    s2 = $data_system.words.skill
  77.    s3 = $data_system.words.equip
  78.    s4 = "人物状态"
  79.    s5 = "存档"
  80.    s6 = "结束游戏"
  81.    @command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6])
  82.    @command_window.index = @menu_index
  83.    @command_window.x = -160
  84.    # 同伴人数为 0 的情况下
  85.    if $game_party.actors.size == 0
  86.      # 物品、特技、装备、状态无效化
  87.      @command_window.disable_item(0)
  88.      @command_window.disable_item(1)
  89.      @command_window.disable_item(2)
  90.      @command_window.disable_item(3)
  91.    end
  92.    # 禁止存档的情况下
  93.    if $game_system.save_disabled
  94.      # 存档无效
  95.      @command_window.disable_item(4)
  96.    end
  97.    # 生成游戏时间窗口
  98.    @playtime_window = Window_PlayTime.new
  99.    @playtime_window.x = -160
  100.    @playtime_window.y = 224
  101.    # 生成步数窗口
  102.    @steps_window = Window_Steps.new
  103.    @steps_window.x = -160
  104.    @steps_window.y = 320
  105.    # 生成金钱窗口
  106.    @gold_window = Window_Gold.new
  107.    @gold_window.x = -160
  108.    @gold_window.y = 416
  109.    # 生成状态窗口
  110.    @status_window = Window_MenuStatus.new
  111.    @status_window.x = 640
  112.    @status_window.y = 0
  113.    @command_window.back_opacity = 180
  114.    @playtime_window.back_opacity = 180
  115.    @steps_window.back_opacity = 180
  116.    @gold_window.back_opacity = 180
  117.    @status_window.back_opacity = 180
  118.    # 执行过渡
  119.    Graphics.transition
  120.    for i in 1 .. $speed
  121.      @command_window.x += 160 / $speed
  122.      @playtime_window.x += 160 / $speed
  123.      @steps_window.x += 160 / $speed
  124.      @gold_window.x += 160 / $speed
  125.      @status_window.x -= 480 / $speed
  126.      Graphics.update
  127.    end
  128.    Audio.se_play(Ini_efect, 100, 0)
  129.    # 主循环
  130.    loop do
  131.      # 刷新游戏画面
  132.      Graphics.update
  133.      # 刷新输入信息
  134.      Input.update
  135.      # 刷新画面
  136.      update
  137.      # 如果切换画面就中断循环
  138.      if $scene != self
  139.        break
  140.      end
  141.    end
  142.    Audio.se_play(Dispose_effect, 100, 100)
  143.    for i in 1 .. $speed
  144.      @command_window.x -= 160 / $speed
  145.      @playtime_window.x -= 160 / $speed
  146.      @steps_window.x -= 160 / $speed
  147.      @gold_window.x -= 160 / $speed
  148.      @status_window.x += 480 / $speed
  149.      Graphics.update
  150.    end   
  151.    # 释放活动块
  152.    # 准备过渡
  153.    Graphics.freeze
  154.    # 释放窗口
  155.    @command_window.dispose
  156.    @playtime_window.dispose
  157.    @steps_window.dispose
  158.    @gold_window.dispose
  159.    @status_window.dispose
  160. end
  161. end
  162. #==============================================================================
  163. # ■ Scene_Item
  164. #------------------------------------------------------------------------------
  165. #  处理物品画面的类。
  166. #==============================================================================

  167. class Scene_Item
  168. include Warcraftization  
  169. #--------------------------------------------------------------------------
  170. # ● 主处理
  171. #--------------------------------------------------------------------------
  172. def main
  173.    speed
  174.    @spriteset = Spriteset_Map.new
  175.    # 生成帮助窗口、物品窗口
  176.    @help_window = Window_Help.new
  177.    @help_window.y = -64
  178.    @help_window.back_opacity = 180
  179.    @item_window = Window_Item.new
  180.    @item_window.y = 480
  181.    @item_window.back_opacity = 180
  182.    # 关联帮助窗口
  183.    @item_window.help_window = @help_window
  184.    # 生成目标窗口 (设置为不可见?不活动)
  185.    @target_window = Window_Target.new
  186.    @target_window.y = -480
  187.    @target_window.visible = false
  188.    @target_window.active = false
  189.    # 执行过渡
  190.    Graphics.transition
  191.    for i in 1 .. $speed
  192.      @help_window.y += 64 / $speed
  193.      @item_window.y -= 418 / $speed
  194.      Graphics.update
  195.    end
  196.    Audio.se_play(Ini_efect, 100, 0)
  197.    # 主循环
  198.    loop do
  199.      # 刷新游戏画面
  200.      Graphics.update
  201.      # 刷新输入信息
  202.      Input.update
  203.      # 刷新画面
  204.      update
  205.      # 如果画面切换就中断循环
  206.      if $scene != self
  207.        break
  208.      end
  209.    end
  210.    Audio.se_play(Dispose_effect, 100, 100)
  211.    for i in 1 .. $speed
  212.      @help_window.y -= 64 / $speed
  213.      @item_window.y += 418 / $speed
  214.      @target_window.y -= 480 / $speed
  215.      Graphics.update
  216.    end   
  217.    # 装备过渡
  218.    Graphics.freeze
  219.    # 释放窗口
  220.    @help_window.dispose
  221.    @item_window.dispose
  222.    @target_window.dispose
  223. end
  224. #--------------------------------------------------------------------------
  225. # ● 刷新画面 (物品窗口被激活的情况下)
  226. #--------------------------------------------------------------------------
  227. def update_item
  228.    # 按下 B 键的情况下
  229.    if Input.trigger?(Input::B)
  230.      # 演奏取消 SE
  231.      $game_system.se_play($data_system.cancel_se)      
  232.      # 切换到菜单画面
  233.      $scene = Scene_Menu.new(0)
  234.      return
  235.    end
  236.    # 按下 C 键的情况下
  237.    if Input.trigger?(Input::C)
  238.      # 获取物品窗口当前选中的物品数据
  239.      @item = @item_window.item
  240.      # 不使用物品的情况下
  241.      unless @item.is_a?(RPG::Item)
  242.        # 演奏冻结 SE
  243.        $game_system.se_play($data_system.buzzer_se)
  244.        return
  245.      end
  246.      # 不能使用的情况下
  247.      unless $game_party.item_can_use?(@item.id)
  248.        # 演奏冻结 SE
  249.        $game_system.se_play($data_system.buzzer_se)
  250.        return
  251.      end
  252.      # 演奏确定 SE
  253.      $game_system.se_play($data_system.decision_se)
  254.      # 效果范围是我方的情况下
  255.      if @item.scope >= 3
  256.        # 激活目标窗口
  257.        @item_window.active = false
  258.        @target_window.x = (@item_window.index + 1) % 2 * 304
  259.        @target_window.visible = true
  260.        # 设置效果范围 (单体/全体) 的对应光标位置
  261.        if @item.scope == 4 || @item.scope == 6
  262.          @target_window.index = -1
  263.        else
  264.          @target_window.index = 0
  265.        end
  266.        for i in 1 .. $speed
  267.          @target_window.y += 480 / $speed
  268.          Graphics.update
  269.        end
  270.        Audio.se_play(Ini_efect, 100, 0)
  271.        elasticity (@target_window)
  272.        @target_window.active = true
  273.      # 效果在我方以外的情况下
  274.      else
  275.        # 公共事件 ID 有效的情况下
  276.        if @item.common_event_id > 0
  277.          # 预约调用公共事件
  278.          $game_temp.common_event_id = @item.common_event_id
  279.          # 演奏物品使用时的 SE
  280.          $game_system.se_play(@item.menu_se)
  281.          # 消耗品的情况下
  282.          if @item.consumable
  283.            # 使用的物品数减 1
  284.            $game_party.lose_item(@item.id, 1)
  285.            # 再描绘物品窗口的项目
  286.            @item_window.draw_item(@item_window.index)
  287.          end
  288.          Audio.se_play(Dispose_effect, 100, 100)
  289.          for i in 1 .. $speed
  290.            @help_window.y -= 64 / $speed
  291.            @item_window.y += 418 / $speed
  292.            Graphics.update
  293.          end           
  294.          # 切换到地图画面
  295.          $scene = Scene_Map.new
  296.          return
  297.        end
  298.      end
  299.      return
  300.    end
  301. end
  302. #--------------------------------------------------------------------------
  303. # ● 刷新画面 (目标窗口被激活的情况下)
  304. #--------------------------------------------------------------------------
  305. def update_target
  306.    # 按下 B 键的情况下
  307.    if Input.trigger?(Input::B)
  308.      # 演奏取消 SE
  309.      $game_system.se_play($data_system.cancel_se)
  310.      # 由于物品用完而不能使用的场合
  311.      unless $game_party.item_can_use?(@item.id)
  312.        # 再次生成物品窗口的内容
  313.        @item_window.refresh
  314.      end
  315.      Audio.se_play(Dispose_effect, 100, 100)      
  316.      for i in 1 .. $speed
  317.        @target_window.y -= 480 / $speed
  318.        Graphics.update
  319.      end      
  320.      # 删除目标窗口
  321.      @item_window.active = true
  322.      @target_window.visible = false
  323.      @target_window.active = false
  324.      return
  325.    end
  326.    # 按下 C 键的情况下
  327.    if Input.trigger?(Input::C)
  328.      # 如果物品用完的情况下
  329.      if $game_party.item_number(@item.id) == 0
  330.        # 演奏冻结 SE
  331.        $game_system.se_play($data_system.buzzer_se)
  332.        return
  333.      end
  334.      # 目标是全体的情况下
  335.      if @target_window.index == -1
  336.        # 对同伴全体应用物品使用效果
  337.        used = false
  338.        for i in $game_party.actors
  339.          used |= i.item_effect(@item)
  340.        end
  341.      end
  342.      # 目标是单体的情况下
  343.      if @target_window.index >= 0
  344.        # 对目标角色应用物品的使用效果
  345.        target = $game_party.actors[@target_window.index]
  346.        used = target.item_effect(@item)
  347.      end
  348.      # 使用物品的情况下
  349.      if used
  350.        # 演奏物品使用时的 SE
  351.        $game_system.se_play(@item.menu_se)
  352.        # 消耗品的情况下
  353.        if @item.consumable
  354.          # 使用的物品数减 1
  355.          $game_party.lose_item(@item.id, 1)
  356.          # 再描绘物品窗口的项目
  357.          @item_window.draw_item(@item_window.index)
  358.        end
  359.        # 再生成目标窗口的内容
  360.        @target_window.refresh
  361.        # 全灭的情况下
  362.        if $game_party.all_dead?
  363.          # 切换到游戏结束画面
  364.          $scene = Scene_Gameover.new
  365.          return
  366.        end
  367.        # 公共事件 ID 有效的情况下
  368.        if @item.common_event_id > 0
  369.          # 预约调用公共事件
  370.          $game_temp.common_event_id = @item.common_event_id
  371.          # 切换到地图画面
  372.          $scene = Scene_Map.new
  373.          return
  374.        end
  375.      end
  376.      # 无法使用物品的情况下
  377.      unless used
  378.        # 演奏冻结 SE
  379.        $game_system.se_play($data_system.buzzer_se)
  380.      end
  381.      return
  382.    end
  383. end
  384. end
  385. #==============================================================================
  386. # ■ Scene_Skill
  387. #------------------------------------------------------------------------------
  388. #  处理特技画面的类。
  389. #==============================================================================

  390. class Scene_Skill
  391. include Warcraftization
  392. #--------------------------------------------------------------------------
  393. # ● 主处理
  394. #--------------------------------------------------------------------------
  395. def main
  396.    speed
  397.    # 获取角色
  398.    @actor = $game_party.actors[@actor_index]
  399.    # 生成帮助窗口、状态窗口、特技窗口
  400.    @help_window = Window_Help.new
  401.    @help_window.y = -64   
  402.    @status_window = Window_SkillStatus.new(@actor)
  403.    @status_window.y = - 64
  404.    @skill_window = Window_Skill.new(@actor)
  405.    @skill_window.y = -352
  406.    # 关联帮助窗口
  407.    @skill_window.help_window = @help_window
  408.    # 生成目标窗口 (设置为不可见?不活动)
  409.    @target_window = Window_Target.new
  410.    @target_window.y = -480
  411.    @target_window.visible = false
  412.    @target_window.active = false
  413.    # 执行过渡
  414.    Graphics.transition
  415.    for i in 1 .. $speed
  416.      @help_window.y += 64 / $speed
  417.      @status_window.y += 128 / $speed
  418.      @skill_window.y += 480 / $speed
  419.      Graphics.update
  420.    end
  421.    Audio.se_play(Ini_efect, 100, 0)
  422.    elasticity (@skill_window)
  423.    # 主循环
  424.    loop do
  425.      # 刷新游戏画面
  426.      Graphics.update
  427.      # 刷新输入信息
  428.      Input.update
  429.      # 刷新画面
  430.      update
  431.      # 如果画面切换的话就中断循环
  432.      if $scene != self
  433.        break
  434.      end
  435.    end
  436.    Audio.se_play(Dispose_effect, 100, 100)
  437.    for i in 1 .. $speed
  438.      @help_window.y -= 64 / $speed
  439.      @status_window.y -= 128 / $speed
  440.      @skill_window.y -= 480 / $speed
  441.      @target_window.y -= 480 / $speed
  442.      Graphics.update
  443.    end
  444.    # 准备过渡
  445.    Graphics.freeze
  446.    # 释放窗口
  447.    @help_window.dispose
  448.    @status_window.dispose
  449.    @skill_window.dispose
  450.    @target_window.dispose
  451. end
  452. #--------------------------------------------------------------------------
  453. # ● 刷新画面 (特技窗口被激活的情况下)
  454. #--------------------------------------------------------------------------
  455. def update_skill
  456.    # 按下 B 键的情况下
  457.    if Input.trigger?(Input::B)
  458.      # 演奏取消 SE
  459.      $game_system.se_play($data_system.cancel_se)
  460.      # 切换到菜单画面
  461.      $scene = Scene_Menu.new(1)
  462.      return
  463.    end
  464.    # 按下 C 键的情况下
  465.    if Input.trigger?(Input::C)
  466.      # 获取特技窗口现在选择的特技的数据
  467.      @skill = @skill_window.skill
  468.      # 不能使用的情况下
  469.      if @skill == nil or not @actor.skill_can_use?(@skill.id)
  470.        # 演奏冻结 SE
  471.        $game_system.se_play($data_system.buzzer_se)
  472.        return
  473.      end
  474.      # 演奏确定 SE
  475.      $game_system.se_play($data_system.decision_se)
  476.      # 效果范围是我方的情况下
  477.      if @skill.scope >= 3
  478.        # 激活目标窗口
  479.        @skill_window.active = false
  480.        @target_window.x = (@skill_window.index + 1) % 2 * 304
  481.        @target_window.visible = true
  482.        # 设置效果范围 (单体/全体) 的对应光标位置
  483.        if @skill.scope == 4 || @skill.scope == 6
  484.          @target_window.index = -1
  485.        elsif @skill.scope == 7
  486.          @target_window.index = @actor_index - 10
  487.        else
  488.          @target_window.index = 0
  489.        end
  490.        for i in 1 .. $speed
  491.          @target_window.y += 480 / $speed
  492.          Graphics.update
  493.        end
  494.        Audio.se_play(Ini_efect, 100, 0)
  495.        elasticity (@target_window)
  496.        @target_window.active = true
  497.      # 效果在我方以外的情况下
  498.      else
  499.        # 公共事件 ID 有效的情况下
  500.        if @skill.common_event_id > 0
  501.          # 预约调用公共事件
  502.          $game_temp.common_event_id = @skill.common_event_id
  503.          # 演奏特技使用时的 SE
  504.          $game_system.se_play(@skill.menu_se)
  505.          # 消耗 SP
  506.          @actor.sp -= @skill.sp_cost
  507.          # 再生成各窗口的内容
  508.          @status_window.refresh
  509.          @skill_window.refresh
  510.          @target_window.refresh
  511.          # 切换到地图画面
  512.          $scene = Scene_Map.new
  513.          return
  514.        end
  515.      end
  516.      return
  517.    end
  518.    # 按下 R 键的情况下
  519.    if Input.trigger?(Input::R)
  520.      # 演奏光标 SE
  521.      $game_system.se_play($data_system.cursor_se)
  522.      # 移至下一位角色
  523.      @actor_index += 1
  524.      @actor_index %= $game_party.actors.size
  525.      # 切换到别的特技画面
  526.      $scene = Scene_Skill.new(@actor_index)
  527.      return
  528.    end
  529.    # 按下 L 键的情况下
  530.    if Input.trigger?(Input::L)
  531.      # 演奏光标 SE
  532.      $game_system.se_play($data_system.cursor_se)
  533.      # 移至上一位角色
  534.      @actor_index += $game_party.actors.size - 1
  535.      @actor_index %= $game_party.actors.size
  536.      # 切换到别的特技画面
  537.      $scene = Scene_Skill.new(@actor_index)
  538.      return
  539.    end
  540. end
  541. #--------------------------------------------------------------------------
  542. # ● 刷新画面 (目标窗口被激活的情况下)
  543. #--------------------------------------------------------------------------
  544. def update_target
  545.    # 按下 B 键的情况下
  546.    if Input.trigger?(Input::B)
  547.      # 演奏取消 SE
  548.      $game_system.se_play($data_system.cancel_se)
  549.      Audio.se_play(Dispose_effect, 100, 100)      
  550.      for i in 1 .. $speed
  551.        @target_window.y -= 480 / $speed
  552.        Graphics.update
  553.      end      
  554.      # 删除目标窗口
  555.      @skill_window.active = true
  556.      @target_window.visible = false
  557.      @target_window.active = false
  558.      return
  559.    end
  560.    # 按下 C 键的情况下
  561.    if Input.trigger?(Input::C)
  562.      # 因为 SP 不足而无法使用的情况下
  563.      unless @actor.skill_can_use?(@skill.id)
  564.        # 演奏冻结 SE
  565.        $game_system.se_play($data_system.buzzer_se)
  566.        return
  567.      end
  568.      # 目标是全体的情况下
  569.      if @target_window.index == -1
  570.        # 对同伴全体应用特技使用效果
  571.        used = false
  572.        for i in $game_party.actors
  573.          used |= i.skill_effect(@actor, @skill)
  574.        end
  575.      end
  576.      # 目标是使用者的情况下
  577.      if @target_window.index <= -2
  578.        # 对目标角色应用特技的使用效果
  579.        target = $game_party.actors[@target_window.index + 10]
  580.        used = target.skill_effect(@actor, @skill)
  581.      end
  582.      # 目标是单体的情况下
  583.      if @target_window.index >= 0
  584.        # 对目标角色应用特技的使用效果
  585.        target = $game_party.actors[@target_window.index]
  586.        used = target.skill_effect(@actor, @skill)
  587.      end
  588.      # 使用特技的情况下
  589.      if used
  590.        # 演奏特技使用时的 SE
  591.        $game_system.se_play(@skill.menu_se)
  592.        # 消耗 SP
  593.        @actor.sp -= @skill.sp_cost
  594.        # 再生成各窗口内容
  595.        @status_window.refresh
  596.        @skill_window.refresh
  597.        @target_window.refresh
  598.        # 全灭的情况下
  599.        if $game_party.all_dead?
  600.          # 切换到游戏结束画面
  601.          $scene = Scene_Gameover.new
  602.          return
  603.        end
  604.        # 公共事件 ID 有效的情况下
  605.        if @skill.common_event_id > 0
  606.          # 预约调用公共事件
  607.          $game_temp.common_event_id = @skill.common_event_id
  608.          # 切换到地图画面
  609.          $scene = Scene_Map.new
  610.          return
  611.        end
  612.      end
  613.      # 无法使用特技的情况下
  614.      unless used
  615.        # 演奏冻结 SE
  616.        $game_system.se_play($data_system.buzzer_se)
  617.      end
  618.      return
  619.    end
  620. end
  621. end
  622. #==============================================================================
  623. # ■ Scene_Equip
  624. #------------------------------------------------------------------------------
  625. #  处理装备画面的类。
  626. #==============================================================================

  627. class Scene_Equip
  628. include Warcraftization
  629. #--------------------------------------------------------------------------
  630. # ● 主处理
  631. #--------------------------------------------------------------------------
  632. def main
  633.    speed
  634.    # 获取角色
  635.    @actor = $game_party.actors[@actor_index]
  636.    # 生成窗口
  637.    @help_window = Window_Help.new
  638.    @help_window.y = -64
  639.    @left_window = Window_EquipLeft.new(@actor)
  640.    @left_window.y = -192
  641.    @right_window = Window_EquipRight.new(@actor)
  642.    @right_window.y = -192
  643.    @item_window1 = Window_EquipItem.new(@actor, 0)
  644.    @item_window1.y = -224
  645.    @item_window2 = Window_EquipItem.new(@actor, 1)
  646.    @item_window2.y = -224
  647.    @item_window3 = Window_EquipItem.new(@actor, 2)
  648.    @item_window3.y = -224
  649.    @item_window4 = Window_EquipItem.new(@actor, 3)
  650.    @item_window4.y = -224
  651.    @item_window5 = Window_EquipItem.new(@actor, 4)
  652.    @item_window5.y = -224
  653.    # 关联帮助窗口
  654.    @right_window.help_window = @help_window
  655.    @item_window1.help_window = @help_window
  656.    @item_window2.help_window = @help_window
  657.    @item_window3.help_window = @help_window
  658.    @item_window4.help_window = @help_window
  659.    @item_window5.help_window = @help_window
  660.    # 设置光标位置
  661.    @right_window.index = @equip_index
  662.    refresh
  663.    # 执行过渡
  664.    Graphics.transition
  665.    for i in 1 .. $speed
  666.      @help_window.y += 64 / $speed
  667.      @left_window.y += 256 / $speed
  668.      @right_window.y += 256 / $speed
  669.      @item_window1.y += 480 / $speed
  670.      @item_window2.y += 480 / $speed
  671.      @item_window3.y += 480 / $speed
  672.      @item_window4.y += 480 / $speed
  673.      @item_window5.y += 480 / $speed
  674.      Graphics.update
  675.    end
  676.    Audio.se_play(Ini_efect, 100, 0)
  677.    elasticity (@item_window)
  678.    # 主循环
  679.    loop do
  680.      # 刷新游戏画面
  681.      Graphics.update
  682.      # 刷新输入信息
  683.      Input.update
  684.      # 刷新画面
  685.      update
  686.      # 如果画面切换的话的就中断循环
  687.      if $scene != self
  688.        break
  689.      end
  690.    end
  691.    Audio.se_play(Dispose_effect, 100, 100)
  692.    for i in 1 .. $speed
  693.      @help_window.y -= 64 / $speed
  694.      @left_window.y -= 256 / $speed
  695.      @right_window.y -= 256 / $speed
  696.      @item_window1.y -= 480 / $speed
  697.      @item_window2.y -= 480 / $speed
  698.      @item_window3.y -= 480 / $speed
  699.      @item_window4.y -= 480 / $speed
  700.      @item_window5.y -= 480 / $speed
  701.      Graphics.update
  702.    end   
  703.    # 准备过渡
  704.    Graphics.freeze
  705.    # 释放窗口
  706.    @help_window.dispose
  707.    @left_window.dispose
  708.    @right_window.dispose
  709.    @item_window1.dispose
  710.    @item_window2.dispose
  711.    @item_window3.dispose
  712.    @item_window4.dispose
  713.    @item_window5.dispose
  714. end  
  715. end
  716. #==============================================================================
  717. # ■ Scene_Status
  718. #------------------------------------------------------------------------------
  719. #  处理状态画面的类。
  720. #==============================================================================

  721. class Scene_Status
  722. include Warcraftization
  723. #--------------------------------------------------------------------------
  724. # ● 初始化对像
  725. #     actor_index : 角色索引
  726. #--------------------------------------------------------------------------
  727. def initialize(actor_index = 0, equip_index = 0)
  728.    @actor_index = actor_index
  729. end
  730. #--------------------------------------------------------------------------
  731. # ● 主处理
  732. #--------------------------------------------------------------------------
  733. def main
  734.    speed
  735.    # 获取角色
  736.    @actor = $game_party.actors[@actor_index]
  737.    # 生成状态窗口
  738.    @status_window = Window_Status.new(@actor)
  739.    @status_window.y = -480
  740.    # 执行过渡
  741.    Graphics.transition
  742.    for i in 1 .. $speed
  743.      @status_window.y += 480 / $speed
  744.      Graphics.update
  745.    end
  746.    Audio.se_play(Ini_efect, 100, 0)
  747.    elasticity (@status_window)   
  748.    # 主循环
  749.    loop do
  750.      # 刷新游戏画面
  751.      Graphics.update
  752.      # 刷新输入信息
  753.      Input.update
  754.      # 刷新画面
  755.      update
  756.      # 如果画面被切换的话就中断循环
  757.      if $scene != self
  758.        break
  759.      end
  760.    end
  761.    Audio.se_play(Dispose_effect, 100, 100)   
  762.    for i in 1 .. $speed
  763.      @status_window.y -= 480 / $speed
  764.      Graphics.update
  765.    end   
  766.    # 准备过渡
  767.    Graphics.freeze
  768.    # 释放窗口
  769.    @status_window.dispose
  770. end
  771. end
  772. #==============================================================================
  773. # ■ Scene_File
  774. #------------------------------------------------------------------------------
  775. #  存档画面及读档画面的超级类。
  776. #==============================================================================

  777. class Scene_File
  778. include Warcraftization
  779. #--------------------------------------------------------------------------
  780. # ● 主处理
  781. #--------------------------------------------------------------------------
  782. def main
  783.    speed
  784.    # 生成帮助窗口
  785.    @help_window = Window_Help.new
  786.    @help_window.y = -64
  787.    @help_window.set_text(@help_text)
  788.    # 生成存档文件查
  789.    @savefile_windows = []
  790.    for i in 0..3
  791.      @savefile_windows.push(Window_SaveFile.new(i, make_filename(i)))
  792.      @savefile_windows[i].y = -104
  793.    end
  794.    # 选择最后操作的文件
  795.    @file_index = $game_temp.last_file_index
  796.    @savefile_windows[@file_index].selected = true
  797.    # 执行过渡
  798.    Graphics.transition
  799.    for i in 1 .. 8
  800.      @help_window.y += 8
  801.      @savefile_windows[0].y += 21
  802.      @savefile_windows[1].y += 34
  803.      @savefile_windows[2].y += 47
  804.      @savefile_windows[3].y += 60
  805.      Graphics.update
  806.    end
  807.    Audio.se_play(Ini_efect, 100, 0)
  808.    elasticity (@savefile_windows[@file_index])
  809.    # 主循环
  810.    loop do
  811.      # 刷新游戏画面
  812.      Graphics.update
  813.      # 刷新输入信息
  814.      Input.update
  815.      # 刷新画面
  816.      update
  817.      # 如果画面被切换的话就中断循环
  818.      if $scene != self
  819.        break
  820.      end
  821.    end
  822.    Audio.se_play(Dispose_effect, 100, 100)
  823.    for i in 1 .. 8
  824.      @help_window.y -= 8
  825.      @savefile_windows[0].y -= 21
  826.      @savefile_windows[1].y -= 34
  827.      @savefile_windows[2].y -= 47
  828.      @savefile_windows[3].y -= 60
  829.      Graphics.update
  830.    end   
  831.    # 准备过渡
  832.    Graphics.freeze
  833.    # 释放窗口
  834.    @help_window.dispose
  835.    for i in @savefile_windows
  836.      i.dispose
  837.    end
  838. end
  839. end
复制代码
请高手慢慢研究
作者: 禾西    时间: 2010-12-6 16:11
把窗口移動寫成方法
作者: 苏小脉    时间: 2010-12-6 21:22
沙发楼那个是我 N 年前写的处女脚本,献丑了……

总之就是:
更新窗口坐标
调用 Graphics.update
循环以上




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