设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 844|回复: 4
打印 上一主题 下一主题

[已经过期] 箭头输入挑战脚本,不知道怎么触发。。。

[复制链接]

Lv2.观梦者

梦石
0
星屑
428
在线时间
50 小时
注册时间
2017-1-10
帖子
28
跳转到指定楼层
1
发表于 2018-6-28 12:05:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
看到一个不错的东西,输入箭头挑战,但是不知道怎么在大地图中触发


这是原地址貌似
https://atelierrgss.wordpress.com/rgss3-chain-commands-m/

大地图版,下面是战斗中的,技能备注了没用。。。求大神帮忙


RUBY 代码复制
  1. #===============================================================================
  2. # +++ MOG - 输入挑战 (v1.4) +++
  3. #===============================================================================
  4. # By Moghunter                                                               
  5. # [url]https://atelierrgss.wordpress.com/[/url]                  
  6. #===============================================================================
  7. # 输入挑战成功时开启开关
  8. #
  9. # 需要以下图片. (Graphics/System)
  10. #
  11. # Chain_Cursor.png
  12. # Chain_Command.png
  13. # Chain_Layout.png
  14. # Chain_Timer_Layout.png
  15. # Chain_Timer_Meter.png
  16. #
  17. #===============================================================================
  18. #
  19. # 使用脚本来显示输入挑战画面.  
  20. #
  21. # chain_commands(挑战ID)
  22. #
  23. #===============================================================================
  24.  
  25. #==============================================================================
  26. # ● Histórico (Version History)
  27. #==============================================================================
  28. # v 1.4 - Correção do crash aleatório.
  29. # v 1.3 - Melhoria no sistema de dispose
  30. # v 1.2 - Melhoria na codificação e correção de alguns glitches.
  31. # v 1.1 - Animação de fade ao sair da cena de chain.
  32. #       - Opção de definir a prioridade da hud na tela.
  33. #==============================================================================
  34.  
  35. module MOG_CHAIN_COMMANDS
  36. #==============================================================================
  37. # CHAIN_COMMAND = { 挑战ID => [指令] }
  38. #
  39. # 挑战ID = 挑战的ID,同时也是开启开关的ID,当挑战成功时,该ID的开关也会被开启。
  40. # 指令 = 按键顺序.
  41. #        (下面是全部可用的指令)   
  42. #  
  43. # "Down" ,"Up" ,"Left" ,"Right" ,"Shift" ,"D" ,"S" ,"A" ,"Z" ,"X" ,"Q" ,"W"
  44. #
  45. # 例子:
  46. #
  47. # CHAIN_SWITCH_COMMAND = {
  48. # 25=>["Down","D","S","Right"],
  49. # 59=>["Down","Up","Left","Right","Shift","D","S","A","Z","X","Q","W"],
  50. # 80=>["Shift","D"]
  51. # }
  52. #==============================================================================
  53. CHAIN_SWITCH_COMMAND = {
  54. 5=>["X","Right","Left","Z","Z"],
  55. 6=>["Left","Right","Left","Right","Left","Right","Q","Z","Up","A","S",
  56.       "Down","D","Z","Right","Up","Up","Z","W","Left","Down","D","A","W"],
  57. 8=>["Up","Down","Left","Right","Z"]
  58. }
  59. #输入时间. (单位为帧) *60帧 = 1秒
  60. CHAIN_INPUT_DURATION = 30
  61. #输入正确时播放的音效.
  62. CHAIN_RIGHT_SE = "Chime1"
  63. #输入错误时播放的音效.
  64. CHAIN_WRONG_SE = "Buzzer1"
  65. #全部自动正确输入的开关
  66. CHAIN_AUTOMATIC_MODE_SWITCH_ID = 19
  67. #输入挑战图片的Z坐标
  68. CHAIN_HUD_Z = 300
  69. end
  70.  
  71.  
  72. #===============================================================================
  73. # ■ Chain Commands
  74. #===============================================================================
  75. class Chain_Commands
  76.    include MOG_CHAIN_COMMANDS
  77. #--------------------------------------------------------------------------
  78. # ● Initialize
  79. #--------------------------------------------------------------------------      
  80.   def initialize
  81.       @action_id = $game_temp.chain_switch_id
  82.       @chain_command = CHAIN_SWITCH_COMMAND[@action_id]
  83.       @chain_command = ["?"] if @chain_command == nil  
  84.       duration = [[CHAIN_INPUT_DURATION, 1].max, 9999].min
  85.       @timer_max = duration * @chain_command.size
  86.       @timer = @timer_max
  87.       @slide_time = [[60 / duration, 10].max, 60].min
  88.       @change_time = 0
  89.       if $game_switches[CHAIN_AUTOMATIC_MODE_SWITCH_ID]
  90.          @auto = true
  91.       else
  92.          @auto = false
  93.       end
  94.       @com = 0  
  95.   end   
  96.  
  97. #--------------------------------------------------------------------------
  98. # ● Main
  99. #--------------------------------------------------------------------------     
  100. def main
  101.      dispose
  102.      @background_sprite = Sprite.new
  103.      @background_sprite.bitmap = SceneManager.background_bitmap2
  104.      create_chain_command
  105.      create_cusrsor
  106.      create_layout
  107.      create_meter
  108.      create_text
  109.      create_number
  110.      Graphics.transition
  111.      loop do
  112.           Graphics.update
  113.            Input.update
  114.            update
  115.            break if SceneManager.scene != self
  116.      end
  117.      dispose
  118. end  
  119.  
  120. #--------------------------------------------------------------------------
  121. # ● Create Cursor
  122. #--------------------------------------------------------------------------            
  123. def create_cusrsor
  124.      @fy_time = 0
  125.      @fy = 0
  126.      @com_index = 0
  127.      @cursor = Sprite.new
  128.      @cursor.bitmap = Cache.system("Chain_Cursor")
  129.      @cursor.z = 4 + CHAIN_HUD_Z
  130.      @cursor_space = ((@bitmap_cw + 5) * @chain_command.size) / 2
  131.      if @chain_command.size <= 20
  132.         @cursor.x = (544 / 2) - @cursor_space + @cursor_space * @com_index
  133.      else   
  134.         @cursor.x = (544 / 2)
  135.      end  
  136.      @cursor.y = (416 / 2) + 30   
  137. end
  138.  
  139. #--------------------------------------------------------------------------
  140. # ● Create Chain Command
  141. #--------------------------------------------------------------------------      
  142. def create_chain_command
  143.      @image = Cache.system("Chain_Command")     
  144.      width_max = ((@image.width / 13) + 5) * @chain_command.size
  145.      @bitmap = Bitmap.new(width_max,@image.height * 2)
  146.      @bitmap_cw = @image.width / 13
  147.      @bitmap_ch = @image.height  
  148.      index = 0
  149.      for i in @chain_command
  150.          command_list_check(i)
  151.          bitmap_src_rect = Rect.new(@com * @bitmap_cw, 0, @bitmap_cw, @bitmap_ch)
  152.          if index == 0
  153.             @bitmap.blt(index * (@bitmap_cw + 5) , 0, @image, bitmap_src_rect)
  154.          else
  155.             @bitmap.blt(index * (@bitmap_cw + 5) , @bitmap_ch, @image, bitmap_src_rect)
  156.          end
  157.          index += 1
  158.      end
  159.      @sprite = Sprite.new
  160.      @sprite.bitmap = @bitmap
  161.      if @chain_command.size <= 15
  162.         @sprite.x = (544 / 2) - ((@bitmap_cw + 5) * @chain_command.size) / 2
  163.         @new_x = 0
  164.      else   
  165.         @sprite.x = (544 / 2)
  166.         @new_x = @sprite.x
  167.      end   
  168.      @sprite.y = (416 / 2) + 30  - @bitmap_ch  - 15
  169.      @sprite.z = 3 + CHAIN_HUD_Z
  170.      @sprite.zoom_x = 1.5
  171.      @sprite.zoom_y = 1.5
  172. end
  173.  
  174. #--------------------------------------------------------------------------
  175. # * create_layout
  176. #--------------------------------------------------------------------------  
  177. def create_layout
  178.      @back = Plane.new
  179.      @back.bitmap = Cache.system("Chain_Layout")
  180.      @back.z = 0
  181.      @layout = Sprite.new
  182.      @layout.bitmap = Cache.system("Chain_Timer_Layout")
  183.      @layout.z = 1 + CHAIN_HUD_Z
  184.      @layout.x = 160
  185.      @layout.y = 150
  186.   end
  187.  
  188. #--------------------------------------------------------------------------
  189. # * create_meter
  190. #--------------------------------------------------------------------------  
  191. def create_meter
  192.      @meter_flow = 0
  193.      @meter_image = Cache.system("Chain_Timer_Meter")
  194.      @meter_bitmap = Bitmap.new(@meter_image.width,@meter_image.height)
  195.      @meter_range = @meter_image.width / 3
  196.      @meter_width = @meter_range * @timer / @timer_max
  197.      @meter_height = @meter_image.height
  198.      @meter_src_rect = Rect.new(@meter_range, 0, @meter_width, @meter_height)
  199.      @meter_bitmap.blt(0,0, @meter_image, @meter_src_rect)
  200.      @meter_sprite = Sprite.new
  201.      @meter_sprite.bitmap = @meter_bitmap
  202.      @meter_sprite.z = 2 + CHAIN_HUD_Z
  203.      @meter_sprite.x = 220
  204.      @meter_sprite.y = 159
  205.      update_flow
  206. end  
  207.  
  208. #--------------------------------------------------------------------------
  209. # ● Create Text
  210. #--------------------------------------------------------------------------        
  211. def create_text
  212.      @text = Sprite.new
  213.      @text.bitmap = Bitmap.new(200,32)
  214.      @text.z = 2 + CHAIN_HUD_Z
  215.      @text.bitmap.font.name = "Georgia"
  216.      @text.bitmap.font.size = 25
  217.      @text.bitmap.font.bold = true
  218.      @text.bitmap.font.italic = true
  219.      @text.bitmap.font.color.set(255, 255, 255,220)
  220.      @text.x = 230
  221.      @text.y = 100
  222. end
  223.  
  224. #--------------------------------------------------------------------------
  225. # ● Create Number
  226. #--------------------------------------------------------------------------        
  227. def create_number
  228.      @combo = 0
  229.      @number = Sprite.new
  230.      @number.bitmap = Bitmap.new(200,64)
  231.      @number.z = 2 + CHAIN_HUD_Z
  232.      @number.bitmap.font.name = "Arial"
  233.      @number.bitmap.font.size = 24
  234.      @number.bitmap.font.bold = true
  235.      @number.bitmap.font.color.set(0, 255, 255,200)
  236.      @number.bitmap.draw_text(0, 0, 200, 32, "准备",1)         
  237.      @number.x = 30
  238.      @number.y = 100
  239. end
  240.  
  241. #--------------------------------------------------------------------------
  242. # ● Pre Dispose
  243. #--------------------------------------------------------------------------      
  244. def exit
  245.      loop do
  246.          Graphics.update
  247.          @sprite.x += 5
  248.          @layout.x -= 5
  249.          @meter_sprite.x -= 5
  250.          @text.x -= 2
  251.          @text.opacity -= 5
  252.          @sprite.opacity -= 5
  253.          @layout.opacity -= 5
  254.          @meter_sprite.opacity -= 5
  255.          @number.opacity -= 5
  256.          @back.opacity -= 5
  257.          @cursor.visible = false   
  258.          break if @sprite.opacity == 0
  259.      end
  260.      SceneManager.call(Scene_Map)
  261. end
  262.  
  263. #--------------------------------------------------------------------------
  264. # ● Dispose
  265. #--------------------------------------------------------------------------      
  266. def dispose
  267.      return if @layout == nil
  268.      Graphics.freeze
  269.      @background_sprite.bitmap.dispose
  270.      @background_sprite.dispose
  271.      @bitmap.dispose
  272.      @sprite.bitmap.dispose
  273.      @sprite.dispose
  274.      @cursor.bitmap.dispose
  275.      @cursor.dispose  
  276.      @meter_image.dispose
  277.      @meter_bitmap.dispose
  278.      @meter_sprite.bitmap.dispose
  279.      @meter_sprite.dispose
  280.      @layout.bitmap.dispose  
  281.      @layout.dispose
  282.      @layout = nil
  283.      @back.bitmap.dispose
  284.      @back.dispose
  285.      @text.bitmap.dispose
  286.      @text.dispose
  287.      @number.bitmap.dispose
  288.      @number.dispose
  289.      @image.dispose
  290. end
  291.  
  292. #--------------------------------------------------------------------------
  293. # ● Update
  294. #--------------------------------------------------------------------------      
  295. def update
  296.      update_command
  297.      update_cursor_slide
  298.      update_flow
  299.      update_change_time
  300. end
  301.  
  302. #--------------------------------------------------------------------------
  303. # ● Change_Time
  304. #--------------------------------------------------------------------------        
  305. def update_change_time
  306.      return unless @auto
  307.      @change_time += 1
  308.      check_command(-1) if @change_time >= CHAIN_INPUT_DURATION - 1
  309. end
  310.  
  311. #--------------------------------------------------------------------------
  312. # ● Update Flow
  313. #--------------------------------------------------------------------------      
  314. def update_flow
  315.      @timer -= 1
  316.      @meter_sprite.bitmap.clear
  317.      @meter_width = @meter_range * @timer / @timer_max
  318.      @meter_src_rect = Rect.new(@meter_flow, 0, @meter_width, @meter_height)
  319.      @meter_bitmap.blt(0,0, @meter_image, @meter_src_rect)  
  320.      @meter_flow += 20
  321.      @meter_flow = 0 if @meter_flow >= @meter_image.width - @meter_range      
  322.      wrong_command if @timer == 0 and @auto == false
  323.   end  
  324.  
  325. #--------------------------------------------------------------------------
  326. # ● Update Command
  327. #--------------------------------------------------------------------------      
  328. def update_command
  329.      return if @auto
  330.      if Input.trigger?(Input::X)
  331.         check_command(0)
  332.      elsif Input.trigger?(Input::Z)  
  333.         check_command(1)
  334.      elsif Input.trigger?(Input::Y)  
  335.         check_command(2)
  336.      elsif Input.trigger?(Input::A)   
  337.         check_command(3)
  338.      elsif Input.trigger?(Input::C)           
  339.         check_command(4)
  340.      elsif Input.trigger?(Input::B)        
  341.         check_command(5)
  342.      elsif Input.trigger?(Input::L)        
  343.         check_command(6)
  344.      elsif Input.trigger?(Input::R)        
  345.         check_command(7)        
  346.      elsif Input.trigger?(Input::RIGHT)      
  347.         check_command(8)
  348.      elsif Input.trigger?(Input::LEFT)
  349.         check_command(9)
  350.      elsif Input.trigger?(Input::DOWN)
  351.         check_command(10)
  352.      elsif Input.trigger?(Input::UP)  
  353.         check_command(11)
  354.      end   
  355. end  
  356.  
  357. #--------------------------------------------------------------------------
  358. # ● command_list_check
  359. #--------------------------------------------------------------------------      
  360. def command_list_check(command)
  361.      case command
  362.          when "A"
  363.             @com = 0  
  364.          when "D"
  365.             @com = 1  
  366.          when "S"
  367.             @com = 2
  368.          when "Shift"
  369.             @com = 3
  370.          when "Z"
  371.             @com = 4
  372.          when "X"
  373.             @com = 5
  374.          when "Q"
  375.             @com = 6
  376.          when "W"
  377.             @com = 7            
  378.          when "Right"
  379.             @com = 8
  380.          when "Left"
  381.             @com = 9
  382.          when "Down"
  383.             @com = 10
  384.          when "Up"  
  385.             @com = 11
  386.          else   
  387.             @com = 12           
  388.      end
  389. end   
  390.  
  391. #--------------------------------------------------------------------------
  392. # ● check_command
  393. #--------------------------------------------------------------------------            
  394. def check_command(com)
  395.      index = 0
  396.      if com != -1
  397.         right_input = false
  398.         for i in @chain_command
  399.            if index == @com_index
  400.               command_list_check(i)
  401.               right_input = true if @com == com
  402.            end  
  403.           index += 1  
  404.        end  
  405.      else  
  406.        command_list_check(@com_index)
  407.        @change_time = 0
  408.        right_input = true
  409.      end  
  410.      if right_input
  411.         refresh_number
  412.         next_command
  413.      else  
  414.         wrong_command
  415.      end  
  416. end  
  417.  
  418. #--------------------------------------------------------------------------
  419. # ● Next Command
  420. #--------------------------------------------------------------------------            
  421. def next_command   
  422.      @com_index += 1   
  423.      Audio.se_play("Audio/SE/" + CHAIN_RIGHT_SE, 100, 100)
  424.      if @com_index == @chain_command.size
  425.         $game_switches[@action_id] = true
  426.         exit
  427.         $game_map.need_refresh = true
  428.      end  
  429.      refresh_command
  430.      refresh_text(0)
  431. end     
  432.  
  433. #--------------------------------------------------------------------------
  434. # ● wrong_command
  435. #--------------------------------------------------------------------------              
  436. def wrong_command
  437.      Audio.se_play("Audio/SE/" + CHAIN_WRONG_SE, 100, 100)
  438.      refresh_text(1)
  439.      exit
  440.      $game_player.jump(0,0)
  441. end
  442.  
  443. #--------------------------------------------------------------------------
  444. # ● Refresh Command
  445. #--------------------------------------------------------------------------               
  446. def refresh_command
  447.      @sprite.bitmap.clear
  448.      index = 0
  449.      for i in @chain_command
  450.          command_list_check(i)
  451.          bitmap_src_rect = Rect.new(@com * @bitmap_cw, 0, @bitmap_cw, @bitmap_ch)
  452.          if @com_index == index
  453.             @bitmap.blt(index * (@bitmap_cw + 5) , 0, @image, bitmap_src_rect)
  454.          else
  455.             @bitmap.blt(index * (@bitmap_cw + 5) , @bitmap_ch, @image, bitmap_src_rect)
  456.          end
  457.          index += 1
  458.        end
  459.      if @chain_command.size > 15  
  460.         @new_x = (544 / 2) - ((@bitmap_cw + 5) * @com_index)
  461.      else   
  462.         @cursor.x = (544 / 2) - @cursor_space + ((@bitmap_cw + 5) * @com_index)
  463.      end
  464. end  
  465.  
  466. #--------------------------------------------------------------------------
  467. # ● Refresh Text
  468. #--------------------------------------------------------------------------               
  469. def refresh_text(type)
  470.      @text.bitmap.clear
  471.      if type == 0
  472.         if @com_index == @chain_command.size
  473.            @text.bitmap.font.color.set(55, 255, 55,220)
  474.            @text.bitmap.draw_text(0, 0, 200, 32, "完美!",1)              
  475.         else  
  476.            @text.bitmap.font.color.set(55, 155, 255,220)
  477.            @text.bitmap.draw_text(0, 0, 200, 32, "成功!",1)              
  478.         end
  479.      else
  480.         @text.bitmap.font.color.set(255, 155, 55,220)
  481.         if @timer == 0
  482.            @text.bitmap.draw_text(0, 0, 200, 32, "时间到!",1)  
  483.         else  
  484.            @text.bitmap.draw_text(0, 0, 200, 32, "失败!",1)   
  485.         end
  486.      end  
  487.      @text.x = 230   
  488.      @text.opacity = 255
  489. end
  490.  
  491. #--------------------------------------------------------------------------
  492. # ● Refresh Number
  493. #--------------------------------------------------------------------------               
  494. def refresh_number
  495.      @combo += 1
  496.      @number.bitmap.clear
  497.      @number.bitmap.font.size = 34
  498.      @number.bitmap.draw_text(0, 0, 200, 32, @combo.to_s,1)         
  499.      @number.opacity = 255
  500.      @number.zoom_x = 2
  501.      @number.zoom_y = 2
  502. end
  503.  
  504. #--------------------------------------------------------------------------
  505. # ● Update Cursor Slide
  506. #--------------------------------------------------------------------------           
  507. def update_cursor_slide   
  508.      @sprite.zoom_x -= 0.1 if @sprite.zoom_x > 1
  509.      @sprite.zoom_y -= 0.1 if @sprite.zoom_y > 1
  510.      @text.x -= 2 if @text.x > 210
  511.      @text.opacity -= 5 if @text.opacity > 0
  512.      @sprite.x -= @slide_time if @sprite.x > @new_x and @chain_command.size > 15
  513.      if @number.zoom_x > 1
  514.         @number.zoom_x -= 0.1
  515.         @number.zoom_y -= 0.1
  516.      end
  517.      if @fy_time > 15
  518.         @fy += 1
  519.      elsif @fy_time > 0
  520.         @fy -= 1
  521.      else   
  522.         @fy = 0
  523.         @fy_time = 30
  524.      end  
  525.      @fy_time -= 1
  526.      @cursor.oy = @fy     
  527. end  
  528. end
  529.  
  530. #==============================================================================
  531. # ■ Game Temp
  532. #==============================================================================
  533. class Game_Temp
  534.  
  535. attr_accessor :chain_switch_id
  536.  
  537. #--------------------------------------------------------------------------
  538. # ● Initialize
  539. #--------------------------------------------------------------------------         
  540.   alias mog_chain_commands_initialize initialize
  541.   def initialize
  542.       @chain_switch_id = 0
  543.       mog_chain_commands_initialize
  544.   end  
  545.  
  546. end
  547.  
  548. #==============================================================================
  549. # ■ Game_Interpreter
  550. #==============================================================================
  551. class Game_Interpreter
  552.  
  553. #--------------------------------------------------------------------------
  554. # ● Chain Commands
  555. #--------------------------------------------------------------------------           
  556.   def chain_commands(switch_id = 0)
  557.       return if switch_id <= 0
  558.       $game_temp.chain_switch_id = switch_id
  559.       SceneManager.call(Chain_Commands)
  560.       wait(1)
  561.   end
  562.  
  563. end
  564.  
  565. #===============================================================================
  566. # ■ SceneManager
  567. #===============================================================================
  568. class << SceneManager
  569.   @background_bitmap2 = nil
  570.  
  571.   #--------------------------------------------------------------------------
  572.   # ● Snapshot For Background2
  573.   #--------------------------------------------------------------------------
  574.   def snapshot_for_background2
  575.       @background_bitmap2.dispose if @background_bitmap2
  576.       @background_bitmap2 = Graphics.snap_to_bitmap
  577.   end
  578.  
  579.   #--------------------------------------------------------------------------
  580.   # ● Background Bitmap2
  581.   #--------------------------------------------------------------------------
  582.   def background_bitmap2
  583.       @background_bitmap2
  584.   end
  585.  
  586. end
  587.  
  588. #===============================================================================
  589. # ■ Scene Map
  590. #===============================================================================
  591. class Scene_Map < Scene_Base
  592.  
  593.   #--------------------------------------------------------------------------
  594.   # ● Terminate
  595.   #--------------------------------------------------------------------------  
  596.   alias mog_chain_commands_terminate terminate
  597.   def terminate
  598.       SceneManager.snapshot_for_background2
  599.       mog_chain_commands_terminate      
  600.   end
  601.  
  602. end  
  603.  
  604. $mog_rgss3_chain_commands = true


