Advertisement
Guest User

RGSS3 DIY - Menu Circular

a guest
Jul 31st, 2019
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 22.92 KB | None | 0 0
  1. #==============================================================================
  2. # Menu Circular | v1.0.0 | por Masked
  3. #
  4. # para RPG Maker VX Ace
  5. #------------------------------------------------------------------------------
  6. #  Modifica o menu para um círculo de ícones em volta do jogador.
  7. #==============================================================================
  8. #==============================================================================
  9. # ** RingMenu
  10. #------------------------------------------------------------------------------
  11. #  Este modulo define as configurações do menu circular.
  12. #==============================================================================
  13. module RingMenu
  14.   # Ícones
  15.   GOLD_ICON     = 361
  16.   ICONS         = {
  17.     item:       192,
  18.     skill:      8,
  19.     equip:      164,
  20.     status:     4,
  21.     formation:  121,
  22.     save:       117,
  23.     game_end:   0
  24.   }
  25.  
  26.   # Tamanho da fonte
  27.   FONT_SIZE     = 24
  28.  
  29.   # Duração da rotação
  30.   SPIN_DURATION = 16
  31.  
  32.   # Raio do anel
  33.   RADIUS        = 128
  34. end
  35. #==============================================================================
  36. # ** Scene_Menu
  37. #------------------------------------------------------------------------------
  38. #  Esta classe executa o processamento da tela de menu.
  39. #==============================================================================
  40. class Scene_Menu < Scene_MenuBase
  41.   #--------------------------------------------------------------------------
  42.   # * Inicialização do processo
  43.   #--------------------------------------------------------------------------
  44.   def start
  45.     super
  46.     create_player
  47.     create_gold_window
  48.     create_command_ring
  49.     create_character_ring
  50.   end
  51.   #--------------------------------------------------------------------------
  52.   # * Cria o sprite do jogador
  53.   #--------------------------------------------------------------------------
  54.   def create_player
  55.     @player = Sprite_Character.new(@viewport, $game_player)
  56.   end
  57.   #--------------------------------------------------------------------------
  58.   # * Cria o anel de comandos
  59.   #--------------------------------------------------------------------------
  60.   def create_command_ring
  61.     @command_window = CommandRing.new
  62.     @command_window.set_handler(:item,      method(:command_item))
  63.     @command_window.set_handler(:skill,     method(:command_personal))
  64.     @command_window.set_handler(:equip,     method(:command_personal))
  65.     @command_window.set_handler(:status,    method(:command_personal))
  66.     @command_window.set_handler(:formation, method(:command_formation))
  67.     @command_window.set_handler(:save,      method(:command_save))
  68.     @command_window.set_handler(:game_end,  method(:command_game_end))
  69.     @command_window.set_handler(:cancel,    method(:return_scene))
  70.   end
  71.   #--------------------------------------------------------------------------
  72.   # * Cria o anel de personagens
  73.   #--------------------------------------------------------------------------
  74.   def create_character_ring
  75.     @status_window = CharacterRing.new
  76.     @status_window.deactivate
  77.     @status_window.update
  78.   end
  79.   #--------------------------------------------------------------------------
  80.   # * Atualização da tela
  81.   #--------------------------------------------------------------------------
  82.   def update
  83.     super
  84.     @player.update
  85.   end
  86.   #--------------------------------------------------------------------------
  87.   # * Finalização do processo
  88.   #--------------------------------------------------------------------------
  89.   def terminate
  90.     super
  91.     @player.dispose
  92.   end
  93. end
  94. #==============================================================================
  95. # ** Window_Gold
  96. #------------------------------------------------------------------------------
  97. #  Esta janela exibe a quantia de dinheiro.
  98. #==============================================================================
  99. class Window_Gold < Window_Base
  100.   #--------------------------------------------------------------------------
  101.   # * Aliases
  102.   #--------------------------------------------------------------------------
  103.   alias ring_menu_initialize  initialize
  104.   alias ring_menu_refresh     refresh
  105.   #--------------------------------------------------------------------------
  106.   # * Inicialização do objeto
  107.   #--------------------------------------------------------------------------
  108.   def initialize
  109.     ring_menu_initialize
  110.     self.opacity = 0
  111.   end
  112.   #--------------------------------------------------------------------------
  113.   # * Renovação
  114.   #--------------------------------------------------------------------------
  115.   def refresh
  116.     ring_menu_refresh
  117.     draw_icon(RingMenu::GOLD_ICON, 0, 0)
  118.   end
  119. end
  120. #==============================================================================
  121. # ** CommandRing
  122. #------------------------------------------------------------------------------
  123. #  Esta classe representa um anel de comandos do menu circular.
  124. #==============================================================================
  125. class CommandRing < Window_MenuCommand
  126.   #--------------------------------------------------------------------------
  127.   # * Atributos
  128.   #--------------------------------------------------------------------------
  129.   attr_accessor   :active
  130.   attr_accessor   :index
  131.   attr_reader     :spin
  132.   attr_reader     :list
  133.   #--------------------------------------------------------------------------
  134.   # * Inicialização do objeto
  135.   #--------------------------------------------------------------------------
  136.   def initialize
  137.     clear_command_list
  138.     make_command_list
  139.     @active = true
  140.     @handler = {}
  141.     @index = 0
  142.     @spin = 0
  143.     create_spriteset
  144.   end
  145.   #--------------------------------------------------------------------------
  146.   # * Criação do spriteset
  147.   #--------------------------------------------------------------------------
  148.   def create_spriteset
  149.     @spriteset = Spriteset_CommandRing.new(self)
  150.   end
  151.   #--------------------------------------------------------------------------
  152.   # * Verifica se o menu está aberto
  153.   #--------------------------------------------------------------------------
  154.   def open?
  155.     true
  156.   end
  157.   #--------------------------------------------------------------------------
  158.   # * Atualização do objeto
  159.   #--------------------------------------------------------------------------
  160.   def update
  161.     process_cursor_move
  162.     process_handling
  163.     update_spin
  164.     update_spriteset
  165.   end
  166.   #--------------------------------------------------------------------------
  167.   # * Atualização da rotação
  168.   #--------------------------------------------------------------------------
  169.   def update_spin
  170.     @spin -= @spin <=> 0
  171.   end
  172.   #--------------------------------------------------------------------------
  173.   # * Atualização do spriteset
  174.   #--------------------------------------------------------------------------
  175.   def update_spriteset
  176.     @spriteset.update
  177.   end
  178.   #--------------------------------------------------------------------------
  179.   # * Execução da rotação do anel
  180.   #--------------------------------------------------------------------------
  181.   def process_cursor_move
  182.     return unless cursor_movable?
  183.     dir = Input.dir4
  184.     return if dir.zero?
  185.     Sound.play_cursor
  186.     return prev_item if dir > 5
  187.     return next_item
  188.   end
  189.   #--------------------------------------------------------------------------
  190.   # * Verifica se pode mover o cursor
  191.   #--------------------------------------------------------------------------
  192.   def cursor_movable?
  193.     active and @spin == 0
  194.   end
  195.   #--------------------------------------------------------------------------
  196.   # * Avança um item
  197.   #--------------------------------------------------------------------------
  198.   def next_item
  199.     @index += 1
  200.     @index %= @list.size
  201.     @spin = -RingMenu::SPIN_DURATION
  202.   end
  203.   #--------------------------------------------------------------------------
  204.   # * Volta um item
  205.   #--------------------------------------------------------------------------
  206.   def prev_item
  207.     @index -= 1
  208.     @index %= @list.size
  209.     @spin = RingMenu::SPIN_DURATION
  210.   end
  211.   #--------------------------------------------------------------------------
  212.   # * Disposição do objeto
  213.   #--------------------------------------------------------------------------
  214.   def dispose
  215.     @spriteset.dispose
  216.   end
  217. end
  218. #==============================================================================
  219. # ** CharacterRing
  220. #------------------------------------------------------------------------------
  221. #  Esta classe representa um anel de personagens do menu circular.
  222. #==============================================================================
  223. class CharacterRing < CommandRing
  224.   #--------------------------------------------------------------------------
  225.   # * Variáveis públicas
  226.   #--------------------------------------------------------------------------
  227.   attr_reader   :pending_index            # Manter a posição (para organizar)
  228.   #--------------------------------------------------------------------------
  229.   # * Inicialização do objeto
  230.   #--------------------------------------------------------------------------
  231.   def initialize
  232.     super
  233.     @pending_index = -1
  234.   end
  235.   #--------------------------------------------------------------------------
  236.   # * Criação do spriteset
  237.   #--------------------------------------------------------------------------
  238.   def create_spriteset
  239.     @spriteset = Spriteset_CharacterRing.new(self)
  240.   end
  241.   #--------------------------------------------------------------------------
  242.   # * Criação da lista de comandos
  243.   #--------------------------------------------------------------------------
  244.   def make_command_list
  245.     for actor in $game_party.members
  246.       add_command(actor.name, actor)
  247.     end
  248.   end
  249.   #--------------------------------------------------------------------------
  250.   # * Redesenho do item
  251.   #     index : índice do item
  252.   #--------------------------------------------------------------------------
  253.   def redraw_item(index)
  254.   end
  255.   #--------------------------------------------------------------------------
  256.   # * Ativação da janela
  257.   #--------------------------------------------------------------------------
  258.   def activate
  259.     super
  260.     clear_command_list
  261.     make_command_list
  262.     @spriteset.redraw
  263.   end
  264.   #--------------------------------------------------------------------------
  265.   # * Processamento de confirmação
  266.   #--------------------------------------------------------------------------
  267.   def process_ok
  268.     super
  269.     $game_party.menu_actor = $game_party.members[index]
  270.   end
  271.   #--------------------------------------------------------------------------
  272.   # * Retorno à seleção anterior
  273.   #--------------------------------------------------------------------------
  274.   def select_last
  275.     select($game_party.menu_actor.index || 0)
  276.   end
  277.   #--------------------------------------------------------------------------
  278.   # * Definição de última posição (para organizar)
  279.   #--------------------------------------------------------------------------
  280.   def pending_index=(index)
  281.     last_pending_index = @pending_index
  282.     @pending_index = index
  283.   end
  284. end
  285. #==============================================================================
  286. # ** Sprite_CommandRingItem
  287. #------------------------------------------------------------------------------
  288. #  Este sprite é usado para exibir itens no anel do menu em círculo.
  289. #==============================================================================
  290. class Sprite_CommandRingItem < Sprite
  291.   #--------------------------------------------------------------------------
  292.   # * Inicialização do objeto
  293.   #     viewport  : camada
  294.   #     label     : rótulo
  295.   #     symbol    : comando
  296.   #--------------------------------------------------------------------------
  297.   def initialize(viewport, label, symbol)
  298.     super(viewport)
  299.     @label = label
  300.     @symbol = symbol
  301.     create_bitmap
  302.   end
  303.   #--------------------------------------------------------------------------
  304.   # * Redesenha o sprite
  305.   #--------------------------------------------------------------------------
  306.   def redraw
  307.     self.bitmap.dispose if self.bitmap
  308.     create_bitmap
  309.   end
  310.   #--------------------------------------------------------------------------
  311.   # * Criação do bitmap
  312.   #--------------------------------------------------------------------------
  313.   def create_bitmap
  314.     width = [icon_width, label_width].max
  315.     height = icon_height + label_height
  316.     self.bitmap = Bitmap.new(width, height)
  317.     draw_icon
  318.     draw_label
  319.     self.ox = self.bitmap.width / 2
  320.     self.oy = self.bitmap.height / 2
  321.   end
  322.   #--------------------------------------------------------------------------
  323.   # * Largura do ícone
  324.   #--------------------------------------------------------------------------
  325.   def icon_width
  326.     24
  327.   end
  328.   #--------------------------------------------------------------------------
  329.   # * Altura do ícone
  330.   #--------------------------------------------------------------------------
  331.   def icon_height
  332.     24
  333.   end
  334.   #--------------------------------------------------------------------------
  335.   # * Largura do rótulo
  336.   #--------------------------------------------------------------------------
  337.   def label_width
  338.     bitmap = Cache.empty_bitmap
  339.     bitmap.font.size = RingMenu::FONT_SIZE
  340.     bitmap.text_size(@label).width
  341.   end
  342.   #--------------------------------------------------------------------------
  343.   # * Altura do rótulo
  344.   #--------------------------------------------------------------------------
  345.   def label_height
  346.     RingMenu::FONT_SIZE
  347.   end
  348.   #--------------------------------------------------------------------------
  349.   # * Desenha o ícone
  350.   #--------------------------------------------------------------------------
  351.   def draw_icon
  352.     iconset = Cache.system("Iconset")
  353.     icon_index = RingMenu::ICONS[@symbol]
  354.     rect = Rect.new(0, 0, 24, 24)
  355.     rect.x = icon_index % 16 * 24
  356.     rect.y = icon_index / 16 * 24
  357.     self.bitmap.blt((width - rect.width) / 2, 0, iconset, rect)
  358.   end
  359.   #--------------------------------------------------------------------------
  360.   # * Desenha o rótulo
  361.   #--------------------------------------------------------------------------
  362.   def draw_label
  363.     rect = Rect.new(0, icon_height, self.width, label_height)
  364.     self.bitmap.draw_text(rect, @label, 1)
  365.   end
  366. end
  367. #==============================================================================
  368. # ** Sprite_CharacterRingItem
  369. #------------------------------------------------------------------------------
  370. #  Este sprite é usado para exibir personagens no anel do menu em círculo.
  371. #==============================================================================
  372. class Sprite_CharacterRingItem < Sprite_CommandRingItem
  373.   #--------------------------------------------------------------------------
  374.   # * Inicialização do objeto
  375.   #     viewport  : camada
  376.   #     actor     : personagem (Game_Actor)
  377.   #--------------------------------------------------------------------------
  378.   def initialize(viewport, actor)
  379.     @actor = actor
  380.     @animate = false
  381.     @pattern = 0
  382.     @anime_count = 0
  383.     super(viewport, actor.name, nil)
  384.   end
  385.   #--------------------------------------------------------------------------
  386.   # * Bitmap do charset
  387.   #--------------------------------------------------------------------------
  388.   def charset
  389.     Cache.character(@actor.character_name)
  390.   end
  391.   #--------------------------------------------------------------------------
  392.   # * Largura do ícone
  393.   #--------------------------------------------------------------------------
  394.   def icon_width
  395.     sign = @actor.character_name[/^[\!\$]./]
  396.     if sign && sign.include?('$')
  397.       charset.width / 3
  398.     else
  399.       charset.width / 12
  400.     end
  401.   end
  402.   #--------------------------------------------------------------------------
  403.   # * Altura do ícone
  404.   #--------------------------------------------------------------------------
  405.   def icon_height
  406.     sign = @actor.character_name[/^[\!\$]./]
  407.     if sign && sign.include?('$')
  408.       charset.height / 4
  409.     else
  410.       charset.height / 8
  411.     end
  412.   end
  413.   #--------------------------------------------------------------------------
  414.   # * Retângulo do char
  415.   #--------------------------------------------------------------------------
  416.   def character_rect
  417.     index = @actor.character_index
  418.     pattern = 1
  419.     direction = 2
  420.     cw = icon_width
  421.     ch = icon_height
  422.     sx = (index % 4 * 3 + pattern) * cw
  423.     sy = (index / 4 * 4 + (direction - 2) / 2) * ch
  424.     Rect.new(sx, sy, cw, ch)
  425.   end
  426.   #--------------------------------------------------------------------------
  427.   # * Desenha o ícone
  428.   #--------------------------------------------------------------------------
  429.   def draw_icon
  430.     x = (width - icon_width) / 2
  431.     y = 0
  432.     self.bitmap.clear_rect(x, y, icon_width, icon_height)
  433.     self.bitmap.blt(x, y, charset, character_rect)
  434.   end
  435. end
  436. #==============================================================================
  437. # ** Spriteset_CommandRing
  438. #------------------------------------------------------------------------------
  439. #  Classe do spriteset dos comandos em anel do menu.
  440. #==============================================================================
  441. class Spriteset_CommandRing
  442.   #--------------------------------------------------------------------------
  443.   # * Inicialização do objeto
  444.   #     parent    : CommandRing
  445.   #     viewport  : camada
  446.   #--------------------------------------------------------------------------
  447.   def initialize(parent, viewport = nil)
  448.     @parent = parent
  449.     @viewport = viewport
  450.     redraw
  451.   end
  452.   #--------------------------------------------------------------------------
  453.   # * Redesenho do spriteset
  454.   #--------------------------------------------------------------------------
  455.   def redraw
  456.     dispose if @items
  457.     clear_items
  458.     create_items
  459.     update
  460.   end
  461.   #--------------------------------------------------------------------------
  462.   # * Limpeza dos itens
  463.   #--------------------------------------------------------------------------
  464.   def clear_items
  465.     @items = []
  466.   end
  467.   #--------------------------------------------------------------------------
  468.   # * Criação dos itens
  469.   #--------------------------------------------------------------------------
  470.   def create_items
  471.     for item in @parent.list
  472.       add_item(item[:name], item[:symbol])
  473.     end
  474.   end
  475.   #--------------------------------------------------------------------------
  476.   # * Adiciona um item ao spriteset
  477.   #     label   : rótulo do comando
  478.   #     symbol  : comando
  479.   #--------------------------------------------------------------------------
  480.   def add_item(label, symbol)
  481.     @items.push(Sprite_CommandRingItem.new(@viewport, label, symbol))
  482.   end
  483.   #--------------------------------------------------------------------------
  484.   # * Atualização do objeto
  485.   #--------------------------------------------------------------------------
  486.   def update
  487.     @items.each(&:update)
  488.     update_items
  489.   end
  490.   #--------------------------------------------------------------------------
  491.   # * Atualização dos itens do anel
  492.   #--------------------------------------------------------------------------
  493.   def update_items
  494.     for item, index in @items.each_with_index
  495.       item.x = adjust_x(index)
  496.       item.y = adjust_y(index)
  497.       item.opacity = selected?(index) ? 255 : 125
  498.       item.visible = @parent.active
  499.     end
  500.   end
  501.   #--------------------------------------------------------------------------
  502.   # * Verifica se um índice está selecionado
  503.   #--------------------------------------------------------------------------
  504.   def selected?(index)
  505.     index == @parent.index
  506.   end
  507.   #--------------------------------------------------------------------------
  508.   # * Calcula o ângulo de um item no anel
  509.   #     index : Índice do item
  510.   #--------------------------------------------------------------------------
  511.   def adjust_angle(index)
  512.     spin = @parent.spin.to_f / RingMenu::SPIN_DURATION
  513.     relative_index = index - @parent.index
  514.     (relative_index - spin) * Math::PI * 2 / @items.size + angle_offset
  515.   end
  516.   #--------------------------------------------------------------------------
  517.   # * Deslocamento angular
  518.   #--------------------------------------------------------------------------
  519.   def angle_offset
  520.     Math::PI / 2
  521.   end
  522.   #--------------------------------------------------------------------------
  523.   # * Calcula a posição X de um item
  524.   #     index : Índice do item
  525.   #--------------------------------------------------------------------------
  526.   def adjust_x(index)
  527.     center_x + Math.cos(adjust_angle(index)) * radius
  528.   end
  529.   #--------------------------------------------------------------------------
  530.   # * Calcula a posição Y de um item
  531.   #     index : Índice do item
  532.   #--------------------------------------------------------------------------
  533.   def adjust_y(index)
  534.     center_y + Math.sin(adjust_angle(index)) * radius
  535.   end
  536.   #--------------------------------------------------------------------------
  537.   # * Posição X do centro do anel
  538.   #--------------------------------------------------------------------------
  539.   def center_x
  540.     $game_player.screen_x
  541.   end
  542.   #--------------------------------------------------------------------------
  543.   # * Posição Y do centro do anel
  544.   #--------------------------------------------------------------------------
  545.   def center_y
  546.     $game_player.screen_y
  547.   end
  548.   #--------------------------------------------------------------------------
  549.   # * Raio do anel
  550.   #--------------------------------------------------------------------------
  551.   def radius
  552.     RingMenu::RADIUS
  553.   end
  554.   #--------------------------------------------------------------------------
  555.   # * Disposição do objeto
  556.   #--------------------------------------------------------------------------
  557.   def dispose
  558.     @items.each(&:dispose)
  559.   end
  560. end
  561. #==============================================================================
  562. # ** Spriteset_CharacterRing
  563. #------------------------------------------------------------------------------
  564. #  Classe do spriteset da seleção dos personagens em anel do menu.
  565. #==============================================================================
  566. class Spriteset_CharacterRing < Spriteset_CommandRing
  567.   #--------------------------------------------------------------------------
  568.   # * Adiciona um item ao spriteset
  569.   #     name  : nome do personagem
  570.   #     actor : personagem (Game_Actor)
  571.   #--------------------------------------------------------------------------
  572.   def add_item(name, actor)
  573.     @items.push(Sprite_CharacterRingItem.new(@viewport, actor))
  574.   end
  575.   #--------------------------------------------------------------------------
  576.   # * Verifica se um índice está selecionado
  577.   #--------------------------------------------------------------------------
  578.   def selected?(index)
  579.     super or index == @parent.pending_index
  580.   end
  581. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement