赞 | 138 |
VIP | 123 |
好人卡 | 5 |
积分 | 271 |
经验 | 44877 |
最后登录 | 2019-12-24 |
在线时间 | 1535 小时 |
Lv5.捕梦者
- 梦石
- 0
- 星屑
- 27128
- 在线时间
- 1535 小时
- 注册时间
- 2006-1-10
- 帖子
- 2063
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
转载 Syvkal's Ring Menu VXAce
来源:http://www.rpgmakervxace.net/topic/1836-ring-menu-vxace/
说明
把图标放在下材料科
必须包括在“Pictures”文件夹菜单图标(48×48)。 或使用这些:
- #==============================================================================
- # ** Ring Menu
- #------------------------------------------------------------------------------
- # by Syvkal
- # Version 1.2
- # 03-04-12
- #------------------------------------------------------------------------------
- # * Original available at:
- # www.rpgmakervxace.net & forums.rpgmakerweb.com
- # Please do not redistribute this script
- #------------------------------------------------------------------------------
- # * Terms of Use
- # Available for use in commercial games provided that I get a free copy :P
- # Email me: [email protected]
- # Please do not redistribute this script
- #==============================================================================
- #
- # - INTRODUCTION -
- #
- # This system implements a Plug 'N' Play Ring Menu
- # Movement based off XRXS, Dubealex & Hypershadow180's original XP Ring Menu,
- # which was devised through some simple, but clever trigonometry
- #
- #------------------------------------------------------------------------------
- #
- # - USAGE -
- #
- # Any additional scenes that are added to the menu require an icon
- # Place them in the pictures folder, they are advised to be 48x48 pixels
- #
- # The name of the icons must be of the form:
- # [Command Name] Icon
- #
- # For example 'Items Icon.png' or 'Equipment Icon.png'
- #
- # If you are unsure what it needs to be called, wait for the error message,
- # then call it the name of the file it can not find
- #
- #------------------------------------------------------------------------------
- #
- # - COMPATIBILITY -
- #
- # Additional scenes should be automatically added assuming thier creators
- # utilise the 'add_original_commands' feature in Window_MenuCommand
- #
- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- #
- # This script redefines the following methods:
- # * create_status_window (Scene_Menu)
- # * on_formation_ok (Scene_Menu)
- # * on_formation_cancel (Scene_Menu)
- # * draw_character (Window_Base)
- #
- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- #
- # This script Aliases the following methods:
- # * add_save_command (Window_MenuCommand)
- # * start (Scene_Menu)
- # * create_command_window (Scene_Menu)
- # * command_personal (Scene_Menu)
- # * command_formation (Scene_Menu)
- # * on_personal_cancel (Scene_Menu)
- #
- #==============================================================================
- #===================================================#
- # ** C O N F I G U R A T I O N S Y S T E M ** #
- #===================================================#
-
- #--------------------------------------------------------------------------
- # * Startup Frames
- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- # Amount of frames for the Startup Animation
- #--------------------------------------------------------------------------
- STARTUP_FRAMES = 20
- #--------------------------------------------------------------------------
- # * Movement Frames
- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- # Amount of frames for Movement Animation
- #--------------------------------------------------------------------------
- MOVING_FRAMES = 15
- #--------------------------------------------------------------------------
- # * Menu Ring Radius
- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- # Radius of the Menu Ring
- #--------------------------------------------------------------------------
- RING_R = 75
- #--------------------------------------------------------------------------
- # * Show Disabled Options
- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- # Set to false to exclude disabled options for the menu
- #--------------------------------------------------------------------------
- DISABLED_SHOW = false
- #--------------------------------------------------------------------------
- # * Disabled Icon
- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- # The icon displayed over disabled options
- # (only used when DISABLED_SHOW = true)
- #--------------------------------------------------------------------------
- ICON_DISABLE = Cache::picture('Disable Icon')
- #--------------------------------------------------------------------------
- # * Skip Single Actor Select
- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- # Set to true to skip the actor selection if there's only one party member
- #--------------------------------------------------------------------------
- ACTOR_SKIP = true
- #--------------------------------------------------------------------------
- # * Load Command Vocab
- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- # Text displayed for the loading option
- #--------------------------------------------------------------------------
- Vocab::Load = "Load"
-
- #===================================================#
- # ** E N D C O N F I G U R A T I O N ** #
- #===================================================#
- #==============================================================================
- # ** Ring_Menu Module
- #------------------------------------------------------------------------------
- # Module designed to rewrite methods defined in the desired Superclass.
- #==============================================================================
- module Ring_Menu
- #--------------------------------------------------------------------------
- # * Object Initialization
- #--------------------------------------------------------------------------
- def initialize(*args)
- super(*args)
- @cx = contents.width / 2; @cy = contents.height / 2
- self.opacity = 0
- @startup = STARTUP_FRAMES
- @icons = []
- @mode = :start
- @steps = @startup
- end
- #--------------------------------------------------------------------------
- # * Update Cursor
- #--------------------------------------------------------------------------
- def update_cursor
- end
- #--------------------------------------------------------------------------
- # * Determines if is moving
- #--------------------------------------------------------------------------
- def animation?
- return @mode != :wait
- end
- #--------------------------------------------------------------------------
- # * Move Cursor Down
- #--------------------------------------------------------------------------
- def cursor_down(wrap)
- cursor_right(wrap)
- end
- #--------------------------------------------------------------------------
- # * Move Cursor Up
- #--------------------------------------------------------------------------
- def cursor_up(wrap)
- cursor_left(wrap)
- end
- #--------------------------------------------------------------------------
- # * Move Cursor Right
- #--------------------------------------------------------------------------
- def cursor_right(wrap)
- unless animation?
- select((index + 1) % item_max)
- @mode = :mover
- @steps = MOVING_FRAMES
- Sound.play_cursor
- end
- end
- #--------------------------------------------------------------------------
- # * Move Cursor Left
- #--------------------------------------------------------------------------
- def cursor_left(wrap)
- unless animation?
- select((index - 1 + item_max) % item_max)
- @mode = :movel
- @steps = MOVING_FRAMES
- Sound.play_cursor
- end
- end
- #--------------------------------------------------------------------------
- # * Frame Update
- #--------------------------------------------------------------------------
- def update
- super
- refresh if animation?
- end
- #--------------------------------------------------------------------------
- # * Refresh
- #--------------------------------------------------------------------------
- def refresh
- self.contents.clear
- case @mode
- when :start
- refresh_start
- when :wait
- refresh_wait
- when :mover
- refresh_move(1)
- when :movel
- refresh_move(0)
- end
- end
- #--------------------------------------------------------------------------
- # * Refresh Start Period
- #--------------------------------------------------------------------------
- def refresh_start
- d1 = 2.0 * Math::PI / item_max
- d2 = 1.0 * Math::PI / @startup
- r = RING_R - 1.0 * RING_R * @steps / @startup
- for i in 0...item_max
- d = d1 * i + 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 < 0
- @mode = :wait
- end
- end
- #--------------------------------------------------------------------------
- # * Refresh Wait Period
- #--------------------------------------------------------------------------
- def refresh_wait
- d = 2.0 * Math::PI / item_max
- for i in 0...item_max
- j = i - index
- x = @cx + ( RING_R * Math.sin( d * j) ).to_i
- y = @cy - ( RING_R * Math.cos( d * j) ).to_i
- draw_item(x, y, i)
- end
- end
- #--------------------------------------------------------------------------
- # * Refresh Movement Period
- #--------------------------------------------------------------------------
- def refresh_move( mode )
- d1 = 2.0 * Math::PI / item_max
- d2 = d1 / MOVING_FRAMES
- d2 *= -1 unless mode != 0
- for i in 0...item_max
- j = i - index
- d = d1 * j + d2 * @steps
- x = @cx + ( RING_R * Math.sin( d ) ).to_i
- y = @cy - ( RING_R * Math.cos( d ) ).to_i
- draw_item(x, y, i)
- end
- @steps -= 1
- if @steps < 0
- @mode = :wait
- end
- end
- end
- #==============================================================================
- # ** Window_MenuCommand
- #------------------------------------------------------------------------------
- # Converted into a Ring Menu.
- #==============================================================================
- class Window_MenuCommand < Window_Command
- #--------------------------------------------------------------------------
- # * Includes The Ring_Menu Module
- #--------------------------------------------------------------------------
- include Ring_Menu
- #--------------------------------------------------------------------------
- # * Alias Listings
- #--------------------------------------------------------------------------
- alias add_save_command_ring_menu_original add_save_command
- #--------------------------------------------------------------------------
- # * Object Initialization
- #--------------------------------------------------------------------------
- def initialize
- super(0, 0)
- unless DISABLED_SHOW
- @list.delete_if {|i| !i[:enabled]}
- end
- for i in 0...item_max
- @icons.push(Cache::picture(command_name(i) + ' Icon'))
- end
- if @@last_command_symbol != nil
- index = @list.index(@@last_command_symbol)
- @mode = :wait
- end
- select_last
- refresh
- end
- #--------------------------------------------------------------------------
- # * Refresh
- #--------------------------------------------------------------------------
- def refresh
- super
- rect = Rect.new(0, 196, self.contents.width, line_height)
- draw_text(rect, command_name(index), 1)
- end
- #--------------------------------------------------------------------------
- # * Get Window Width
- #--------------------------------------------------------------------------
- def window_width
- return 544
- end
- #--------------------------------------------------------------------------
- # * Get Window Height
- #--------------------------------------------------------------------------
- def window_height
- return 416
- end
- #--------------------------------------------------------------------------
- # * Add Load to Command List
- #--------------------------------------------------------------------------
- def add_save_command
- add_save_command_ring_menu_original
- add_command(Vocab::Load, :load)
- end
- #--------------------------------------------------------------------------
- # * Draw Item
- # x : draw spot x-coordinate
- # y : draw spot y-coordinate
- # i : item number
- #--------------------------------------------------------------------------
- def draw_item(x, y, i)
- rect = Rect.new(0, 0, @icons[i].width, @icons[i].height)
- if i == index
- self.contents.blt(x - rect.width/2, y - rect.height/2, @icons[i], rect )
- unless command_enabled?(index)
- self.contents.blt(x - rect.width/2, y - rect.height/2, ICON_DISABLE, rect )
- end
- else
- self.contents.blt(x - rect.width/2, y - rect.height/2, @icons[i], rect, 128 )
- end
- end
- end
- #==============================================================================
- # ** Window_RingStatus
- #------------------------------------------------------------------------------
- # Ring Menu for selection of Party Members
- #==============================================================================
- class Window_RingStatus < Window_Selectable
- #--------------------------------------------------------------------------
- # * Includes The Ring_Menu Module
- #--------------------------------------------------------------------------
- include Ring_Menu
- #--------------------------------------------------------------------------
- # * Public Instance Variables
- #--------------------------------------------------------------------------
- attr_accessor :pending_index # Pending position (for formation)
- attr_accessor :pending # Pending
- #--------------------------------------------------------------------------
- # * Object Initialization
- #--------------------------------------------------------------------------
- def initialize
- super(0, 0, 544, 416)
- self.hide
- @mode = :wait
- @pending_index = -1
- @pending = false
- refresh
- end
- #--------------------------------------------------------------------------
- # * Refresh
- #--------------------------------------------------------------------------
- def refresh
- super
- rect = Rect.new(0, 196, self.contents.width, line_height)
- draw_text(rect, $game_party.members[index].name, 1)
- end
- #--------------------------------------------------------------------------
- # * Get Number of Items
- #--------------------------------------------------------------------------
- def item_max
- $game_party.members.size
- end
- #--------------------------------------------------------------------------
- # * Refresh Movement Period
- #--------------------------------------------------------------------------
- def refresh_move( mode )
- unless pending_index >= 0
- super
- else
- d = 2.0 * Math::PI / item_max
- for i in 0...item_max
- j = i - pending_index
- x = @cx + ( RING_R * Math.sin( d * j) ).to_i
- y = @cy - ( RING_R * Math.cos( d * j) ).to_i
- draw_item(x, y, i)
- end
- @mode = :wait
- end
- end
- #--------------------------------------------------------------------------
- # * Draw Item
- # x : draw spot x-coordinate
- # y : draw spot y-coordinate
- # index : item number
- #--------------------------------------------------------------------------
- def draw_item(x, y, i)
- if i == index && !(@pending && @pending_index < 0)
- draw_character($game_party.members[i].character_name,
- $game_party.members[i].character_index , x, y, true, true)
- else
- draw_character($game_party.members[i].character_name,
- $game_party.members[i].character_index , x, y, false, true)
- end
- end
- #--------------------------------------------------------------------------
- # * Processing When OK Button Is Pressed
- #--------------------------------------------------------------------------
- def process_ok
- super
- $game_party.menu_actor = $game_party.members[index] unless pending
- end
- #--------------------------------------------------------------------------
- # * Restore Previous Selection Position
- #--------------------------------------------------------------------------
- def select_last
- select($game_party.members.index($game_party.menu_actor) || 0)
- refresh
- end
- end
- #==============================================================================
- # ** Scene_Menu
- #==============================================================================
- class Scene_Menu < Scene_MenuBase
- #--------------------------------------------------------------------------
- # * Alias Listings
- #--------------------------------------------------------------------------
- alias start_ring_original start
- alias create_command_window_ring_menu_original create_command_window
- alias command_personal_ring_original command_personal
- alias command_formation_ring_original command_formation
- alias on_personal_cancel_ring_original on_personal_cancel
- #--------------------------------------------------------------------------
- # * Start Processing
- #--------------------------------------------------------------------------
- def start
- start_ring_original
- create_location_window
- end
- #--------------------------------------------------------------------------
- # * Create Location Window
- #--------------------------------------------------------------------------
- def create_location_window
- @location_window = Window_location.new(0, 0)
- end
- #--------------------------------------------------------------------------
- # * Create Command Window
- #--------------------------------------------------------------------------
- def create_command_window
- create_command_window_ring_menu_original
- @command_window.set_handler(:load, method(:command_load))
- end
- #--------------------------------------------------------------------------
- # * Create Status Window
- #--------------------------------------------------------------------------
- def create_status_window
- @status_window = Window_RingStatus.new
- end
- #--------------------------------------------------------------------------
- # * [Skill], [Equipment] and [Status] Commands
- #--------------------------------------------------------------------------
- def command_personal
- if $game_party.members.size < 2 && ACTOR_SKIP
- on_personal_ok
- else
- @command_window.hide
- @status_window.show
- command_personal_ring_original
- end
- end
- #--------------------------------------------------------------------------
- # * [Formation] Command
- #--------------------------------------------------------------------------
- def command_formation
- @status_window.pending = true
- @command_window.hide
- command_formation_ring_original
- @status_window.index = 0
- @status_window.refresh
- @status_window.show
- end
- #--------------------------------------------------------------------------
- # * [Load] Command
- #--------------------------------------------------------------------------
- def command_load
- SceneManager.call(Scene_Load)
- end
- #--------------------------------------------------------------------------
- # * [Cancel] Personal Command
- #--------------------------------------------------------------------------
- def on_personal_cancel
- @status_window.hide
- on_personal_cancel_ring_original
- @status_window.deactivate
- @command_window.show
- end
- #--------------------------------------------------------------------------
- # * Formation [OK]
- #--------------------------------------------------------------------------
- def on_formation_ok
- if @status_window.pending_index >= 0
- $game_party.swap_order(@status_window.index,
- @status_window.pending_index)
- @status_window.index = @status_window.pending_index
- @status_window.pending_index = -1
- else
- @status_window.pending_index = @status_window.index
- end
- @status_window.refresh
- @status_window.activate
- end
- #--------------------------------------------------------------------------
- # * Formation [Cancel]
- #--------------------------------------------------------------------------
- def on_formation_cancel
- if @status_window.pending_index >= 0
- @status_window.index = @status_window.pending_index
- @status_window.pending_index = -1
- @status_window.activate
- @status_window.refresh
- else
- @status_window.pending = false
- @status_window.hide
- @status_window.select_last
- @status_window.deactivate
- @command_window.show
- @command_window.activate
- end
- end
- end
- #==============================================================================
- # ** Window_Base
- #------------------------------------------------------------------------------
- # Edited to allow disabled character icons and y centring
- #==============================================================================
- class Window_Base < Window
- #--------------------------------------------------------------------------
- # * Draw Character Graphic
- #--------------------------------------------------------------------------
- def draw_character(character_name, character_index, x, y, enabled = true, centred = false)
- return if character_name == nil
- bitmap = Cache.character(character_name)
- sign = character_name[/^[\!\$]./]
- if sign && sign.include?('$')
- cw = bitmap.width / 3
- ch = bitmap.height / 4
- else
- cw = bitmap.width / 12
- ch = bitmap.height / 8
- end
- n = character_index
- src_rect = Rect.new((n%4*3+1)*cw, (n/4*4)*ch, cw, ch)
- self.contents.blt(x - cw / 2, centred ? y - ch/2 : y - ch, bitmap, src_rect,
- enabled ? 255 : 128)
- end
- end
- #==============================================================================
- # ** Window_Location
- #------------------------------------------------------------------------------
- # This class shows the current map name.
- #==============================================================================
- class Window_location < Window_Base
- #--------------------------------------------------------------------------
- # * Object Initialization
- #--------------------------------------------------------------------------
- def initialize(x, y)
- super(x, y, 160, (line_height*2) + 32)
- refresh
- end
- #--------------------------------------------------------------------------
- # * Refresh
- #--------------------------------------------------------------------------
- def refresh
- contents.clear
- @map = load_data(sprintf("Data/Map%03d.rvdata2", $game_map.map_id))
- change_color(system_color)
- draw_text(4, 0, 128, line_height, "Location :")
- change_color(normal_color)
- draw_text(0, line_height, 128, line_height, @map.display_name, 1)
- end
- end
复制代码 Introduction
Recreating my Ring Menu for VXAce ^-^
Terms of Use
Please read the Script Header
Features
Main Menu Ring Menu
Actor Selection Ring Menu
Option to exclude disabled options (I don't like my Disable Icon any more )
Option to skip Actor Selection when there is only one member in the party
Screenshots
Compatibility
Additional scenes should be automatically added assuming thier creators utilise the 'add_original_commands' feature in Window_MenuCommand
This script redefines the following methods:
create_status_window (Scene_Menu)
on_formation_ok (Scene_Menu)
on_formation_cancel (Scene_Menu)
draw_character (Window_Base)
This script Aliases the following methods:
add_save_command (Window_MenuCommand)
start (Scene_Menu)
create_command_window (Scene_Menu)
command_personal (Scene_Menu)
command_formation (Scene_Menu)
on_personal_cancel (Scene_Menu)
Author's Notes
Pretty much made from scratch again for VXAce. I wanted to remake the animation coding so it was entirely mine, but I realised XRXS, Dubealex & Hypershadow180's original was near flawless so I kept it xD
It's still a little messy and I may clean it up later, but there's now a base class for Ring Menus - so it should be easier for you to make your own (though it currently uses Window_MenuCommand as a superclass for convenience... ^-^ [Now edited so the base works like Window_Selectable while retaining the Window_Command features - may be updated to split them later] |
评分
-
查看全部评分
|