RUBY 代码复制
  1. #==============================================================================
  2. # +++ MOG - 战斗输入挑战 (v3.3) +++
  3. #==============================================================================
  4. # By Moghunter
  5. # [url]https://atelierrgss.wordpress.com/[/url]
  6. #==============================================================================
  7. # 在技能发动之前可以设定一个输入挑战,全部输入正确后才能施放技能.
  8. #==============================================================================
  9. # 需要以下图片,放在 Graphics/System/
  10. #
  11. # Chain_Command.png
  12. # Chain_Battle_Layout.png
  13. # Chain_Battle_Meter.png
  14. #
  15. #==============================================================================
  16. # 使用方法
  17. #==============================================================================
  18. # 技能备注:
  19. #
  20. # <Chain Action = X>
  21. #
  22. # X - 技能ID
  23. #==============================================================================
  24.  
  25. #==============================================================================
  26. # ● Histórico (Version History)
  27. #==============================================================================
  28. # v3.3 - Melhoria na compatibilidade com MOG Battle Camera
  29. # v3.2 - Compatibilidade com MOG Sprite Actor.
  30. # v3.1 - Compatibilidade com MOG Battle Camera.
  31. # v3.0 - Adição de comandos aleatórios.
  32. # v2.9 - Correção do bug de não ocultar a janela com MOG ATB.
  33. # v2.8 - Melhoria na codificação.
  34. #==============================================================================
  35.  
  36. $imported = {} if $imported.nil?
  37. $imported[:mog_active_chain] = true
  38.  
  39. module MOG_CHAIN_ACTIONS
  40. #=============================================================================
  41. # CHAIN_ACTIONS = { 技能ID => [按键顺序] }
  42. #
  43. # 技能ID = 数据库中的技能ID.
  44. # 按键顺序 = 设定按键顺序
  45. #        (以下为全部可用按键)   
  46. #  
  47. # "Down" ,"Up" ,"Left" ,"Right" ,"Shift" ,"D" ,"S" ,"A" ,"Z" ,"X" ,"Q" ,"W",
  48. # "Random"
  49. #
  50. # 例子:
  51. #
  52. # CHAIN_ACTIONS = {
  53. # 25=>["Down","D","S","Right"],
  54. # 59=>["Down","Up","Left","Right","Shift","D","S","A","Z","X","Q","W"],
  55. # 80=>["Shift","D"]
  56. # }
  57. #==============================================================================  
  58. CHAIN_ACTIONS = {
  59. 29=>["Random","Random","Random","Random"],
  60. 52=>["Up","Down","Left","Right","Z"],
  61. 70=>["X","Right","Left","Z","Z"],
  62. 138=>["Random"],
  63. 139=>["Random","Random"],
  64. 140=>["Random","Random","Random"],
  65. #138=>["X"],
  66. #139=>["A","S"],
  67. #140=>["Z","D","X"],
  68. 141=>["Up","Down"],
  69. 142=>["Left","Right","Z"],
  70. 999=>["Left","Right","Left","Right","Left","Right","Q","Z","Up","A","S",
  71.       "Down","D","Z","Right","Up","Up","Z","W","Left","Down","D","A","W"]
  72. }  
  73. #设置随机指令.
  74. RANDOM_KEYS = ["Left","Right","Up","Down","D","S","A","Z","X"]
  75. #默认按键的等待时间(玩家需要正确按下的时间).
  76. CHAIN_DEFAULT_INPUT_DURATION = 60 #60帧 = 1s
  77. #指定按键的等待时间
  78. CHAIN_INPUT_DURATION = {
  79. 138=>60,
  80. 139=>40,
  81. 140=>30
  82. #141=>160,
  83. #240=>2000
  84. }
  85.  
  86. #正确点击时的音效.
  87. CHAIN_RIGHT_SE = "Chime1"
  88. #错误点击时的音效.
  89. CHAIN_WRONG_SE = "Buzzer1"
  90. #输入挑战开始时播放的音效.
  91. CHAIN_START_SE = "Open1"
  92. #输入挑战精灵的位置.
  93. CHAIN_SPRITE_POSITION = [0,-15]
  94. #输入挑战图片的位置
  95. CHAIN_LAYOUT_POSITION = [1,-7]
  96. #进度条图片的位置
  97. CHAIN_METER_POSITION = [0,-6]
  98. #图标的位置
  99. CHAIN_ICON_POSITION = [0,-32]
  100. #输入挑战开始时显示的文字.
  101. CHAIN_COMMAND_WORD = "输入挑战!"
  102. #未命中和时间结束的文字
  103. CHAIN_MISSED_WORDS = ["未命中!", "时间结束"]
  104. #文字位置
  105. CHAIN_COMMAND_WORD_POSITION = [0,0]
  106. #文字大小
  107. CHAIN_WORD_FONT_SIZE = 20
  108. #文字颜色
  109. CHAIN_WORD_FONT_COLOR = Color.new(255,255,255)
  110. #文字Z坐标
  111. CHAIN_SPRITE_Z = 150
  112. end
  113.  
  114. #==============================================================================
  115. # ■ Game Temp
  116. #==============================================================================
  117. class Game_Temp
  118.   attr_accessor :chain_actions
  119.   attr_accessor :active_chain
  120.   attr_accessor :chain_ot
  121.   attr_accessor :chain_action_phase
  122.   #--------------------------------------------------------------------------
  123.   # ● Initialize
  124.   #--------------------------------------------------------------------------      
  125.   alias mog_chain_actions_initialize initialize
  126.   def initialize
  127.       @chain_actions = [0,0,0,false] ; @active_chain = false
  128.       @chain_action_phase = false
  129.       mog_chain_actions_initialize
  130.   end
  131.  
  132. end
  133.  
  134. #==============================================================================
  135. # ■ Scene_Battle
  136. #==============================================================================
  137. class Scene_Battle < Scene_Base
  138.  
  139.   #--------------------------------------------------------------------------
  140.   # ● Use Item
  141.   #--------------------------------------------------------------------------  
  142.   alias mog_chain_actions_use_item use_item
  143.   def use_item
  144.       prepare_chain_command if can_use_chain_commands?
  145.       mog_chain_actions_use_item
  146.       execute_chain_actions if can_use_chain_commands?
  147.   end  
  148.  
  149.   #--------------------------------------------------------------------------
  150.   # ● Can Use Chain Commands
  151.   #--------------------------------------------------------------------------  
  152.   def can_use_chain_commands?
  153.       return false if @subject == nil
  154.       return false if !@subject.is_a?(Game_Actor)
  155.       return false if @subject.restriction != 0
  156.       return true
  157.   end
  158.  
  159.   #--------------------------------------------------------------------------
  160.   # ● Prepare Chain Commands
  161.   #--------------------------------------------------------------------------  
  162.   def prepare_chain_command
  163.       @chain_skill_original = @subject.current_action.item rescue nil
  164.       if $game_temp.chain_ot == nil and @subject.is_a?(Game_Actor)
  165.          targets = @subject.current_action.make_targets.compact
  166.          $game_temp.chain_ot = targets[0]
  167.       end
  168.       check_chain_targets  
  169.   end
  170.  
  171.   #--------------------------------------------------------------------------
  172.   # ● Check Chain Command Position
  173.   #--------------------------------------------------------------------------      
  174.   def check_chain_command_position
  175.       scx = $game_temp.chain_ot.screen_x rescue nil
  176.       return if scx == nil
  177.       if $game_temp.chain_ot != nil and !$game_temp.chain_ot.dead?
  178.          $game_temp.chain_actions = [$game_temp.chain_ot.screen_x,$game_temp.chain_ot.screen_y,true]
  179.       end   
  180.   end
  181.  
  182.   #--------------------------------------------------------------------------
  183.   # ● Check Chain Targets
  184.   #--------------------------------------------------------------------------   
  185.   def check_chain_targets
  186.       return if @subject == nil or $game_temp.chain_ot == nil
  187.       if [1,7,9,10,11].include?(@subject.current_action.item.scope)
  188.          @pre_target = $game_temp.chain_ot ; @pre_target_hp = $game_temp.chain_ot.hp
  189.       else   
  190.          @pre_target = nil ; @pre_target_hp = nil
  191.       end  
  192.   end
  193.  
  194.   #--------------------------------------------------------------------------
  195.   # ● Execute Chain Actions
  196.   #--------------------------------------------------------------------------  
  197.   def execute_chain_actions
  198.       $game_temp.active_chain = false
  199.       return if !can_execute_chain_actions_base?
  200.       check_chain_command_position
  201.       skill = @subject.current_action.item rescue nil
  202.       skill = @chain_skill_original rescue nil
  203.       action_id = skill.note =~ /<Chain Action = (\d+)>/i ? $1.to_i : nil rescue nil
  204.       return if action_id == nil or action_id < 1      
  205.       chain_command_sequence = MOG_CHAIN_ACTIONS::CHAIN_ACTIONS[action_id].dup rescue nil
  206.       $game_temp.chain_actions[2] = action_id   
  207.       if can_execute_chain_sequence?(chain_command_sequence,action_id)
  208.          chain_act_before_action if @chain_command == nil
  209.          chain_sq = Chain_Actions.new(chain_command_sequence,$game_temp.chain_actions)
  210.          loop do
  211.               $game_temp.chain_action_phase = true
  212.               (chain_sq.update($game_temp.chain_ot) ; Input.update) unless @spriteset.animation?
  213.               $game_temp.active_chain = true ; chain_sq.update_skill_name
  214.               @spriteset.update ; Graphics.update ; update_info_viewport
  215.               break if chain_sq.phase == 9
  216.          end
  217.          @subject.wp_animation = [true,chain_sq.success] if $imported[:mog_sprite_actor]
  218.          action_id = nil if !chain_sq.success or $game_temp.chain_ot.dead?
  219.          chain_sq.dispose ; set_chain_skill(action_id) if action_id != nil         
  220.       end
  221.       $game_temp.active_chain = false ; $game_temp.chain_ot = nil
  222.       $game_temp.chain_action_phase = false
  223.   end
  224.  
  225.   #--------------------------------------------------------------------------
  226.   # ● Chain Act Before Action
  227.   #--------------------------------------------------------------------------  
  228.   def chain_act_before_action
  229.       @chain_command = true ; @bb_cursor
  230.       if $imported[:mog_battle_cursor]
  231.          @bb_cursor =  $game_temp.battle_cursor[2]
  232.          $game_temp.battle_cursor[2] = false
  233.       end
  234.       if $imported[:mog_menu_cursor]   
  235.          @chain_curor_x = $game_temp.menu_cursor[2]
  236.          $game_temp.menu_cursor[2] = -999
  237.          force_cursor_visible(false)
  238.       end
  239.       if $imported[:mog_atb_system]
  240.          record_window_data if @wd_rec.nil?
  241.          hide_base_window
  242.          @wd_rec = true
  243.       end      
  244.   end     
  245.  
  246.   #--------------------------------------------------------------------------
  247.   # ● Turn End
  248.   #--------------------------------------------------------------------------  
  249.   alias mog_chain_command_process_action_end process_action_end
  250.   def process_action_end
  251.       mog_chain_command_process_action_end
  252.       chain_act_after_action
  253.   end
  254.  
  255.   #--------------------------------------------------------------------------
  256.   # ● Chain Act After ACtion
  257.   #--------------------------------------------------------------------------  
  258.   def chain_act_after_action
  259.       @chain_skill_original = nil
  260.       $game_temp.chain_ot = nil
  261.       return if @chain_command == nil
  262.       restore_window_data if $imported[:mog_atb_system]
  263.       $game_temp.menu_cursor[2] = @chain_curor_x if $imported[:mog_menu_cursor]
  264.       $game_temp.battle_cursor[2] = @bb_cursor if @bb_cursor != nil
  265.       @chain_command = nil      
  266.   end   
  267.  
  268.   #--------------------------------------------------------------------------
  269.   # ● Set Chain Skill
  270.   #--------------------------------------------------------------------------  
  271.   def set_chain_skill(action_id)
  272.       return if action_id == nil
  273.       @subject.input.set_skill(action_id)
  274.       $game_temp.chain_actions = [0,0,0,false] ; execute_action   
  275.   end
  276.  
  277.   #--------------------------------------------------------------------------
  278.   # ● Can Execute Chain Sequence?
  279.   #--------------------------------------------------------------------------  
  280.   def can_execute_chain_sequence?(chain_command_sequence = nil,action_id = nil)
  281.       return false if chain_command_sequence == nil
  282.       skill = $data_skills[action_id] rescue nil
  283.       return false if skill == nil
  284.       return false if $game_temp.chain_ot == nil or $game_temp.chain_ot.dead?
  285.       if [9,10].include?(skill.scope)
  286.          $game_party.battle_members.each do |i| return true if i.dead? end
  287.          return false
  288.       end
  289.       return true
  290.   end
  291.  
  292.   #--------------------------------------------------------------------------
  293.   # ● Can Execute Chain Actions Base
  294.   #--------------------------------------------------------------------------   
  295.   def can_execute_chain_actions_base?
  296.       return false if @subject == nil or @subject.dead?
  297.       return false if $game_temp.chain_ot == nil or $game_temp.chain_ot.dead?
  298.       return false if @subject.is_a?(Game_Enemy)
  299.       return false if @subject.current_action == nil
  300.       @subject.states.each do |i| return false if i.restriction > 0 end
  301.       return false if $game_party.members.empty?
  302.       return false if $game_party.all_dead?
  303.       return false if $game_troop.all_dead?
  304.       if @pre_target != nil and $game_temp.chain_ot.hp == @pre_target_hp
  305.          return false if $game_temp.chain_ot.result.missed
  306.          return false if $game_temp.chain_ot.result.evaded
  307.       end
  308.       return true
  309.   end
  310.  
  311.   #--------------------------------------------------------------------------
  312.   # ● Turn End
  313.   #--------------------------------------------------------------------------   
  314.   alias mog_chain_command_turn_end turn_end
  315.   def turn_end
  316.       mog_chain_command_turn_end
  317.       @wd_rec = nil
  318.   end
  319.  
  320. end
  321.  
  322. #==============================================================================
  323. # ■ Game Temp
  324. #==============================================================================
  325. class Game_Temp
  326.  
  327.   attr_accessor :cache_active_chain
  328.  
  329.   #--------------------------------------------------------------------------
  330.   # ● Initialize
  331.   #--------------------------------------------------------------------------   
  332.   alias mog_active_chain_initialize initialize
  333.   def initialize
  334.       mog_active_chain_initialize
  335.       cache_act_chain
  336.   end  
  337.  
  338.   #--------------------------------------------------------------------------
  339.   # ● Cache Act Chain
  340.   #--------------------------------------------------------------------------      
  341.   def cache_act_chain
  342.       @cache_active_chain = []
  343.       @cache_active_chain.push(Cache.system("IconSet"))
  344.       @cache_active_chain.push(Cache.system("Chain_Battle_Layout"))
  345.       @cache_active_chain.push(Cache.system("Chain_Battle_Meter"))
  346.       @cache_active_chain.push(Cache.system("Chain_Battle_Command"))
  347.   end
  348.  
  349. end
  350.  
  351. #==============================================================================
  352. # ■ Spriteset Battle
  353. #==============================================================================
  354. class Spriteset_Battle
  355.  
  356.   #--------------------------------------------------------------------------
  357.   # ● Initialize
  358.   #--------------------------------------------------------------------------   
  359.   alias mog_active_chain_commands_initialize initialize
  360.   def initialize
  361.       $game_temp.cache_act_chain ; $game_temp.active_chain = false
  362.       $game_temp.chain_ot = nil
  363.       mog_active_chain_commands_initialize      
  364.   end
  365. end   
  366.  
  367. #==============================================================================
  368. # ■ Chain Actions
  369. #==============================================================================
  370. class Chain_Actions
  371.  
  372.   include MOG_CHAIN_ACTIONS
  373.  
  374.   attr_accessor :phase
  375.   attr_accessor :success
  376.  
  377.   #--------------------------------------------------------------------------
  378.   # ● Initialize
  379.   #--------------------------------------------------------------------------   
  380.   def initialize(sequence,chain_temp)
  381.       $game_temp.chain_actions[3] = true
  382.       @chain_command_original = sequence.dup
  383.       @chain_command = sequence
  384.       random_sequence
  385.       @x = chain_temp[0] + CHAIN_SPRITE_POSITION[0]
  386.       @y = chain_temp[1] + CHAIN_SPRITE_POSITION[1]
  387.       @y = (Graphics.height - 36) if @y > (Graphics.height - 36)
  388.       @y = 0 if @y < 0
  389.       @skill = $data_skills[chain_temp[2]]
  390.       @skillname = @skill.name
  391.  
  392.       if CHAIN_INPUT_DURATION[chain_temp[2]] != nil
  393.          @duration = [CHAIN_INPUT_DURATION[chain_temp[2]],CHAIN_INPUT_DURATION[chain_temp[2]]]
  394.       else   
  395.          @duration = [CHAIN_DEFAULT_INPUT_DURATION, CHAIN_DEFAULT_INPUT_DURATION]
  396.       end  
  397.       @phase = 0 ; @success = false ; @com = 0 ; @com_index = 0
  398.       @initial_wait = 1 ; @wrong_commnad = [false,0,0]
  399.       Audio.se_play("Audio/SE/" + CHAIN_START_SE, 100, 100) rescue nil
  400.       create_button_sprite ; create_skill_name ; create_icon ; create_meter
  401.       set_opacity(0)
  402.   end
  403.  
  404.   #--------------------------------------------------------------------------
  405.   # ● Random Sequence
  406.   #--------------------------------------------------------------------------   
  407.   def random_sequence
  408.       @chain_command_original.each_with_index do |c, i|
  409.       next if c != "Random"
  410.       k = rand(RANDOM_KEYS.size) ; @chain_command[i] = RANDOM_KEYS[k]
  411.       end
  412.   end
  413.  
  414.   #--------------------------------------------------------------------------
  415.   # ● Create Icon
  416.   #--------------------------------------------------------------------------      
  417.   def create_icon
  418.       @icon_image = $game_temp.cache_active_chain[0]
  419.       @icon_sprite = Sprite.new ; @icon_sprite.bitmap = Bitmap.new(24,24)
  420.       @icon_sprite.z = CHAIN_SPRITE_Z + 1
  421.       @org_x2 = @x - 12 +  CHAIN_ICON_POSITION[0] - @center
  422.       @icon_sprite.x = @org_x2 - 50
  423.       @icon_sprite.y = @y +  CHAIN_ICON_POSITION[1]     
  424.       icon_rect = Rect.new(@skill.icon_index % 16 * 24, @skill.icon_index / 16 * 24, 24, 24)
  425.       @icon_sprite.bitmap.blt(0,0, @icon_image, icon_rect)
  426.   end
  427.  
  428.   #--------------------------------------------------------------------------
  429.   # ● Create Meter
  430.   #--------------------------------------------------------------------------        
  431.   def create_meter
  432.       @meter_layout = Sprite.new
  433.       @meter_layout.bitmap = $game_temp.cache_active_chain[1]
  434.       @meter_layout.z = CHAIN_SPRITE_Z
  435.       @meter_layout.x = @x - (@meter_layout.width / 2) + CHAIN_LAYOUT_POSITION[0]
  436.       @meter_layout.y = @y + CHAIN_LAYOUT_POSITION[1]
  437.       @meter_image = $game_temp.cache_active_chain[2]
  438.       @meter_cw = @meter_image.width ; @meter_ch = @meter_image.height
  439.       @meter = Sprite.new
  440.       @meter.bitmap = Bitmap.new(@meter_image.width, @meter_image.height)
  441.       @meter.z = CHAIN_SPRITE_Z + 1
  442.       @meter.x = @x - (@meter_image.width / 2) + CHAIN_METER_POSITION[0]
  443.       @meter.y = @y + CHAIN_METER_POSITION[1]
  444.       @meter.visible = false ; @meter_layout.visible = false ; update_meter
  445.   end
  446.  
  447.   #--------------------------------------------------------------------------
  448.   # ● Update Meter
  449.   #--------------------------------------------------------------------------         
  450.   def update_meter
  451.       return if @meter == nil
  452.       @meter.bitmap.clear ; range = @meter_cw * @duration[0] / @duration[1]
  453.       m_scr = Rect.new(0,0,range,@meter_ch )
  454.       @meter.bitmap.blt(0,0, @meter_image ,m_scr)
  455.   end
  456.  
  457.   #--------------------------------------------------------------------------
  458.   # ● Initialize
  459.   #--------------------------------------------------------------------------      
  460.   def create_skill_name
  461.       @skill_name = Sprite.new ; @skill_name.bitmap = Bitmap.new(200,32)
  462.       @skill_name.bitmap.font.size = CHAIN_WORD_FONT_SIZE
  463.       @skill_name.bitmap.font.color = CHAIN_WORD_FONT_COLOR
  464.       @skill_name.z = CHAIN_SPRITE_Z
  465.       @skill_name.y = @y - 32 + CHAIN_COMMAND_WORD_POSITION[1]
  466.       refresh_skill_name
  467.   end
  468.  
  469.   #--------------------------------------------------------------------------
  470.   # ● Refresh Skill Name
  471.   #--------------------------------------------------------------------------        
  472.   def refresh_skill_name
  473.       cm = @skillname.to_s.split(//).size
  474.       @center = ((200 / @skill_name.bitmap.font.size) * cm / 2) + 5
  475.       @org_x = @x - (@button_cw / 2) - 85 + CHAIN_COMMAND_WORD_POSITION[0]
  476.       @skill_name.x = @org_x - 50
  477.       @skill_name.bitmap.draw_text(0,0,200,32,@skillname.to_s,1)  
  478.   end
  479.  
  480.   #--------------------------------------------------------------------------
  481.   # ● Create Button Sprite
  482.   #--------------------------------------------------------------------------      
  483.   def create_button_sprite
  484.       @button_image = $game_temp.cache_active_chain[3]
  485.       @button_cw = @button_image.width / 13 ; @button_ch = @button_image.height
  486.       @button_sprite = Sprite.new
  487.       @button_sprite.bitmap = Bitmap.new(@button_cw,@button_ch)
  488.       @button_sprite.z = CHAIN_SPRITE_Z + 1
  489.       @button_sprite.ox = @button_cw / 2 ; @button_sprite.oy = @button_ch / 2
  490.       @button_sprite_oxy = [@button_sprite.ox,@button_sprite.oy]
  491.       @button_sprite.x = @x + @button_sprite.ox - (@button_cw / 2)
  492.       @button_sprite.y = @y + @button_sprite.oy      
  493.   end
  494.  
  495.   #--------------------------------------------------------------------------
  496.   # ● Refresh Button Command
  497.   #--------------------------------------------------------------------------        
  498.   def refresh_button_command
  499.       return if @button_sprite == nil
  500.       @duration[0] = @duration[1]
  501.       command_list_check(@chain_command[@com_index])  
  502.       @button_sprite.bitmap.clear
  503.       button_scr = Rect.new(@com * @button_cw , 0,@button_cw,@button_ch)
  504.       @button_sprite.bitmap.blt(0,0,@button_image,button_scr)
  505.       @button_sprite.zoom_x = 1.3 ; @button_sprite.zoom_y = 1.3   
  506.       @button_sprite.opacity = 255
  507.   end
  508.  
  509.   #--------------------------------------------------------------------------
  510.   # ● Dispose
  511.   #--------------------------------------------------------------------------      
  512.   def dispose
  513.       dispose_button ; dispose_meter ; dispose_name ; dispose_icon_sprite
  514.       $game_temp.chain_actions[3] = false ; $game_temp.active_chain = false
  515.   end
  516.  
  517.   #--------------------------------------------------------------------------
  518.   # ● Dispose Icon Sprite
  519.   #--------------------------------------------------------------------------        
  520.   def dispose_icon_sprite
  521.       return if @icon_sprite == nil
  522.       @icon_sprite.bitmap.dispose ; @icon_sprite.dispose ; @icon_sprite = nil
  523.   end  
  524.  
  525.   #--------------------------------------------------------------------------
  526.   # ● Dispose Name
  527.   #--------------------------------------------------------------------------        
  528.   def dispose_name
  529.       return if @skill_name == nil
  530.       @skill_name.bitmap.dispose ; @skill_name.dispose ; @skill_name = nil
  531.   end
  532.  
  533.   #--------------------------------------------------------------------------
  534.   # ● Dispose Button
  535.   #--------------------------------------------------------------------------        
  536.   def dispose_button
  537.       return if @button_sprite == nil
  538.       @button_sprite.bitmap.dispose ; @button_sprite.dispose ; @button_sprite = nil
  539.   end
  540.  
  541.   #--------------------------------------------------------------------------
  542.   # ● Dispose Meter
  543.   #--------------------------------------------------------------------------         
  544.   def dispose_meter
  545.       return if @meter_layout == nil
  546.       @meter_layout.dispose ; @meter_layout = nil
  547.       @meter.bitmap.dispose ; @meter.dispose
  548.   end  
  549.  
  550.   #--------------------------------------------------------------------------
  551.   # ● Update
  552.   #--------------------------------------------------------------------------      
  553.   def update(battler)
  554.       if @initial_wait > 0
  555.          @initial_wait -= 1
  556.          if @initial_wait == 0
  557.             refresh_button_command ; @meter.visible = true
  558.             @meter_layout.visible = true        
  559.             set_opacity(0)
  560.          end
  561.          return  
  562.       end
  563.       if @wrong_commnad[0]
  564.          update_fade_command
  565.          return
  566.       else   
  567.          update_opacity         
  568.       end      
  569.       update_command ; update_sprite_button ; update_time ; update_meter
  570.       update_battle_camera if oxy_camera?(battler)
  571.   end
  572.  
  573.   #--------------------------------------------------------------------------
  574.   # ● OXY_CAMERA
  575.   #--------------------------------------------------------------------------               
  576.   def oxy_camera?(battler)
  577.       return false if battler == nil
  578.       return false if $imported[:mog_battle_camera] == nil
  579.       if battler.is_a?(Game_Actor)
  580.          return false if $imported[:mog_battle_hud_ex] and SceneManager.face_battler?
  581.       end
  582.       return true
  583.   end  
  584.  
  585.   #--------------------------------------------------------------------------
  586.   # ● Update Battle Camera
  587.   #--------------------------------------------------------------------------               
  588.   def update_battle_camera
  589.       @meter_layout.ox = $game_temp.viewport_oxy[0]
  590.       @meter_layout.oy = $game_temp.viewport_oxy[1]
  591.       @meter.ox = $game_temp.viewport_oxy[0]
  592.       @meter.oy = $game_temp.viewport_oxy[1]
  593.       @skill_name.ox = $game_temp.viewport_oxy[0]
  594.       @skill_name.oy = $game_temp.viewport_oxy[1]
  595.       @button_sprite.ox = $game_temp.viewport_oxy[0] + @button_sprite_oxy[0]
  596.       @button_sprite.oy = $game_temp.viewport_oxy[1] + @button_sprite_oxy[1]
  597.       @icon_sprite.ox = $game_temp.viewport_oxy[0]
  598.       @icon_sprite.oy = $game_temp.viewport_oxy[1]
  599.   end  
  600.  
  601.   #--------------------------------------------------------------------------
  602.   # ● Set Opacity
  603.   #--------------------------------------------------------------------------         
  604.   def set_opacity(opc)
  605.       @meter_layout.opacity = opc
  606.       @meter.opacity = opc
  607.       @skill_name.opacity = opc
  608.       @button_sprite.opacity = opc
  609.       @icon_sprite.opacity = opc
  610.   end      
  611.  
  612.   #--------------------------------------------------------------------------
  613.   # ● Update Opacity
  614.   #--------------------------------------------------------------------------         
  615.   def update_opacity
  616.       @meter_layout.opacity += 75
  617.       @meter.opacity += 75
  618.       @skill_name.opacity += 75
  619.       @button_sprite.opacity += 75
  620.       @icon_sprite.opacity += 75
  621.   end   
  622.  
  623.  
  624.   #--------------------------------------------------------------------------
  625.   # ● Update Skill Name
  626.   #--------------------------------------------------------------------------         
  627.   def update_fade_command
  628.       fade_speed = 6
  629.       @skill_name.opacity -= fade_speed ; @meter.opacity -= fade_speed
  630.       @meter_layout.opacity -= fade_speed ; @icon_sprite.opacity -= fade_speed
  631.       @button_sprite.opacity -= fade_speed * 2 ; missed if @meter.opacity == 0
  632.   end
  633.  
  634.   #--------------------------------------------------------------------------
  635.   # ● Update Skill Name
  636.   #--------------------------------------------------------------------------        
  637.   def update_skill_name
  638.       return if @skill_name == nil
  639.       if @skill_name.x < @org_x
  640.          @skill_name.x += 3 ; @icon_sprite.x += 3
  641.          if @skill_name.x > @org_x
  642.             @skill_name.x = @org_x ; @icon_sprite.x = @org_x2
  643.          end   
  644.       end
  645.   end
  646.  
  647.   #--------------------------------------------------------------------------
  648.   # ● Update Time
  649.   #--------------------------------------------------------------------------
  650.   def update_time
  651.       return if @button_sprite == nil
  652.       @duration[0] -= 1 if @duration[0] > 0
  653.       wrong_command(1) if @duration[0] == 0
  654.   end
  655.  
  656.   #--------------------------------------------------------------------------
  657.   # ● Update Sprite Button
  658.   #--------------------------------------------------------------------------        
  659.   def update_sprite_button
  660.       return if @button_sprite == nil
  661.       if @button_sprite.zoom_x > 1.00
  662.          @button_sprite.zoom_x -= 0.05
  663.          @button_sprite.zoom_x = 1.00 if @button_sprite.zoom_x < 1.00
  664.       end
  665.       @button_sprite.zoom_y = @button_sprite.zoom_x
  666.   end  
  667.  
  668. #--------------------------------------------------------------------------
  669. # ● Update Command
  670. #--------------------------------------------------------------------------      
  671. def update_command
  672.      if Input.trigger?(:X) ; check_command(0)
  673.      elsif Input.trigger?(:Z) ; check_command(1)
  674.      elsif Input.trigger?(:Y) ; check_command(2)
  675.      elsif Input.trigger?(:A) ; check_command(3)
  676.      elsif Input.trigger?(:C) ; check_command(4)
  677.      elsif Input.trigger?(:B) ; check_command(5)
  678.      elsif Input.trigger?(:L) ; check_command(6)
  679.      elsif Input.trigger?(:R) ; check_command(7)        
  680.      elsif Input.trigger?(:RIGHT) ; check_command(8)
  681.      elsif Input.trigger?(:LEFT) ; check_command(9)
  682.      elsif Input.trigger?(:DOWN) ; check_command(10)
  683.      elsif Input.trigger?(:UP) ; check_command(11)
  684.      end   
  685. end  
  686.  
  687. #--------------------------------------------------------------------------
  688. # ● command_list_check
  689. #--------------------------------------------------------------------------      
  690. def command_list_check(command)
  691.      case command
  692.          when "A" ; @com = 0  
  693.          when "D" ; @com = 1  
  694.          when "S" ; @com = 2
  695.          when "Shift" ; @com = 3
  696.          when "Z" ; @com = 4
  697.          when "X" ; @com = 5
  698.          when "Q" ; @com = 6
  699.          when "W" ; @com = 7            
  700.          when "Right" ; @com = 8
  701.          when "Left" ;  @com = 9
  702.          when "Down" ;  @com = 10
  703.          when "Up"  ;   @com = 11         
  704.          else ; @com = 12           
  705.      end
  706. end   
  707.  
  708. #--------------------------------------------------------------------------
  709. # ● check_command
  710. #--------------------------------------------------------------------------            
  711. def check_command(com)
  712.      if com != -1
  713.         right_input = false
  714.         @chain_command.each_with_index do |i, index|
  715.            if index == @com_index
  716.               command_list_check(i) ; right_input = true if @com == com
  717.            end         
  718.         end
  719.      else  
  720.        command_list_check(@com_index) ; right_input = true
  721.      end  
  722.      if right_input
  723.         next_command
  724.      else  
  725.         wrong_command(0)
  726.      end  
  727. end  
  728.  
  729. #--------------------------------------------------------------------------
  730. # ● Next Command
  731. #--------------------------------------------------------------------------            
  732. def next_command
  733.      @com_index += 1   
  734.      Audio.se_play("Audio/SE/" + CHAIN_RIGHT_SE, 100, 100)
  735.      if @com_index == @chain_command.size
  736.         @phase = 9 ; @success = true
  737.         return
  738.      end  
  739.      refresh_button_command
  740. end     
  741.  
  742. #--------------------------------------------------------------------------
  743. # ● wrong_command
  744. #--------------------------------------------------------------------------              
  745. def wrong_command(type = 0)
  746.      @wrong_commnad[0] = true ; @wrong_commnad[1] = type
  747.      @skill_name.bitmap.clear
  748.      Audio.se_play("Audio/SE/" + CHAIN_WRONG_SE, 100, 100)        
  749.      wname = type == 0 ? CHAIN_MISSED_WORDS[0] : CHAIN_MISSED_WORDS[1]
  750.      @skill_name.bitmap.draw_text(0,0,200,32,wname.to_s,1)
  751. end     
  752.  
  753. #--------------------------------------------------------------------------
  754. # ● missed
  755. #--------------------------------------------------------------------------               
  756. def missed
  757.      @success = false  ; @phase = 9  
  758. end
  759.  
  760. end

Lv4.逐梦者

梦石
1
星屑
14790
在线时间
2106 小时
注册时间
2017-9-28
帖子
662
2
发表于 2018-6-28 13:06:45 | 只看该作者
本帖最后由 Nil2018 于 2018-6-28 13:08 编辑

仔细一看,好像战斗输入挑战的我翻错了,技能id那里
VA外站脚本汉化群:226308173   |    部分远古文件备份:https://wwzv.lanzoue.com/b02rac5pc  密码:acgm
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2699
在线时间
1060 小时
注册时间
2015-11-1
帖子
271
3
发表于 2018-6-28 20:38:42 | 只看该作者
印象中,mog是有几个工程范例大整合的,其中也包括这个,很久以前论坛下过的,不知道现在还有没有。

-
顺带一提,mog的这个外加一个按键连招我就没有完整输入过。。。我觉得RPG游戏里面加入这个玩法对我这类玩家太不友好了。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
428
在线时间
50 小时
注册时间
2017-1-10
帖子
28
4
 楼主| 发表于 2018-6-28 20:51:14 | 只看该作者


找到范例了,但是在范例能用,搁我的里提示这个,不懂
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
428
在线时间
50 小时
注册时间
2017-1-10
帖子
28
5
 楼主| 发表于 2018-6-29 10:57:52 | 只看该作者
原来和大窗口脚本冲突了,求帮忙


  1. #=============================================================================
  2. # Σ Fullscreen
  3. #-----------------------------------------------------------------------------
  4. # @author  : Gabriel "Gab!" Teles
  5. # @date    : 2014-09-27
  6. # @version : 0.9.2
  7. #-----------------------------------------------------------------------------
  8. # TODO:
  9. #   - Transições por imagens
  10. #-----------------------------------------------------------------------------
  11. # Créditos:
  12. #   Scripter Desconhecido no Pastebin (http://pastebin.com/sM2MNJZj)
  13. #   Esrever : Map viewport/scroll fix
  14. #   Zeus81  : FPS Display
  15. #-----------------------------------------------------------------------------
  16. # Permite utilizar fullscreen real (sem redimensionamento de tela), e alterar
  17. # o limite da função Graphics.resize_screen para a resolução máxima do monitor
  18. # ou um valor próximo.
  19. #=============================================================================

  20. # Módulo Graphics
  21. class << Graphics
  22.   # API
  23.   User32   = DL.dlopen('user32')
  24.   Kernel32 = DL.dlopen('kernel32')
  25.   GetActiveWindow  = DL::CFunc.new(  User32['GetActiveWindow' ], DL::TYPE_LONG)
  26.   GetSystemMetrics = DL::CFunc.new(  User32['GetSystemMetrics'], DL::TYPE_LONG)
  27.   GetWindowRect    = DL::CFunc.new(  User32['GetWindowRect'   ], DL::TYPE_LONG)
  28.   SetWindowLong    = DL::CFunc.new(  User32['SetWindowLong'   ], DL::TYPE_LONG)
  29.   SetWindowPos     = DL::CFunc.new(  User32['SetWindowPos'    ], DL::TYPE_LONG)
  30.   GetModuleHandle  = DL::CFunc.new(Kernel32['GetModuleHandle' ], DL::TYPE_LONG)  

  31.   # DLL sendo utilizada
  32.   _DLLName = DL::CPtr.malloc(140)
  33.   s = DL::CFunc.new(Kernel32['GetPrivateProfileString'], DL::TYPE_LONG).call([
  34.     DL::CPtr["Game"].to_i,
  35.     DL::CPtr["Library"].to_i,
  36.     0,
  37.     _DLLName.to_i,
  38.     140,
  39.     DL::CPtr["./Game.ini"].to_i
  40.   ])

  41.   @@DLLName = File.basename(_DLLName.to_s(s))

  42.   # Verifica se é uma RGSS3xx.dll
  43.   if @@DLLName.match(/^RGSS3(\d{2})\.dll$/)
  44.     @@DLLVersion = $1.to_i
  45.    
  46.     # Verifica se a versão é 0 ou 1.
  47.     if @@DLLVersion.between?(0, 1)
  48.       # Flag de fullscreen
  49.       @@inFullscreen = false
  50.      
  51.       # Instância da DLL. *Necessariamente* a RGSS300.dll ou RGSS301.dll, visto
  52.       # que o trabalho com memória a seguir é específico.
  53.      
  54.       @@DLLHandle   = GetModuleHandle.call([DL::CPtr[@@DLLName].to_i])
  55.      
  56.       # Instância da janela de jogo
  57.       @@hWnd       = GetActiveWindow.call([])
  58.      
  59.       # Tamanho da tela
  60.       @@screenSize = [
  61.         GetSystemMetrics.call([0]),
  62.         GetSystemMetrics.call([1])
  63.       ]
  64.      
  65.       # Calcula o próximo tamanho divisível por 32 para fazer a limitação
  66.       width, height = @@screenSize
  67.       width  += (32 - (width  % 32)) unless (width  % 32).zero?
  68.       height += (32 - (height % 32)) unless (height % 32).zero?
  69.       puts "Limitando para: #{width}x#{height}" if $TEST
  70.      
  71.       #-----------------------------------------------------------------------
  72.       # Bruxaria de scripter desconhecido. Remove a limitação de tamanho para
  73.       # o método Graphics.resize_screen (640x480)
  74.       #
  75.       # Base retirada de: http://pastebin.com/sM2MNJZj
  76.       #
  77.       # Adaptações para a RGSS300.dll e início do mapeamento dos endereços
  78.       # utilizados por Gab!
  79.       #-----------------------------------------------------------------------
  80.      
  81.       # Número para string
  82.       wh = ->(w, h, off = 0){
  83.         [w + off, h + off].pack('l2').scan(/..../)
  84.       }
  85.      
  86.       # Altera um valor na memória relativa à DLL
  87.       mod = ->(adr, val){
  88.         adr += @@OFF if @@DLLVersion.zero?
  89.         DL::CPtr.new(@@DLLHandle + adr)[0, val.size] = val
  90.       }
  91.      
  92.       # Valores úteis
  93.       wt,  ht  = width.divmod(32), height.divmod(32)
  94.       w,   h   = wh.(width, height)
  95.       ww,  hh  = wh.(width, height, 32)
  96.       www, hhh = wh.(wt.first, ht.first, 1)
  97.       zero     = [0].pack('l')
  98.          
  99.       # Faz as alterações na memória
  100.      
  101.       # Graphics
  102.       @@OFF = 0
  103.       mod.(0x195F, "\x90"*5) # ???
  104.       mod.(0x19A4,   h     ) # ???
  105.       mod.(0x19A9,   w     ) # ???
  106.       mod.(0x1A56,   h     ) # ???
  107.       mod.(0x1A5B,   w     ) # ???
  108.       mod.(0x20F6,   w     ) # Max width  (?)
  109.       mod.(0x20FF,   w     ) # Max width  (?)
  110.       mod.(0x2106,   h     ) # Max height (?)
  111.       mod.(0x210F,   h     ) # Max height (?)
  112.      
  113.       # Plane (?) Class
  114.       @@OFF   = -0xC0
  115.       Graphics::PlaneSpeedUp = true
  116.         # Setando para false não é necessário reescrever classe Plane. No
  117.         # entanto, o mapa fica MUITO lento.
  118.       mod.(0x1C5E3,  Graphics::PlaneSpeedUp ? zero : h) # Max height
  119.       mod.(0x1C5E8,  Graphics::PlaneSpeedUp ? zero : w) # Max width
  120.      
  121.       # ???
  122.       @@OFF = 0x20
  123.       mod.(0x1F477,  h     ) # ???
  124.       mod.(0x1F47C,  w     ) # ???
  125.      
  126.       # Tilemap Class
  127.       @@OFF = 0x1E0
  128.       mod.(0x211FF,  hh    ) # Tilemap render height
  129.       mod.(0x21204,  ww    ) # Tilemap render width
  130.       mod.(0x21D7D,  hhh[0]) # Tilemap max tiles on screen height
  131.       mod.(0x21E01,  www[0]) # Tilemap max tiles on screen width
  132.      
  133.       # ???
  134.       @@OFF = 0x140
  135.       mod.(0x10DEA8, h     ) # ???
  136.       mod.(0x10DEAD, w     ) # ???   
  137.       mod.(0x10DEDF, h     ) # ???
  138.       mod.(0x10DEE3, w     ) # ???
  139.       mod.(0x10DF14, h     ) # ???
  140.       mod.(0x10DF18, w     ) # ???
  141.       mod.(0x10DF48, h     ) # ???
  142.       mod.(0x10DF4C, w     ) # ???
  143.       mod.(0x10E6A7, w     ) # ???
  144.       mod.(0x10E6C3, h     ) # ???
  145.       mod.(0x10EEA9, w     ) # ???
  146.       mod.(0x10EEB9, h     ) # ???
  147.      
  148.       #-------------------------------------------------------------------------
  149.       # Fim da bruxaria
  150.       #-------------------------------------------------------------------------
  151.      
  152.       # Sprite de transição de tela
  153.       @@TransitionSprite = Sprite.new
  154.       @@TransitionSprite.bitmap = Bitmap.new(Graphics.width, Graphics.height)
  155.       @@TransitionSprite.bitmap.fill_rect(@@TransitionSprite.bitmap.rect, Color.new(0, 0, 0))
  156.       @@TransitionSprite.opacity = 0
  157.       @@TransitionSprite.z = 0x7FFFFFFF
  158.      
  159.       # Bitmap da tela no momento do Graphics.freeze
  160.       @@FrozenBitmap = Bitmap.new(Graphics.width, Graphics.height)
  161.       @@FrozenBitmap.fill_rect(@@FrozenBitmap.rect, Color.new(0, 0, 0))
  162.      
  163.       # Realiza a transição de tela
  164.       # Nota: Não é possível realizar transição de tela com imagens
  165.       alias oldFullscreenResTransition transition
  166.       def transition(time, image='', vague=40)
  167.         @@TransitionSprite.bitmap.dispose
  168.         @@TransitionSprite.dispose
  169.         @@TransitionSprite = Sprite.new
  170.         @@TransitionSprite.bitmap = @@FrozenBitmap
  171.         @@TransitionSprite.opacity = 255
  172.         @@TransitionSprite.z = 0x7FFFFFFF
  173.      
  174.         oldFullscreenResTransition(0)
  175.       
  176.         dec = (255.0 / time)
  177.         time.times {
  178.           @@TransitionSprite.opacity -= dec
  179.           Graphics.update
  180.         }
  181.       end
  182.      
  183.       # Fadein
  184.       def fadein(time)
  185.         @@FrozenBitmap = Bitmap.new(Graphics.width, Graphics.height)
  186.         @@FrozenBitmap.fill_rect(@@FrozenBitmap.rect, Color.new(0, 0, 0))
  187.       
  188.         transition(time)
  189.       end
  190.      
  191.       # Fadeout
  192.       def fadeout(time)
  193.         inc = (255.0 / time)
  194.         time.times {
  195.           @@TransitionSprite.opacity += inc
  196.           Graphics.update
  197.         }
  198.       end
  199.      
  200.       # Armazena a imagem da tela
  201.       alias oldFullscreenResFreeze freeze
  202.       def freeze(*a, &b)
  203.         oldFullscreenResFreeze(*a, &b)
  204.         @@FrozenBitmap = Graphics.snap_to_bitmap
  205.       end
  206.      
  207.       # Realiza o redimensionamento de tela
  208.       alias gabFullscreenOldResizeScreen resize_screen
  209.       def resize_screen(*a, &b)
  210.         # Redimensiona normalmente
  211.         gabFullscreenOldResizeScreen(*a, &b)
  212.         # Redimensiona o sprite de transição
  213.         @@TransitionSprite.bitmap.dispose
  214.         @@TransitionSprite.bitmap = Bitmap.new(*Graphics.size)
  215.         @@TransitionSprite.bitmap.fill_rect(@@TransitionSprite.bitmap.rect, Color.new(0, 0, 0))
  216.       
  217.         if Graphics::PlaneSpeedUp
  218.           # Manda o sinal de atualização para todas as instâncias da classe Plane
  219.           ObjectSpace.each_object(Plane){|plane|
  220.             plane.send(:recreateBitmap)
  221.           }
  222.         end
  223.       end
  224.      
  225.       # Altera para fullscreen
  226.       def fullscreen
  227.         # Retorna se já estiver em fullscreen
  228.         return if @@inFullscreen
  229.         # Tamanho antes do fullscreen
  230.         rect = DL::CPtr.malloc(16)
  231.         rect[0, 16] = 0.chr * 16
  232.         GetWindowRect.call([@@hWnd, rect])
  233.         @@windowSize = rect[0, 16].unpack("l*")
  234.         @@windowSize[2] -= @@windowSize[0]
  235.         @@windowSize[3] -= @@windowSize[1]
  236.         @@windowResolution = Graphics.size
  237.         # Muda o tamanho da tela
  238.         Graphics.resize_screen(*@@screenSize)
  239.         # Remover bordas da janela
  240.         SetWindowLong.call([@@hWnd, -16, 0x14000000])
  241.         # Coloca a janela acima de todas as outras
  242.         SetWindowPos.call([@@hWnd, -1, 0, 0, *@@screenSize, 0])
  243.         # Modifica a flag de fullscreen
  244.         @@inFullscreen = true
  245.         # Espera alguns frames para terminar o processamento
  246.         Graphics.wait(5)
  247.       end
  248.      
  249.       # Altera para modo janela
  250.       def windowed
  251.         # Retorna se não estiver em fullscreen
  252.         return unless @@inFullscreen
  253.         # Muda o tamanho da tela
  254.         Graphics.resize_screen(*@@windowResolution)
  255.         # Recoloca bordas da janela
  256.         SetWindowLong.call([@@hWnd, -16, 0x14CA0000])
  257.         # Coloca a janela na posição x,y,z comum e ajusta seu tamanho
  258.         SetWindowPos.call([@@hWnd, 0, *@@windowSize, 0])
  259.         # Modifica a flag de fullscreen
  260.         @@inFullscreen = false
  261.         # Espera alguns frames para terminar o processamento
  262.         Graphics.wait(5)
  263.       end
  264.      
  265.       # Tamanho da tela
  266.       def size
  267.         [self.width, self.height]
  268.       end
  269.      
  270.       # Verifica se a janela está no modo fullscreen
  271.       def fullscreen?
  272.         return @@inFullscreen
  273.       end
  274.      
  275.       # Verifica se a janela está no modo janela
  276.       def windowed?
  277.         return !@@inFullscreen
  278.       end
  279.      
  280.       # Alterna entre os modos fullscreen e janela
  281.       def toggleFullscreen
  282.         @@inFullscreen ? self.windowed : self.fullscreen
  283.       end
  284.     end
  285.   end
  286. end

  287. if Graphics::PlaneSpeedUp
  288.   # Remove a classe Plane Anterior
  289.   Object.send(:remove_const, :Plane)
  290.   # Redefinição da classe Plane
  291.   class Plane
  292.     attr_reader :viewport
  293.     attr_reader :bitmap
  294.     attr_reader :ox
  295.     attr_reader :oy
  296.     attr_reader :opacity
  297.     attr_reader :blend_type
  298.     attr_reader :color
  299.     attr_reader :tone
  300.     attr_reader :visible
  301.     attr_reader :zoom_x
  302.     attr_reader :zoom_y
  303.     attr_reader :z
  304.    
  305.     # Inicialização do objeto
  306.     def initialize(viewport = nil)
  307.       # É necessário verificar se um viewport foi enviado. Desse modo, ao mudar a
  308.       # resolução da tela, deve-se mudar também a rect do viewport para que o
  309.       # Plane que ocupava a tela toda continue
  310.       @defaultViewport = !viewport.is_a?(Viewport)
  311.       @viewport = @defaultViewport ? Viewport.new(0, 0, *Graphics.size) : viewport
  312.      
  313.       @sprite        = Sprite.new(@viewport)
  314.       @bitmap        = nil
  315.       @ox            = @sprite.ox         # 0
  316.       @oy            = @sprite.oy         # 0
  317.       @opacity       = @sprite.opacity    # 255
  318.       @blend_type    = @sprite.blend_type # 0
  319.       @color         = @sprite.color      # Color.new(0, 0, 0, 0)
  320.       @tone          = @sprite.tone       # Tone.new(0, 0, 0, 0)
  321.       @visible       = @sprite.visible    # true
  322.       @z             = @sprite.z          # 0
  323.       @zoom_x        = @sprite.zoom_x     # 1.0
  324.       @zoom_y        = @sprite.zoom_y     # 1.0
  325.     end
  326.    
  327.     def bitmap=(bitmap)
  328.       return unless bitmap.is_a?(Bitmap)
  329.       @bitmap = bitmap
  330.       self.recreateBitmap(true)
  331.     end
  332.    
  333.     def ox=(value)
  334.       @ox = value
  335.       return unless @bitmap
  336.       @sprite.ox = (value % @bitmap.width)
  337.     end
  338.    
  339.     def oy=(value)
  340.       @oy = value
  341.       return unless @bitmap
  342.       @sprite.oy = (value % @bitmap.height)
  343.     end
  344.    
  345.     def opacity=(value)
  346.       @sprite.opacity = value
  347.       @opacity = @sprite.opacity
  348.     end
  349.    
  350.     def blend_type=(value)
  351.       @sprite.blend_type = value
  352.       @blend_type = @sprite.blend_type
  353.     end
  354.    
  355.     def color=(value)
  356.       @sprite.color = value
  357.       @color = @sprite.color
  358.     end
  359.    
  360.     def tone=(value)
  361.       @sprite.tone = value
  362.       @tone = @sprite.tone
  363.     end
  364.    
  365.     def viewport=(value)
  366.       @defaultViewport &= (value == @sprite.viewport)
  367.       @sprite.viewport = value
  368.       @viewport = @sprite.viewport
  369.     end
  370.    
  371.     def visible=(value)
  372.       @sprite.visible = value
  373.       @visible = sprite.visible
  374.     end
  375.    
  376.     def z=(value)
  377.       @sprite.z = value
  378.       @z = @sprite.z
  379.     end
  380.    
  381.     def zoom_x=(value)
  382.       @sprite.zoom_x = value
  383.       @zoom_x = @sprite.zoom_x
  384.       self.recreateBitmap
  385.     end
  386.    
  387.     def zoom_y=(value)
  388.       @sprite.zoom_y = value
  389.       @zoom_y = @sprite.zoom_y
  390.       self.recreateBitmap
  391.     end
  392.    
  393.     def disposed?
  394.       return @sprite.disposed?
  395.     end
  396.    
  397.     def dispose
  398.       @sprite.dispose
  399.     end
  400.    
  401.     protected
  402.    
  403.     def recreateBitmap(forceRefresh = false)
  404.       cw, ch      = Graphics.width * (2.0/@zoom_x), Graphics.height * (2.0/@zoom_y)
  405.       needRefresh = true
  406.      
  407.       if @defaultViewport
  408.         @viewport.rect.width, @viewport.rect.height = *Graphics.size
  409.       end
  410.      
  411.       if @sprite.bitmap.nil? or @sprite.bitmap.disposed?
  412.         newBitmap = Bitmap.new(cw, ch)
  413.       else
  414.         if (cw == @sprite.bitmap.width) and (ch == @sprite.bitmap.height) and (!forceRefresh)
  415.           return
  416.         end
  417.       
  418.         newBitmap = Bitmap.new(cw, ch)
  419.         if (cw < @sprite.bitmap.width) and (ch < @sprite.bitmap.height)
  420.           newBitmap.blt(0, 0, @sprite.bitmap, @sprite.bitmap.rect)
  421.           @sprite.bitmap.dispose
  422.           needRefresh = false
  423.         end
  424.       end
  425.      
  426.       @sprite.bitmap = newBitmap
  427.       self.refreshBitmap if needRefresh or forceRefresh
  428.     end
  429.    
  430.     def refreshBitmap
  431.       # Limpa o bitmap
  432.       b = @sprite.bitmap
  433.       b.clear
  434.      
  435.       return if @bitmap.nil?
  436.      
  437.       # Quantia de espaços para blt
  438.       tx = (b.width  / @bitmap.width.to_f )
  439.       ty = (b.height / @bitmap.height.to_f)
  440.      
  441.       b.blt(0, 0, @bitmap, @bitmap.rect)
  442.      
  443.       return if tx + ty == 2
  444.      
  445.       # Preenche 1 linha
  446.       basePow = @bitmap.width
  447.       baseRct = Rect.new(0, 0, @bitmap.width, @bitmap.height)
  448.      
  449.       Math.log2(tx).floor.times{
  450.         b.blt(basePow, 0, b, baseRct)
  451.         baseRct.width += basePow
  452.         basePow *= 2
  453.       }
  454.      
  455.       # Último bitmap da linha
  456.       baseRct.width = (b.width - baseRct.width)
  457.       b.blt(basePow, 0, b, baseRct)
  458.      
  459.       # Preenche o restante das linhas
  460.       basePow = @bitmap.height
  461.       baseRct = Rect.new(0, 0, b.width, @bitmap.height)
  462.      
  463.       Math.log2(ty).floor.times{
  464.         b.blt(0, basePow, b, baseRct)
  465.         baseRct.height += basePow
  466.         basePow *= 2
  467.       }
  468.      
  469.       # Última linha
  470.       baseRct.height = b.height - baseRct.height
  471.       b.blt(basePow, 0, b, baseRct)
  472.     end
  473.   end
  474. end

  475. class Game_Map
  476.   # Número de tiles horizontais na tela
  477.   def screen_tile_x
  478.     (Graphics.width / 32.0).ceil
  479.   end

  480.   # Número de tiles verticais na tela
  481.   def screen_tile_y
  482.     (Graphics.height / 32.0).ceil
  483.   end
  484. end

  485. # Contador de FPS para o modo Fullscreen
  486. if $TEST
  487.   # FPS Display // Zeus81
  488.   # http://forums.rpgmakerweb.com/index.php?/topic/3738-fps-display-isnt-very-accurate/#entry40350
  489.   module Graphics
  490.     @fps, @fps_tmp = 0, []
  491.    
  492.     class << self
  493.       attr_reader :fps
  494.      
  495.       alias fps_update update unless method_defined?(:fps_update)
  496.       def update
  497.         t = Time.now
  498.         fps_update
  499.         @fps_tmp[frame_count % frame_rate] = Time.now != t
  500.         @fps = 0
  501.         frame_rate.times {|i| @fps += 1 if @fps_tmp[i]}
  502.         fps_sprite.src_rect.y = @fps * 16
  503.       end
  504.      
  505.       def fps_sprite
  506.         if !@fps_sprite or @fps_sprite.disposed?
  507.           @fps_sprite = Sprite.new
  508.           @fps_sprite.z = 0x7FFFFFFF
  509.           @fps_sprite.bitmap = Bitmap.new(24, 16*120)
  510.           @fps_sprite.bitmap.font.name = "Arial"
  511.           @fps_sprite.bitmap.font.size = 16
  512.           @fps_sprite.bitmap.font.color.set(255, 255, 255)
  513.           @fps_sprite.bitmap.fill_rect(@fps_sprite.bitmap.rect, Color.new(0, 0, 0, 127))
  514.           120.times {|i|
  515.             @fps_sprite.bitmap.draw_text(0, i*16, 24, 16, "% 3d"%i, 1)
  516.           }
  517.           @fps_sprite.src_rect.height = 16
  518.         end
  519.         return @fps_sprite
  520.       end      
  521.     end
  522.   end
  523. end

  524. #==============================================================================
  525. # ▼ Viewports/Map Fix for Modified RGSS300.dll File
  526. #   Origin of Code: Yanfly Engine Ace - Ace Core Engine v1.06
  527. # -- Last Updated: 2011.12.26
  528. # -- Level: Easy, Normal
  529. # -- Requires: n/a
  530. #==============================================================================

  531. #==============================================================================
  532. # ■ Game_Map
  533. #==============================================================================

  534. class Game_Map

  535.   #--------------------------------------------------------------------------
  536.   # overwrite method: scroll_down
  537.   #--------------------------------------------------------------------------
  538.   def scroll_down(distance)
  539.     if loop_vertical?
  540.       @display_y += distance
  541.       @display_y %= @map.height * 256
  542.       @parallax_y += distance
  543.     else
  544.       last_y = @display_y
  545.       dh = Graphics.height > height * 32 ? height : screen_tile_y
  546.       @display_y = [@display_y + distance, height - dh].min
  547.       @parallax_y += @display_y - last_y
  548.     end
  549.   end

  550.   #--------------------------------------------------------------------------
  551.   # overwrite method: scroll_right
  552.   #--------------------------------------------------------------------------
  553.   def scroll_right(distance)
  554.     if loop_horizontal?
  555.       @display_x += distance
  556.       @display_x %= @map.width * 256
  557.       @parallax_x += distance
  558.     else
  559.       last_x = @display_x
  560.       dw = Graphics.width > width * 32 ? width : screen_tile_x
  561.       @display_x = [@display_x + distance, width - dw].min
  562.       @parallax_x += @display_x - last_x
  563.     end
  564.   end

  565. end # Game_Map

  566. #==============================================================================
  567. # ■ Spriteset_Map
  568. #==============================================================================

  569. class Spriteset_Map

  570.   #--------------------------------------------------------------------------
  571.   # overwrite method: create_viewports
  572.   #--------------------------------------------------------------------------
  573.   def create_viewports
  574.     if Graphics.width > $game_map.width * 32 && !$game_map.loop_horizontal?
  575.       dx = (Graphics.width - $game_map.width * 32) / 2
  576.     else
  577.       dx = 0
  578.     end
  579.     dw = [Graphics.width, $game_map.width * 32].min
  580.     dw = Graphics.width if $game_map.loop_horizontal?
  581.     if Graphics.height > $game_map.height * 32 && !$game_map.loop_vertical?
  582.       dy = (Graphics.height - $game_map.height * 32) / 2
  583.     else
  584.       dy = 0
  585.     end
  586.     dh = [Graphics.height, $game_map.height * 32].min
  587.     dh = Graphics.height if $game_map.loop_vertical?
  588.     @viewport1 = Viewport.new(dx, dy, dw, dh)
  589.     @viewport2 = Viewport.new(dx, dy, dw, dh)
  590.     @viewport3 = Viewport.new(dx, dy, dw, dh)
  591.     @viewport2.z = 50
  592.     @viewport3.z = 100
  593.   end

  594.   #--------------------------------------------------------------------------
  595.   # new method: update_viewport_sizes
  596.   #--------------------------------------------------------------------------
  597.   def update_viewport_sizes
  598.     if Graphics.width > $game_map.width * 32 && !$game_map.loop_horizontal?
  599.       dx = (Graphics.width - $game_map.width * 32) / 2
  600.     else
  601.       dx = 0
  602.     end
  603.     dw = [Graphics.width, $game_map.width * 32].min
  604.     dw = Graphics.width if $game_map.loop_horizontal?
  605.     if Graphics.height > $game_map.height * 32 && !$game_map.loop_vertical?
  606.       dy = (Graphics.height - $game_map.height * 32) / 2
  607.     else
  608.       dy = 0
  609.     end
  610.     dh = [Graphics.height, $game_map.height * 32].min
  611.     dh = Graphics.height if $game_map.loop_vertical?
  612.     rect = Rect.new(dx, dy, dw, dh)
  613.     for viewport in [@viewport1, @viewport2, @viewport3]
  614.       viewport.rect = rect
  615.     end
  616.   end

  617. end # Spriteset_Map

  618. #==============================================================================
  619. # ■ Scene_Map
  620. #==============================================================================

  621. class Scene_Map < Scene_Base

  622.   #--------------------------------------------------------------------------
  623.   # alias method: post_transfer
  624.   #--------------------------------------------------------------------------
  625.   alias scene_map_post_transfer_ace post_transfer
  626.   def post_transfer
  627.     @spriteset.update_viewport_sizes
  628.     scene_map_post_transfer_ace
  629.   end

  630. end # Scene_Map

  631. #==============================================================================
  632. # ■ Game_Event
  633. #==============================================================================

  634. class Game_Event < Game_Character

  635.   #--------------------------------------------------------------------------
  636.   # overwrite method: near_the_screen?
  637.   #--------------------------------------------------------------------------
  638.   def near_the_screen?(dx = nil, dy = nil)
  639.     dx = [Graphics.width, $game_map.width * 256].min/32 - 5 if dx.nil?
  640.     dy = [Graphics.height, $game_map.height * 256].min/32 - 5 if dy.nil?
  641.     ax = $game_map.adjust_x(@real_x) - Graphics.width / 2 / 32
  642.     ay = $game_map.adjust_y(@real_y) - Graphics.height / 2 / 32
  643.     ax >= -dx && ax <= dx && ay >= -dy && ay <= dy
  644.   end

  645. end # Game_Event

  646. # Chama o método que realiza a mudança de tamanho
  647. # Graphics.fullscreen
  648. Graphics.resize_screen(800, 600)

  649. __END__
  650. # TESTES
  651. # Graphics.windowed
  652. x = Bitmap.new(50, 50)
  653. x.gradient_fill_rect(0,  0, 50, 25, Color.new(255, 0, 0), Color.new(0, 255, 0))
  654. x.gradient_fill_rect(0, 25, 50, 25, Color.new(0, 255, 0), Color.new(0, 0, 255))
  655. y = Plane.new
  656. y.bitmap = x
  657. y.zoom_x = 3
  658. y.zoom_y = 3
  659. #Graphics.fullscreen
  660. #Graphics.windowed
  661. loop do
  662.   Graphics.update
  663.   y.ox += 1
  664.   y.oy += 1
  665. end
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-17 07:43

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表