#==============================================================================
# □ 커스터마이즈 포인트 -By 제스터 개조- RPG게임공작소.
#==============================================================================
class Window_RingMenu < Window_Base
STARTUP_FRAMES = 20 # 초기 애니메이션의 프레임수
MOVING_FRAMES = 5 # 링을 돌렸을 때의 프레임수
RING_R = 64 # 링의 반경
SE_STARTUP = "056-Right02" # 메뉴를 열었을 때에 울리는SE
ICON_ITEM = RPG::Cache.icon("034-Item03") # 「 아이템 」메뉴의 아이콘
ICON_SKILL = RPG::Cache.icon("044-Skill01") # 「스킬 」메뉴의 아이콘
ICON_EQUIP = RPG::Cache.icon("001-Weapon01") # 「 장비 」메뉴의 아이콘
ICON_STATUS = RPG::Cache.icon("050-Skill07") # 「스테이터스」메뉴의 아이콘
ICON_SAVE = RPG::Cache.icon("038-Item07")
ICON_MUSIC = RPG::Cache.icon("040-Item09")
ICON_DISABLE= RPG::Cache.icon("") # 사용 금지 항목을 뒤따르는 아이콘
BACKGROUND_COLOR = Color.new(0xcc,0x99,0x33,0x3f)
end
###############################################################################
# 링 메뉴 도입 스크립트 Ver. 1.2
# writen by 가즈키
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# ▽도입
# 0. 먼저 XRXL 2. 비트 맵/아이콘 묘사 를 넣어 두어 주세요.
# 1. 이 스크립트를Main섹션 위에 ?font color=FF001E style=background-color:FFF000;>링?새로운 섹션에 카피하는
# 2. Window_RingMenu의 상부에 있는 7개의 것 RPG::Cache.icon("") 의 "" 의 안에
# 오른쪽의 설명에 써 있는 커멘드용의 아이콘명을 쓴다.
# (맨 밑의 사용 금지는 선택할 수 없는 메뉴에 거듭하는 아이콘입니다.
# 이런 건이 좋을지도→ φ )
# 3. 아이콘 설정의 바로 아래에 있는 SE_STARTUP = "" 것 "" 의 안에 메뉴를
# 열었을 때에 울리고 싶은 것SE의 이름을 쓴다.
# ▽스크립트 접하는 사람에게
# 우선 움직이는 것을 목표로 ?font color=FF001E style=background-color:FFF000;>링?것이므로(뜻 낮은 w ), 좌표의 조정등이 불완전합니다.
# 보다 정확하게 엑터의 화면 좌표를 취득하는 처리를 추가하거나 엑터 일람의 위치를
# 바꾸거나 문자 표시등 등을 조정하면 좋은 느낌으로 완성될 생각이 듭니다.
###############################################################################
#==============================================================================
# ■ Window_RingMenu
#==============================================================================
class Window_RingMenu < Window_Base
#--------------------------------------------------------------------------
# ○ 클래스 정수
#--------------------------------------------------------------------------
MODE_START = 1 # 스타트 업 애니메이션
MODE_WAIT = 2 # 대기
MODE_MOVER = 3 # 시계회전 회전 애니메이션
MODE_MOVEL = 4 # 반 시계회전 회전 애니메이션
#--------------------------------------------------------------------------
# ○ 악 세사
#--------------------------------------------------------------------------
attr_accessor :index
attr_reader :commands
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
#--------------------------------------------------------------------------
def initialize( center_x, center_y )
super(-16, -16, 640+32, 480+32)
self.contents = Bitmap.new(width-32, height-32)
self.opacity = 0
self.back_opacity = 0
s1 = $data_system.words.item
s2 = $data_system.words.skill
s3 = $data_system.words.equip
s4 = "스테이터스"
s5 = "세이브"
s6 = "음악감상"
@commands = [ s1, s2, s3, s4, s5, s6]
@item_max = 6
@index = 0
@items = [ ICON_ITEM, ICON_SKILL, ICON_EQUIP, ICON_STATUS, ICON_SAVE, ICON_MUSIC]
@disabled = [ false, false, false, false, false, false ]
@cx = center_x
@cy = center_y
setup_move_start
refresh
end
#--------------------------------------------------------------------------
# ● 프레임 갱신
#--------------------------------------------------------------------------
def update
super
refresh
end
#--------------------------------------------------------------------------
# ● 화면재 묘화
#--------------------------------------------------------------------------
def refresh
self.contents.clear
# 배경 묘화
if BACKGROUND_COLOR.alpha > 0
self.contents.fill_rect(0,0,640,480,BACKGROUND_COLOR)
end
# 아이콘을 묘화
case @mode
when MODE_START
refresh_start
when MODE_WAIT
refresh_wait
when MODE_MOVER
refresh_move(1)
when MODE_MOVEL
refresh_move(0)
end
end
#--------------------------------------------------------------------------
# ○ 화면재 묘화(초기화시)
#--------------------------------------------------------------------------
def refresh_start
d1 = 2.0 * Math::PI / @item_max
d2 = 1.0 * Math::PI / STARTUP_FRAMES
r = RING_R - 1.0 * RING_R * @steps / STARTUP_FRAMES
for i in 0...@item_max
j = i - @index
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 = MODE_WAIT
end
end
#--------------------------------------------------------------------------
# ○ 화면재 묘화(대기시)
#--------------------------------------------------------------------------
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
#--------------------------------------------------------------------------
# ○ 화면재 묘화(회전시)
# mode : 0=반 시계회전 1=시계회전
#--------------------------------------------------------------------------
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
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 < 1
@mode = MODE_WAIT
end
end
#--------------------------------------------------------------------------
# ● 항목의 묘화
# x :
# y :
# i : 항목 번호
#--------------------------------------------------------------------------
def draw_item(x, y, i)
rect = Rect.new(0, 0, @items[i].width, @items[i].height)
x -= rect.width/2
y -= rect.height/2
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
#--------------------------------------------------------------------------
# ● 항목을 무효로 하는
# index : 항목 번호
#--------------------------------------------------------------------------
def disable_item(index)
@disabled[index] = true
end
#--------------------------------------------------------------------------
# ○ 초기화 애니메이션의 준비
#--------------------------------------------------------------------------
def setup_move_start
@mode = MODE_START
@steps = STARTUP_FRAMES
if SE_STARTUP != nil and SE_STARTUP != ""
Audio.se_play("Audio/SE/" + SE_STARTUP, 80, 100)
end
end
#--------------------------------------------------------------------------
# ○ 회전 애니메이션의 준비
#--------------------------------------------------------------------------
def setup_move_move(mode)
if mode == MODE_MOVER
@index -= 1
@index = @items.size - 1 if @index < 0
elsif mode == MODE_MOVEL
@index += 1
@index = 0 if @index >= @items.size
else
return
end
@mode = mode
@steps = MOVING_FRAMES
end
#--------------------------------------------------------------------------
# ○ 애니메이션중인지 어떤지
#--------------------------------------------------------------------------
def animation?
return @mode != MODE_WAIT
end
end
#==============================================================================
# ■ Window_MenuStatus
#------------------------------------------------------------------------------
# 메뉴 화면에서 파티 멤버의 스테이터스를 표시하는 윈도우입니다.
#==============================================================================
class Window_RingMenuStatus < Window_Selectable
attr_reader :max_index
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
#--------------------------------------------------------------------------
def initialize
@max_index = $game_party.actors.size - 1
h = 32 * (@max_index + 1) + 32
h = 416 if h > 416
x = 0
x = 456 if $game_player.screen_x < 200 + Window_RingMenu::RING_R
super(x, 64, 184, h)
self.contents = Bitmap.new(width - 32, $game_party.actors.size * 32)
refresh
self.active = false
self.index = -1
end
#--------------------------------------------------------------------------
# ● 리프레쉬
#--------------------------------------------------------------------------
def refresh
self.contents.clear
@item_max = $game_party.actors.size
for i in 0...$game_party.actors.size
x = 32
y = 32 * i
actor = $game_party.actors[i]
#self.contents.draw_facesquare(actor.character_name, actor.character_hue, 4, y + 4 )
draw_actor_name(actor, x, y)
end
end
end
#==============================================================================
# ■ Scene_Menu
#------------------------------------------------------------------------------
# 메뉴 화면의 처리를 실시하는 클래스입니다.
#==============================================================================
class Scene_Menu
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
# menu_index : 커멘드의 커서 초기 위치
#--------------------------------------------------------------------------
def initialize(menu_index = 0)
@menu_index = menu_index
end
#--------------------------------------------------------------------------
# ● 메인 처리
#--------------------------------------------------------------------------
def main
# 골드 윈도우를 작성
@gold_window = Window_Gold.new
@gold_window.x = 0
@gold_window.y = 416 # 스프라이트 세트를 작성
@spriteset = Spriteset_Map.new
# 커멘드 윈도우를 작성
bmp = RPG::Cache.character($game_party.actors[0].character_name, 0)
px = $game_player.screen_x
py = $game_player.screen_y - bmp.rect.height / 4 / 2
@command_window = Window_RingMenu.new(px,py)
@command_window.index = @menu_index
# 파티 인원수가 0 사람의 경우
if $game_party.actors.size == 0
# 아이템 , 스킬 , 장비 , 스테이터스를 무효화
@command_window.disable_item(0)
@command_window.disable_item(1)
@command_window.disable_item(2)
@command_window.disable_item(3)
end
@command_window.z = 100
# 세이브 금지의 경우
if $game_system.save_disabled
# 세이브를 무효로 하는
@command_window.disable_item(4)
end
# 스테이터스 윈도우를 작성
@status_window = Window_RingMenuStatus.new
@status_window.z = 200
@status_window.visible = false
# 헬프 윈도우를 작성
@help_window = Window_Help.new
@help_window.set_text(@command_window.commands[@command_window.index],1)
# 트란지션 실행
Graphics.transition
# 메인 루프
loop do
# 게임 화면을 갱신
Graphics.update
# 입력 정보를 갱신
Input.update
# 프레임 갱신
update
# 화면이 바뀌면(자) 루프를 중단
if $scene != self
break
end
end
# 트란지션 준비
Graphics.freeze
# 스프라이트 세트를 해방
@spriteset.dispose
# 윈도우를 해방
@command_window.dispose
@status_window.dispose
@help_window.dispose
@gold_window.dispose
end
#--------------------------------------------------------------------------
# ● 프레임 갱신
#--------------------------------------------------------------------------
def update
# 윈도우를 갱신
@command_window.update
@status_window.update
@help_window.update
# 커멘드 윈도우가 액티브의 경우: update_command 를 부르는
if @command_window.active
update_command
return
end
# 스테이터스 윈도우가 액티브의 경우: update_status 를 부르는
if @status_window.active
update_status
return
end
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (커멘드 윈도우가 액티브의 경우)
#--------------------------------------------------------------------------
def update_command
# B 버튼이 밀렸을 경우
if Input.trigger?(Input::B)
# 캔슬 SE 을 연주
$game_system.se_play($data_system.cancel_se)
# 맵 화면으로 전환하고
$scene = Scene_Map.new
return
end
# C 버튼이 밀렸을 경우
if Input.trigger?(Input::C)
# 파티 인원수가 0 사람으로 , 세이브 , 게임 종료 이외의 커멘드의 경우
if $game_party.actors.size == 0 and @command_window.index < 4
# 버저 SE 를 연주
$game_system.se_play($data_system.buzzer_se)
return
end
# 커멘드 윈도우의 커서 위치에서 분기
case @command_window.index
when 0 # 아이템
# 결정 SE 을 연주
$game_system.se_play($data_system.decision_se)
# 아이템 화면으로 전환하고
$scene = Scene_Item.new
when 1 # 스킬
# 결정 SE 을 연주
$game_system.se_play($data_system.decision_se)
# 스테이터스 윈도우를 액티브하게 하는
@command_window.active = false
@status_window.active = true
@status_window.visible = true
@status_window.index = 0
when 2 # 장비
# 결정 SE 을 연주
$game_system.se_play($data_system.decision_se)
# 스테이터스 윈도우를 액티브하게 하는
@command_window.active = false
@status_window.active = true
@status_window.visible = true
@status_window.index = 0
when 3 # 스테이터스
# 결정 SE 을 연주
$game_system.se_play($data_system.decision_se)
# 스테이터스 윈도우를 액티브하게 하는
@command_window.active = false
@status_window.active = true
@status_window.visible = true
@status_window.index = 0
when 4 # 세이브
# 세이브 금지의 경우
if $game_system.save_disabled
# 버저 SE 를 연주
$game_system.se_play($data_system.buzzer_se)
return
end
# 결정 SE 을 연주
$game_system.se_play($data_system.decision_se)
# 세이브 화면으로 전환하고
$scene = Scene_Save.new
when 5 # 게임 종료
command_extra
end
return
end
# 애니메이션중이라면 커서의 처리를 실시하지 않는
return if @command_window.animation?
# ↑or← 버튼이 밀렸을 경우
if Input.press?(Input::UP) or Input.press?(Input::LEFT)
$game_system.se_play($data_system.cursor_se)
@command_window.setup_move_move(Window_RingMenu::MODE_MOVEL)
@help_window.set_text(@command_window.commands[@command_window.index],1)
return
end
# ↓or→ 버튼이 밀렸을 경우
if Input.press?(Input::DOWN) or Input.press?(Input::RIGHT)
$game_system.se_play($data_system.cursor_se)
@command_window.setup_move_move(Window_RingMenu::MODE_MOVER)
@help_window.set_text(@command_window.commands[@command_window.index],1)
return
end
end
#--------------------------------------------------------------------------
# ● コマンド : エクストラ
#--------------------------------------------------------------------------
def command_extra
# 決定 SE を演奏
$game_system.se_play($data_system.decision_se)
# エクストラ?面に切り替え
$scene = Scene_MusicTest.new
end
end
#==============================================================================
# ■ Window_MusicTest
#------------------------------------------------------------------------------
# 音?鑑賞で使用するウィンドウです。
#==============================================================================
class Window_MusicTest < Window_Selectable
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(play_title)
super(64, 32, 512, 366)
@play_title = play_title
@column_max = 2
refresh
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
# ビットマップを作成し、全項目を描?
@item_max = @play_title.size
self.contents = Bitmap.new(width - 32, row_max * 32)
for i in 0...@item_max
draw_title(i)
end
end
#--------------------------------------------------------------------------
# ● 項目の描?
# index : 項目番?
#--------------------------------------------------------------------------
def draw_title(index)
music_name = @play_title[index]
x = index % 2 * (220 + 40)
y = index / 2 * 32
self.contents.font.color = normal_color
self.contents.draw_text(x, y, 220, 32, music_name, 1)
end
#--------------------------------------------------------------------------
# ● ヘルプテキスト更新
#--------------------------------------------------------------------------
def update_help
@help_window.set_text($copyright_list[self.index])
end
end
#==============================================================================
# ■ Scene_MusicTest
#------------------------------------------------------------------------------
# 音?鑑賞?面の?理を行うクラスです。
#==============================================================================
class Scene_MusicTest
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# menu_index : コマンドのカ?ソル初期位置
#--------------------------------------------------------------------------
def initialize(menu_index = 0)
@menu_index = menu_index
end
#--------------------------------------------------------------------------
# ● メイン?理
#--------------------------------------------------------------------------
def main
@play_list = []
@play_title = []
# 再生する曲ファイル名を入力(m1などは曲番?)
# 曲のファイル名は正確に入力されている必要があります。
# 上手く再生されない場合は、ファイル名を直接コピ?してください。?張子は不要です。
m0 = "001-battle01"
m1 = "002-battle02"
m2 = "011-LastBoss03"
m3 = "012-theme01"
# 再生する曲のリストを入力
@play_list = [m0,m1,m2,m3]
# 再生する曲のタイトルを入力
@play_title[0,0] = @play_list
# 再生する曲のタイトルを入力(手動。配列のインデックスは曲番?に一致)
# 再設定しない場合は、ファイル名が表示されます。
@play_title[2] = "The Final Duel"
@play_title[3] = "Orpheus -メインテ?マ-"
#
# 著作者、(および原題)を入力。曲番?と??したヘルプウィンドウとなります。
# 製作者の方の著作?明記?保護のため、必ず入力してください
#
h0 = "作:エンタ?ブレイン"
h1 = "作:エンタ?ブレイン"
h2 = "作:エンタ?ブレイン"
h3 = "作:エンタ?ブレイン"
# 著作者リストを入力
$copyright_list = [h0,h1,h2,h3]
# BGM、ME、BGS の演奏を停止
Audio.bgm_stop
Audio.me_stop
Audio.bgs_stop
# 背景を作成
@sprite = Sprite.new
@sprite.bitmap = RPG::Cache.title($data_system.title_name)
# コマンドウィンドウを作成
@command_window = Window_MusicTest.new(@play_title)
@command_window.back_opacity = 160
@command_window.index = 0
# ヘルプウィンドウを作成
@help_window = Window_Help.new
@help_window.y = 416
@help_window.back_opacity = 160
# ヘルプウィンドウを?連付け
@command_window.help_window = @help_window
# トランジション?行
Graphics.transition
# メインル?プ
loop do
# ゲ?ム?面を更新
Graphics.update
# 入力情報を更新
Input.update
# フレ?ム更新
update
# ?面が切り替わったらル?プを中?
if $scene != self
break
end
end
# トランジション準備
Graphics.freeze
# 背景を解放
@sprite.dispose
# ウィンドウを解放
@command_window.dispose
@help_window.dispose
end
#--------------------------------------------------------------------------
# ● フレ?ム更新
#--------------------------------------------------------------------------
def update
# ウィンドウを更新
@command_window.update
update_command
end
#--------------------------------------------------------------------------
# ● フレ?ム更新 (コマンドウィンドウがアクティブの場合)
#--------------------------------------------------------------------------
def update_command
# B ボタンが押された場合
if Input.trigger?(Input::B)
# キャンセル SE を演奏
$game_system.se_play($data_system.cancel_se)
# エクストラ?面に切り替え
$scene = Scene_Menu.new
return
end
# C ボタンが押された場合
if Input.trigger?(Input::C)
Audio.bgm_stop
play_bgm = @play_list[@command_window.index]
# 音?を演奏
Audio.bgm_play("Audio/BGM/" + play_bgm)
return
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (스테이터스 윈도우가 액티브의 경우)
#--------------------------------------------------------------------------
def update_status
# B 버튼이 밀렸을 경우
if Input.trigger?(Input::B)
# 캔슬 SE 을 연주
$game_system.se_play($data_system.cancel_se)
# 커멘드 윈도우를 액티브하게 하는
@command_window.active = true
@status_window.active = false
@status_window.visible = false
@status_window.index = -1
return
end
# C 버튼이 밀렸을 경우
if Input.trigger?(Input::C)
# 커멘드 윈도우의 커서 위치에서 분기
case @command_window.index
when 1 # 스킬
# 이 엑터의 행동 제한이 2 이상의 경우
if $game_party.actors[@status_window.index].restriction >= 2
# 버저 SE 를 연주
$game_system.se_play($data_system.buzzer_se)
return
end
# 결정 SE 을 연주
$game_system.se_play($data_system.decision_se)
# 스킬 화면으로 전환하고
$scene = Scene_Skill.new(@status_window.index)
when 2 # 장비
# 결정 SE 을 연주
$game_system.se_play($data_system.decision_se)
# 장비 화면으로 전환하고
$scene = Scene_Equip.new(@status_window.index)
when 3 # 스테이터스
# 결정 SE 을 연주
$game_system.se_play($data_system.decision_se)
# 스테이터스 화면으로 전환하고
$scene = Scene_Status.new(@status_window.index)
end
return
end
end
end
#==============================================================================
# ◇ 외부 라이브러리
#==============================================================================
class Bitmap
# ▼▲▼ XRXL 1. 라인·도형 묘사 ▼▲▼
#--------------------------------------------------------------------------
# ● 라인 묘화 by 앵아 재흙
#--------------------------------------------------------------------------
def draw_line(start_x, start_y, end_x, end_y, start_color, width = 1, end_color = start_color)
# 묘사 거리의 계산. 큰에 직각시의 길이.
distance = (start_x - end_x).abs + (start_y - end_y).abs
# 묘사 개시
if end_color == start_color
for i in 1..distance
x = (start_x + 1.0 * (end_x - start_x) * i / distance).to_i
y = (start_y + 1.0 * (end_y - start_y) * i / distance).to_i
if width == 1
self.set_pixel(x, y, start_color)
else
self.fill_rect(x, y, width, width, start_color)
end
end
else
for i in 1..distance
x = (start_x + 1.0 * (end_x - start_x) * i / distance).to_i
y = (start_y + 1.0 * (end_y - start_y) * i / distance).to_i
r = start_color.red * (distance-i)/distance + end_color.red * i/distance
g = start_color.green * (distance-i)/distance + end_color.green * i/distance
b = start_color.blue * (distance-i)/distance + end_color.blue * i/distance
a = start_color.alpha * (distance-i)/distance + end_color.alpha * i/distance
if width == 1
self.set_pixel(x, y, Color.new(r, g, b, a))
else
self.fill_rect(x, y, width, width, Color.new(r, g, b, a))
end
end
end
end
#--------------------------------------------------------------------------
# ● 다각형의 묘화(전부 칠해 없음) by 가즈키
# peaks : 정점 좌표의 배열 [[x1,y1],[x2,y2],[x3,y3], ... ]
# color : 선의 색
# width : 선의 폭
#--------------------------------------------------------------------------
def draw_polygon(peaks, color, width = 1)
# 변(=정점)의 개수분 만큼 옆을 그리는
for i in 0 ... (peaks.size - 1)
# 정점끼리를 선으로 묶는
draw_line( peaks[i][0], peaks[i][1], peaks[i+1][0], peaks[i+1][1], color, width )
end
# 마지막 정점과 최초의 정점을 묶는
draw_line( peaks[peaks.size - 1][0], peaks[peaks.size - 1][1], peaks[0][0], peaks[0][1], color, width )
end
# ▼▲▼ XRXL 2. 비트 맵/아이콘 묘사 ▼▲▼
#--------------------------------------------------------------------------
# ● 안&범위의 묘화 by 앵아 재흙
# character_name : 묘사에 이용하는 캐릭터 그래픽
# character_hue : 묘사의 색조
# x : 묘화처 X 좌표
# y : 묘화처 Y 좌표
#--------------------------------------------------------------------------
def draw_facesquare(character_name, character_hue, x, y, size = 24)
bitmap = RPG::Cache.character(character_name, character_hue)
src_rect = Rect.new((bitmap.width/4 - size)/2, 0, size, size)
self.blt(x, y, bitmap, src_rect)
self.draw_polygon([[x,y],[x+size,y],[x+size,y+size],[x,y+size]], Color.new(255,255,255,128))
end
end
end
# □ 커스터마이즈 포인트 -By 제스터 개조- RPG게임공작소.
#==============================================================================
class Window_RingMenu < Window_Base
STARTUP_FRAMES = 20 # 초기 애니메이션의 프레임수
MOVING_FRAMES = 5 # 링을 돌렸을 때의 프레임수
RING_R = 64 # 링의 반경
SE_STARTUP = "056-Right02" # 메뉴를 열었을 때에 울리는SE
ICON_ITEM = RPG::Cache.icon("034-Item03") # 「 아이템 」메뉴의 아이콘
ICON_SKILL = RPG::Cache.icon("044-Skill01") # 「스킬 」메뉴의 아이콘
ICON_EQUIP = RPG::Cache.icon("001-Weapon01") # 「 장비 」메뉴의 아이콘
ICON_STATUS = RPG::Cache.icon("050-Skill07") # 「스테이터스」메뉴의 아이콘
ICON_SAVE = RPG::Cache.icon("038-Item07")
ICON_MUSIC = RPG::Cache.icon("040-Item09")
ICON_DISABLE= RPG::Cache.icon("") # 사용 금지 항목을 뒤따르는 아이콘
BACKGROUND_COLOR = Color.new(0xcc,0x99,0x33,0x3f)
end
###############################################################################
# 링 메뉴 도입 스크립트 Ver. 1.2
# writen by 가즈키
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# ▽도입
# 0. 먼저 XRXL 2. 비트 맵/아이콘 묘사 를 넣어 두어 주세요.
# 1. 이 스크립트를Main섹션 위에 ?font color=FF001E style=background-color:FFF000;>링?새로운 섹션에 카피하는
# 2. Window_RingMenu의 상부에 있는 7개의 것 RPG::Cache.icon("") 의 "" 의 안에
# 오른쪽의 설명에 써 있는 커멘드용의 아이콘명을 쓴다.
# (맨 밑의 사용 금지는 선택할 수 없는 메뉴에 거듭하는 아이콘입니다.
# 이런 건이 좋을지도→ φ )
# 3. 아이콘 설정의 바로 아래에 있는 SE_STARTUP = "" 것 "" 의 안에 메뉴를
# 열었을 때에 울리고 싶은 것SE의 이름을 쓴다.
# ▽스크립트 접하는 사람에게
# 우선 움직이는 것을 목표로 ?font color=FF001E style=background-color:FFF000;>링?것이므로(뜻 낮은 w ), 좌표의 조정등이 불완전합니다.
# 보다 정확하게 엑터의 화면 좌표를 취득하는 처리를 추가하거나 엑터 일람의 위치를
# 바꾸거나 문자 표시등 등을 조정하면 좋은 느낌으로 완성될 생각이 듭니다.
###############################################################################
#==============================================================================
# ■ Window_RingMenu
#==============================================================================
class Window_RingMenu < Window_Base
#--------------------------------------------------------------------------
# ○ 클래스 정수
#--------------------------------------------------------------------------
MODE_START = 1 # 스타트 업 애니메이션
MODE_WAIT = 2 # 대기
MODE_MOVER = 3 # 시계회전 회전 애니메이션
MODE_MOVEL = 4 # 반 시계회전 회전 애니메이션
#--------------------------------------------------------------------------
# ○ 악 세사
#--------------------------------------------------------------------------
attr_accessor :index
attr_reader :commands
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
#--------------------------------------------------------------------------
def initialize( center_x, center_y )
super(-16, -16, 640+32, 480+32)
self.contents = Bitmap.new(width-32, height-32)
self.opacity = 0
self.back_opacity = 0
s1 = $data_system.words.item
s2 = $data_system.words.skill
s3 = $data_system.words.equip
s4 = "스테이터스"
s5 = "세이브"
s6 = "음악감상"
@commands = [ s1, s2, s3, s4, s5, s6]
@item_max = 6
@index = 0
@items = [ ICON_ITEM, ICON_SKILL, ICON_EQUIP, ICON_STATUS, ICON_SAVE, ICON_MUSIC]
@disabled = [ false, false, false, false, false, false ]
@cx = center_x
@cy = center_y
setup_move_start
refresh
end
#--------------------------------------------------------------------------
# ● 프레임 갱신
#--------------------------------------------------------------------------
def update
super
refresh
end
#--------------------------------------------------------------------------
# ● 화면재 묘화
#--------------------------------------------------------------------------
def refresh
self.contents.clear
# 배경 묘화
if BACKGROUND_COLOR.alpha > 0
self.contents.fill_rect(0,0,640,480,BACKGROUND_COLOR)
end
# 아이콘을 묘화
case @mode
when MODE_START
refresh_start
when MODE_WAIT
refresh_wait
when MODE_MOVER
refresh_move(1)
when MODE_MOVEL
refresh_move(0)
end
end
#--------------------------------------------------------------------------
# ○ 화면재 묘화(초기화시)
#--------------------------------------------------------------------------
def refresh_start
d1 = 2.0 * Math::PI / @item_max
d2 = 1.0 * Math::PI / STARTUP_FRAMES
r = RING_R - 1.0 * RING_R * @steps / STARTUP_FRAMES
for i in 0...@item_max
j = i - @index
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 = MODE_WAIT
end
end
#--------------------------------------------------------------------------
# ○ 화면재 묘화(대기시)
#--------------------------------------------------------------------------
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
#--------------------------------------------------------------------------
# ○ 화면재 묘화(회전시)
# mode : 0=반 시계회전 1=시계회전
#--------------------------------------------------------------------------
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
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 < 1
@mode = MODE_WAIT
end
end
#--------------------------------------------------------------------------
# ● 항목의 묘화
# x :
# y :
# i : 항목 번호
#--------------------------------------------------------------------------
def draw_item(x, y, i)
rect = Rect.new(0, 0, @items[i].width, @items[i].height)
x -= rect.width/2
y -= rect.height/2
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
#--------------------------------------------------------------------------
# ● 항목을 무효로 하는
# index : 항목 번호
#--------------------------------------------------------------------------
def disable_item(index)
@disabled[index] = true
end
#--------------------------------------------------------------------------
# ○ 초기화 애니메이션의 준비
#--------------------------------------------------------------------------
def setup_move_start
@mode = MODE_START
@steps = STARTUP_FRAMES
if SE_STARTUP != nil and SE_STARTUP != ""
Audio.se_play("Audio/SE/" + SE_STARTUP, 80, 100)
end
end
#--------------------------------------------------------------------------
# ○ 회전 애니메이션의 준비
#--------------------------------------------------------------------------
def setup_move_move(mode)
if mode == MODE_MOVER
@index -= 1
@index = @items.size - 1 if @index < 0
elsif mode == MODE_MOVEL
@index += 1
@index = 0 if @index >= @items.size
else
return
end
@mode = mode
@steps = MOVING_FRAMES
end
#--------------------------------------------------------------------------
# ○ 애니메이션중인지 어떤지
#--------------------------------------------------------------------------
def animation?
return @mode != MODE_WAIT
end
end
#==============================================================================
# ■ Window_MenuStatus
#------------------------------------------------------------------------------
# 메뉴 화면에서 파티 멤버의 스테이터스를 표시하는 윈도우입니다.
#==============================================================================
class Window_RingMenuStatus < Window_Selectable
attr_reader :max_index
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
#--------------------------------------------------------------------------
def initialize
@max_index = $game_party.actors.size - 1
h = 32 * (@max_index + 1) + 32
h = 416 if h > 416
x = 0
x = 456 if $game_player.screen_x < 200 + Window_RingMenu::RING_R
super(x, 64, 184, h)
self.contents = Bitmap.new(width - 32, $game_party.actors.size * 32)
refresh
self.active = false
self.index = -1
end
#--------------------------------------------------------------------------
# ● 리프레쉬
#--------------------------------------------------------------------------
def refresh
self.contents.clear
@item_max = $game_party.actors.size
for i in 0...$game_party.actors.size
x = 32
y = 32 * i
actor = $game_party.actors[i]
#self.contents.draw_facesquare(actor.character_name, actor.character_hue, 4, y + 4 )
draw_actor_name(actor, x, y)
end
end
end
#==============================================================================
# ■ Scene_Menu
#------------------------------------------------------------------------------
# 메뉴 화면의 처리를 실시하는 클래스입니다.
#==============================================================================
class Scene_Menu
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
# menu_index : 커멘드의 커서 초기 위치
#--------------------------------------------------------------------------
def initialize(menu_index = 0)
@menu_index = menu_index
end
#--------------------------------------------------------------------------
# ● 메인 처리
#--------------------------------------------------------------------------
def main
# 골드 윈도우를 작성
@gold_window = Window_Gold.new
@gold_window.x = 0
@gold_window.y = 416 # 스프라이트 세트를 작성
@spriteset = Spriteset_Map.new
# 커멘드 윈도우를 작성
bmp = RPG::Cache.character($game_party.actors[0].character_name, 0)
px = $game_player.screen_x
py = $game_player.screen_y - bmp.rect.height / 4 / 2
@command_window = Window_RingMenu.new(px,py)
@command_window.index = @menu_index
# 파티 인원수가 0 사람의 경우
if $game_party.actors.size == 0
# 아이템 , 스킬 , 장비 , 스테이터스를 무효화
@command_window.disable_item(0)
@command_window.disable_item(1)
@command_window.disable_item(2)
@command_window.disable_item(3)
end
@command_window.z = 100
# 세이브 금지의 경우
if $game_system.save_disabled
# 세이브를 무효로 하는
@command_window.disable_item(4)
end
# 스테이터스 윈도우를 작성
@status_window = Window_RingMenuStatus.new
@status_window.z = 200
@status_window.visible = false
# 헬프 윈도우를 작성
@help_window = Window_Help.new
@help_window.set_text(@command_window.commands[@command_window.index],1)
# 트란지션 실행
Graphics.transition
# 메인 루프
loop do
# 게임 화면을 갱신
Graphics.update
# 입력 정보를 갱신
Input.update
# 프레임 갱신
update
# 화면이 바뀌면(자) 루프를 중단
if $scene != self
break
end
end
# 트란지션 준비
Graphics.freeze
# 스프라이트 세트를 해방
@spriteset.dispose
# 윈도우를 해방
@command_window.dispose
@status_window.dispose
@help_window.dispose
@gold_window.dispose
end
#--------------------------------------------------------------------------
# ● 프레임 갱신
#--------------------------------------------------------------------------
def update
# 윈도우를 갱신
@command_window.update
@status_window.update
@help_window.update
# 커멘드 윈도우가 액티브의 경우: update_command 를 부르는
if @command_window.active
update_command
return
end
# 스테이터스 윈도우가 액티브의 경우: update_status 를 부르는
if @status_window.active
update_status
return
end
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (커멘드 윈도우가 액티브의 경우)
#--------------------------------------------------------------------------
def update_command
# B 버튼이 밀렸을 경우
if Input.trigger?(Input::B)
# 캔슬 SE 을 연주
$game_system.se_play($data_system.cancel_se)
# 맵 화면으로 전환하고
$scene = Scene_Map.new
return
end
# C 버튼이 밀렸을 경우
if Input.trigger?(Input::C)
# 파티 인원수가 0 사람으로 , 세이브 , 게임 종료 이외의 커멘드의 경우
if $game_party.actors.size == 0 and @command_window.index < 4
# 버저 SE 를 연주
$game_system.se_play($data_system.buzzer_se)
return
end
# 커멘드 윈도우의 커서 위치에서 분기
case @command_window.index
when 0 # 아이템
# 결정 SE 을 연주
$game_system.se_play($data_system.decision_se)
# 아이템 화면으로 전환하고
$scene = Scene_Item.new
when 1 # 스킬
# 결정 SE 을 연주
$game_system.se_play($data_system.decision_se)
# 스테이터스 윈도우를 액티브하게 하는
@command_window.active = false
@status_window.active = true
@status_window.visible = true
@status_window.index = 0
when 2 # 장비
# 결정 SE 을 연주
$game_system.se_play($data_system.decision_se)
# 스테이터스 윈도우를 액티브하게 하는
@command_window.active = false
@status_window.active = true
@status_window.visible = true
@status_window.index = 0
when 3 # 스테이터스
# 결정 SE 을 연주
$game_system.se_play($data_system.decision_se)
# 스테이터스 윈도우를 액티브하게 하는
@command_window.active = false
@status_window.active = true
@status_window.visible = true
@status_window.index = 0
when 4 # 세이브
# 세이브 금지의 경우
if $game_system.save_disabled
# 버저 SE 를 연주
$game_system.se_play($data_system.buzzer_se)
return
end
# 결정 SE 을 연주
$game_system.se_play($data_system.decision_se)
# 세이브 화면으로 전환하고
$scene = Scene_Save.new
when 5 # 게임 종료
command_extra
end
return
end
# 애니메이션중이라면 커서의 처리를 실시하지 않는
return if @command_window.animation?
# ↑or← 버튼이 밀렸을 경우
if Input.press?(Input::UP) or Input.press?(Input::LEFT)
$game_system.se_play($data_system.cursor_se)
@command_window.setup_move_move(Window_RingMenu::MODE_MOVEL)
@help_window.set_text(@command_window.commands[@command_window.index],1)
return
end
# ↓or→ 버튼이 밀렸을 경우
if Input.press?(Input::DOWN) or Input.press?(Input::RIGHT)
$game_system.se_play($data_system.cursor_se)
@command_window.setup_move_move(Window_RingMenu::MODE_MOVER)
@help_window.set_text(@command_window.commands[@command_window.index],1)
return
end
end
#--------------------------------------------------------------------------
# ● コマンド : エクストラ
#--------------------------------------------------------------------------
def command_extra
# 決定 SE を演奏
$game_system.se_play($data_system.decision_se)
# エクストラ?面に切り替え
$scene = Scene_MusicTest.new
end
end
#==============================================================================
# ■ Window_MusicTest
#------------------------------------------------------------------------------
# 音?鑑賞で使用するウィンドウです。
#==============================================================================
class Window_MusicTest < Window_Selectable
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(play_title)
super(64, 32, 512, 366)
@play_title = play_title
@column_max = 2
refresh
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
# ビットマップを作成し、全項目を描?
@item_max = @play_title.size
self.contents = Bitmap.new(width - 32, row_max * 32)
for i in 0...@item_max
draw_title(i)
end
end
#--------------------------------------------------------------------------
# ● 項目の描?
# index : 項目番?
#--------------------------------------------------------------------------
def draw_title(index)
music_name = @play_title[index]
x = index % 2 * (220 + 40)
y = index / 2 * 32
self.contents.font.color = normal_color
self.contents.draw_text(x, y, 220, 32, music_name, 1)
end
#--------------------------------------------------------------------------
# ● ヘルプテキスト更新
#--------------------------------------------------------------------------
def update_help
@help_window.set_text($copyright_list[self.index])
end
end
#==============================================================================
# ■ Scene_MusicTest
#------------------------------------------------------------------------------
# 音?鑑賞?面の?理を行うクラスです。
#==============================================================================
class Scene_MusicTest
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# menu_index : コマンドのカ?ソル初期位置
#--------------------------------------------------------------------------
def initialize(menu_index = 0)
@menu_index = menu_index
end
#--------------------------------------------------------------------------
# ● メイン?理
#--------------------------------------------------------------------------
def main
@play_list = []
@play_title = []
# 再生する曲ファイル名を入力(m1などは曲番?)
# 曲のファイル名は正確に入力されている必要があります。
# 上手く再生されない場合は、ファイル名を直接コピ?してください。?張子は不要です。
m0 = "001-battle01"
m1 = "002-battle02"
m2 = "011-LastBoss03"
m3 = "012-theme01"
# 再生する曲のリストを入力
@play_list = [m0,m1,m2,m3]
# 再生する曲のタイトルを入力
@play_title[0,0] = @play_list
# 再生する曲のタイトルを入力(手動。配列のインデックスは曲番?に一致)
# 再設定しない場合は、ファイル名が表示されます。
@play_title[2] = "The Final Duel"
@play_title[3] = "Orpheus -メインテ?マ-"
#
# 著作者、(および原題)を入力。曲番?と??したヘルプウィンドウとなります。
# 製作者の方の著作?明記?保護のため、必ず入力してください
#
h0 = "作:エンタ?ブレイン"
h1 = "作:エンタ?ブレイン"
h2 = "作:エンタ?ブレイン"
h3 = "作:エンタ?ブレイン"
# 著作者リストを入力
$copyright_list = [h0,h1,h2,h3]
# BGM、ME、BGS の演奏を停止
Audio.bgm_stop
Audio.me_stop
Audio.bgs_stop
# 背景を作成
@sprite = Sprite.new
@sprite.bitmap = RPG::Cache.title($data_system.title_name)
# コマンドウィンドウを作成
@command_window = Window_MusicTest.new(@play_title)
@command_window.back_opacity = 160
@command_window.index = 0
# ヘルプウィンドウを作成
@help_window = Window_Help.new
@help_window.y = 416
@help_window.back_opacity = 160
# ヘルプウィンドウを?連付け
@command_window.help_window = @help_window
# トランジション?行
Graphics.transition
# メインル?プ
loop do
# ゲ?ム?面を更新
Graphics.update
# 入力情報を更新
Input.update
# フレ?ム更新
update
# ?面が切り替わったらル?プを中?
if $scene != self
break
end
end
# トランジション準備
Graphics.freeze
# 背景を解放
@sprite.dispose
# ウィンドウを解放
@command_window.dispose
@help_window.dispose
end
#--------------------------------------------------------------------------
# ● フレ?ム更新
#--------------------------------------------------------------------------
def update
# ウィンドウを更新
@command_window.update
update_command
end
#--------------------------------------------------------------------------
# ● フレ?ム更新 (コマンドウィンドウがアクティブの場合)
#--------------------------------------------------------------------------
def update_command
# B ボタンが押された場合
if Input.trigger?(Input::B)
# キャンセル SE を演奏
$game_system.se_play($data_system.cancel_se)
# エクストラ?面に切り替え
$scene = Scene_Menu.new
return
end
# C ボタンが押された場合
if Input.trigger?(Input::C)
Audio.bgm_stop
play_bgm = @play_list[@command_window.index]
# 音?を演奏
Audio.bgm_play("Audio/BGM/" + play_bgm)
return
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (스테이터스 윈도우가 액티브의 경우)
#--------------------------------------------------------------------------
def update_status
# B 버튼이 밀렸을 경우
if Input.trigger?(Input::B)
# 캔슬 SE 을 연주
$game_system.se_play($data_system.cancel_se)
# 커멘드 윈도우를 액티브하게 하는
@command_window.active = true
@status_window.active = false
@status_window.visible = false
@status_window.index = -1
return
end
# C 버튼이 밀렸을 경우
if Input.trigger?(Input::C)
# 커멘드 윈도우의 커서 위치에서 분기
case @command_window.index
when 1 # 스킬
# 이 엑터의 행동 제한이 2 이상의 경우
if $game_party.actors[@status_window.index].restriction >= 2
# 버저 SE 를 연주
$game_system.se_play($data_system.buzzer_se)
return
end
# 결정 SE 을 연주
$game_system.se_play($data_system.decision_se)
# 스킬 화면으로 전환하고
$scene = Scene_Skill.new(@status_window.index)
when 2 # 장비
# 결정 SE 을 연주
$game_system.se_play($data_system.decision_se)
# 장비 화면으로 전환하고
$scene = Scene_Equip.new(@status_window.index)
when 3 # 스테이터스
# 결정 SE 을 연주
$game_system.se_play($data_system.decision_se)
# 스테이터스 화면으로 전환하고
$scene = Scene_Status.new(@status_window.index)
end
return
end
end
end
#==============================================================================
# ◇ 외부 라이브러리
#==============================================================================
class Bitmap
# ▼▲▼ XRXL 1. 라인·도형 묘사 ▼▲▼
#--------------------------------------------------------------------------
# ● 라인 묘화 by 앵아 재흙
#--------------------------------------------------------------------------
def draw_line(start_x, start_y, end_x, end_y, start_color, width = 1, end_color = start_color)
# 묘사 거리의 계산. 큰에 직각시의 길이.
distance = (start_x - end_x).abs + (start_y - end_y).abs
# 묘사 개시
if end_color == start_color
for i in 1..distance
x = (start_x + 1.0 * (end_x - start_x) * i / distance).to_i
y = (start_y + 1.0 * (end_y - start_y) * i / distance).to_i
if width == 1
self.set_pixel(x, y, start_color)
else
self.fill_rect(x, y, width, width, start_color)
end
end
else
for i in 1..distance
x = (start_x + 1.0 * (end_x - start_x) * i / distance).to_i
y = (start_y + 1.0 * (end_y - start_y) * i / distance).to_i
r = start_color.red * (distance-i)/distance + end_color.red * i/distance
g = start_color.green * (distance-i)/distance + end_color.green * i/distance
b = start_color.blue * (distance-i)/distance + end_color.blue * i/distance
a = start_color.alpha * (distance-i)/distance + end_color.alpha * i/distance
if width == 1
self.set_pixel(x, y, Color.new(r, g, b, a))
else
self.fill_rect(x, y, width, width, Color.new(r, g, b, a))
end
end
end
end
#--------------------------------------------------------------------------
# ● 다각형의 묘화(전부 칠해 없음) by 가즈키
# peaks : 정점 좌표의 배열 [[x1,y1],[x2,y2],[x3,y3], ... ]
# color : 선의 색
# width : 선의 폭
#--------------------------------------------------------------------------
def draw_polygon(peaks, color, width = 1)
# 변(=정점)의 개수분 만큼 옆을 그리는
for i in 0 ... (peaks.size - 1)
# 정점끼리를 선으로 묶는
draw_line( peaks[i][0], peaks[i][1], peaks[i+1][0], peaks[i+1][1], color, width )
end
# 마지막 정점과 최초의 정점을 묶는
draw_line( peaks[peaks.size - 1][0], peaks[peaks.size - 1][1], peaks[0][0], peaks[0][1], color, width )
end
# ▼▲▼ XRXL 2. 비트 맵/아이콘 묘사 ▼▲▼
#--------------------------------------------------------------------------
# ● 안&범위의 묘화 by 앵아 재흙
# character_name : 묘사에 이용하는 캐릭터 그래픽
# character_hue : 묘사의 색조
# x : 묘화처 X 좌표
# y : 묘화처 Y 좌표
#--------------------------------------------------------------------------
def draw_facesquare(character_name, character_hue, x, y, size = 24)
bitmap = RPG::Cache.character(character_name, character_hue)
src_rect = Rect.new((bitmap.width/4 - size)/2, 0, size, size)
self.blt(x, y, bitmap, src_rect)
self.draw_polygon([[x,y],[x+size,y],[x+size,y+size],[x,y+size]], Color.new(255,255,255,128))
end
end
end