Customizable Ring Menus
#1
This is a locked, single-post thread from Creation Asylum. Archived here to prevent its loss.
No support is given.


This Code allows you to make Customizable Ring Menu's as you would Command Windows.

Insert this Below Window_Command
Code:
#==============================================================================
# Window_RingMenu
#-----------------------------------------------------------------
#  Created By SephirothSpawn (10.29.05)
#     Last Updated: (11.11.05)
#==============================================================================

#==============================================================================
# Class Window Ring Menu
#==============================================================================
class Window_RingMenu < Window_Base
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :index
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(commands, icons, radius = 64, center_x = nil, center_y = nil, width = 640, height = 480)
    # Sets Up Window
    super(0, 0, width, height)
    # Sets Center Coordinates to player Center by Default
    center_x = $game_player.screen_x - 30 if center_x == nil
    center_y = $game_player.screen_y - 48 if center_y == nil
    self.contents = Bitmap.new(width-32, height-32)
    # Select Font Type, Size and Color
    self.contents.font.name = "Arial"
    self.contents.font.size = 22
    self.contents.font.color = Color.new(255, 255, 255, 255)
    # Sets up Window Border and Window Background Opacity
    self.opacity, self.back_opacity = 0, 0
    # Sets Up Commands & Icons
    @commands = commands
    @item_max = commands.size
    @index = 0
    @items = icons
    # Sets Up Radius
    @radius = radius
    # Sets Up Disabled Items
    @disabled = Array.new(@item_max, false)
    # Sets Up Center of Ring
    @cx = center_x
    @cy = center_y
    # Disabled Icon
    @icon_disable = RPG::Cache.icon("")
    # Frame Setup
    @startup_frames = 20
    @moving_frames = 5
    setup_move_start
    refresh
  end
  #--------------------------------------------------------------------------
  # * Setup Move Start
  #--------------------------------------------------------------------------
  def setup_move_start
    @mode = 1
    @steps = @startup_frames
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    case @mode
      when 1; refresh_start
      when 2; refresh_wait
      when 3; refresh_move(1)
      when 4; refresh_move(0)
    end
    rect = Rect.new(@cx - 272, @cy + 24, self.contents.width-32, 32)
    self.contents.draw_text(rect, @commands[@index], 1)
  end
  #--------------------------------------------------------------------------
  # * Update
  #--------------------------------------------------------------------------
  def update
    super
    refresh
  end
  #--------------------------------------------------------------------------
  # * Refresh Start
  #--------------------------------------------------------------------------
  def refresh_start
    d1 = 2.0 * Math::PI / @item_max
    d2 = 1.0 * Math::PI / @startup_frames
    r = @radius - 1.0 * @radius * @steps / @startup_frames
    for i in 0...@item_max
      j = i - @index + 1
      d = d1 * j + d2 * @steps
      x = @cx + ( r * Math.sin( d ) ).to_i
      y = @cy - ( r * Math.cos( d ) ).to_i
      draw_item(x, y, i)
    end
    @steps -= 1
    if @steps < 1
      @mode = 2
    end
  end
  #--------------------------------------------------------------------------
  # * Refresh Wait
  #--------------------------------------------------------------------------
  def refresh_wait
    d = 2.0 * Math::PI / @item_max
    for i in 0...@item_max
      j = i - @index + 1
      x = @cx + ( @radius * Math.sin( d * j ) ).to_i
      y = @cy - ( @radius * Math.cos( d * j ) ).to_i
      draw_item(x, y, i)
    end
  end
  #--------------------------------------------------------------------------
  # * Refresh Move
  #--------------------------------------------------------------------------
  def refresh_move( mode )
    d1 = 2.0 * Math::PI / @item_max
    d2 = d1 / @moving_frames
    d2 *= -1 if mode != 0
    for i in 0...@item_max
      j = i - @index + 1
      d = d1 * j + d2 * @steps
      x = @cx + ( @radius * Math.sin( d ) ).to_i
      y = @cy - ( @radius * Math.cos( d ) ).to_i
      draw_item(x, y, i)
    end
    @steps -= 1
    if @steps < 1
      @mode = 2
    end
  end
  #--------------------------------------------------------------------------
  # * Draw Item
  #--------------------------------------------------------------------------
  def draw_item(x, y, i)
    rect = Rect.new(0, 0, @items[i].width, @items[i].height)
    if @index == i
      self.contents.blt( x, y, @items[i], rect )
      if @disabled[@index]
        self.contents.blt( x, y, @icon_disable, rect )
      end
    else
      self.contents.blt( x, y, @items[i], rect, 128 )
      if @disabled[@index]
        self.contents.blt( x, y, @icon_disable, rect, 128 )
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Disable Item
  #--------------------------------------------------------------------------
  def disable_item(index)
    @disabled[index] = true
  end
  #--------------------------------------------------------------------------
  # * Setup Move Move
  #--------------------------------------------------------------------------
  def setup_move_move(mode)
    if mode == 3
      @index -= 1
      @index = @items.size - 1 if @index < 0
    elsif mode == 4
      @index += 1
      @index = 0 if @index >= @items.size
    else
      return
    end
    @mode = mode
    @steps = @moving_frames
  end
  #--------------------------------------------------------------------------
  # * Animation
  #--------------------------------------------------------------------------
  def animation?
    return @mode != 2
  end
end


Now, just call it like this:
Code:
blah = Window_RingMenu.new(commands, icons, radius, center_x, center_y, width, height)


Example calling:
Code:
# Window Commands
    commands = [ "Item", "Skill", "Equip", "Status", "Save", "Quit" ]
    # Window Icons
    icons = [ RPG::Cache.icon("034-Item03"), RPG::Cache.icon("044-Skill01"),
                  RPG::Cache.icon("001-Weapon01"), RPG::Cache.icon("050-Skill07"),
                  RPG::Cache.icon("038-Item07"), RPG::Cache.icon("046-Skill03")]
    @command_window = Window_RingMenu.new(commands, icons,128)


Credits to the Orginal Ring Menu Creator for getting me started.
}


Possibly Related Threads…
Thread Author Replies Views Last Post
  Ring menu edit Tsunokiette 0 2,071 07-26-2005, 01:00 PM
Last Post: Tsunokiette
  Scroll Bar Menus lordsith 0 2,144 07-15-2005, 01:00 PM
Last Post: lordsith



Users browsing this thread: 1 Guest(s)