#==============================================================================
# ■ Scene_Item
#------------------------------------------------------------------------------
# 아이템 화면의 처리를 실시하는 클래스입니다.
#==============================================================================
class Scene_Item
#--------------------------------------------------------------------------
# ● 메인 처리
#--------------------------------------------------------------------------
def main
# 헬프 윈도우, 아이템 윈도우를 작성
@help_window = Window_Help.new
@item_window = Window_Item.new
# 헬프 윈도우를 관련짓고
@item_window.help_window = @help_window
# 타겟 윈도우를 작성 (불가시·비액티브하게 설정)
@target_window = Window_Target.new
@target_window.visible = false
@target_window.active = false
# 트란지션 실행
Graphics.transition
# 메인 루프
loop do
# 게임 화면을 갱신
Graphics.update
# 입력 정보를 갱신
Input.update
# 프레임 갱신
update
# 화면이 바뀌면(자) 루프를 중단
if $scene != self
break
end
end
# 트란지션 준비
Graphics.freeze
# 윈도우를 해방
@help_window.dispose
@item_window.dispose
@target_window.dispose
end
#--------------------------------------------------------------------------
# ● 프레임 갱신
#--------------------------------------------------------------------------
def update
# 윈도우를 갱신
@help_window.update
@item_window.update
@target_window.update
# 아이템 윈도우가 액티브의 경우: update_item 를 부른다
if @item_window.active
update_item
return
end
# 타겟 윈도우가 액티브의 경우: update_target 를 부른다
if @target_window.active
update_target
return
end
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (아이템 윈도우가 액티브의 경우)
#--------------------------------------------------------------------------
def update_item
# B 버튼이 밀렸을 경우
if Input.trigger? (Input::B)
# 캔슬 SE 를 연주
$game_system.se_play($data_system.cancel_se)
# 메뉴 화면으로 전환하고
$scene = Scene_Menu.new(2)
return
end
# C 버튼이 밀렸을 경우
if Input.trigger? (Input::C)
# 아이템 윈도우로 현재 선택되고 있는 데이터를 취득
@item = @item_window.item
# 사용 아이템이 아닌 경우
unless @item.is_a? (RPG::Item)
# 버저 SE 를 연주
$game_system.se_play($data_system.buzzer_se)
return
end
# 사용할 수 없는 경우
unless $game_party.item_can_use? (@item.id)
# 버저 SE 를 연주
$game_system.se_play($data_system.buzzer_se)
return
end
# 결정 SE 를 연주
$game_system.se_play($data_system.decision_se)
# 효과 범위가 아군의 경우
if @item.scope >= 3
# 타겟 윈도우를 액티브화
@item_window.active = false
@target_window.x = (@item_window.index + 1) % 2 * 304
@target_window.visible = true
@target_window.active = true
# 효과 범위 (단체/전체)에 응해 커서 위치를 설정
if @item.scope == 4 || @item.scope == 6
@target_window.index = -1
else
@target_window.index = 0
end
# 효과 범위가 아군 이외의 경우
else
# 코먼 이벤트 ID 가 유효의 경우
if @item.common_event_id > 0
# 코먼 이벤트 호출 예약
$game_temp.common_event_id = @item.common_event_id
# 아이템의 사용시 SE 를 연주
$game_system.se_play(@item.menu_se)
# 소모품의 경우
if @item.consumable
# 사용한 아이템을 1 줄인다
$game_party.lose_item(@item.id, 1)
# 아이템 윈도우의 항목을 재묘화
@item_window.draw_item(@item_window.index)
end
# 맵 화면으로 전환하고
$scene = Scene_Map.new
return
end
end
return
end
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (타겟 윈도우가 액티브의 경우)
#--------------------------------------------------------------------------
def update_target
# B 버튼이 밀렸을 경우
if Input.trigger? (Input::B)
# 캔슬 SE 를 연주
$game_system.se_play($data_system.cancel_se)
# 아이템 조각등으로 사용할 수 없게 되었을 경우
unless $game_party.item_can_use? (@item.id)
# 아이템 윈도우의 내용을 재작성
@item_window.refresh
end
# 타겟 윈도우를 소거
@item_window.active = true
@target_window.visible = false
@target_window.active = false
return
end
# C 버튼이 밀렸을 경우
if Input.trigger? (Input::C)
# 아이템을 다 사용했을 경우
if $game_party.item_number(@item.id) == 0
# 버저 SE 를 연주
$game_system.se_play($data_system.buzzer_se)
return
end
# 타겟이 전체의 경우
if @target_window.index == -1
# 파티 전체에 아이템의 사용 효과를 적용
used = false
for i in $game_party.actors
used |= i.item_effect(@item)
end
end
# 타겟이 단체의 경우
if @target_window.index >= 0
# 타겟의 엑터에게 아이템의 사용 효과를 적용
target = $game_party.actors[@target_window.index]
used = target.item_effect(@item)
end
# 아이템을 사용했을 경우
if used
# 아이템의 사용시 SE 를 연주
$game_system.se_play(@item.menu_se)
# 소모품의 경우
if @item.consumable
# 사용한 아이템을 1 줄인다
$game_party.lose_item(@item.id, 1)
# 아이템 윈도우의 항목을 재묘화
@item_window.draw_item(@item_window.index)
end
# 타겟 윈도우의 내용을 재작성
@target_window.refresh
# 코먼 이벤트 ID 가 유효의 경우
if @item.common_event_id > 0
# 코먼 이벤트 호출 예약
$game_temp.common_event_id = @item.common_event_id
# 맵 화면으로 전환하고
$scene = Scene_Map.new
return
end
end
# 아이템을 사용하지 않았던 경우
unless used
# 버저 SE 를 연주
$game_system.se_play($data_system.buzzer_se)
end
return
end
end
end
#==============================================================================
# ■ Scene_Equip
#------------------------------------------------------------------------------
# 장비 화면의 처리를 실시하는 클래스입니다.
#==============================================================================
class Scene_Equip
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
# actor_index : 엑터 인덱스
# equip_index : 장비 인덱스
#--------------------------------------------------------------------------
def initialize(actor_index = 0, equip_index = 0)
@actor_index = actor_index
@equip_index = equip_index
end
#--------------------------------------------------------------------------
# ● 메인 처리
#--------------------------------------------------------------------------
def main
# 엑터를 취득
@actor = $game_party.actors[@actor_index]
# 윈도우를 작성
@help_window = Window_Help.new
@left_window = Window_EquipLeft.new(@actor)
@right_window = Window_EquipRight.new(@actor)
@item_window1 = Window_EquipItem.new(@actor, 0)
@item_window2 = Window_EquipItem.new(@actor, 1)
@item_window3 = Window_EquipItem.new(@actor, 2)
@item_window4 = Window_EquipItem.new(@actor, 3)
@item_window5 = Window_EquipItem.new(@actor, 4)
# 헬프 윈도우를 관련짓고
@right_window.help_window = @help_window
@item_window1.help_window = @help_window
@item_window2.help_window = @help_window
@item_window3.help_window = @help_window
@item_window4.help_window = @help_window
@item_window5.help_window = @help_window
# 커서 위치를 설정
@right_window.index = @equip_index
refresh
# 트란지션 실행
Graphics.transition
# 메인 루프
loop do
# 게임 화면을 갱신
Graphics.update
# 입력 정보를 갱신
Input.update
# 프레임 갱신
update
# 화면이 바뀌면(자) 루프를 중단
if $scene != self
break
end
end
# 트란지션 준비
Graphics.freeze
# 윈도우를 해방
@help_window.dispose
@left_window.dispose
@right_window.dispose
@item_window1.dispose
@item_window2.dispose
@item_window3.dispose
@item_window4.dispose
@item_window5.dispose
end
#--------------------------------------------------------------------------
# ● 리프레쉬
#--------------------------------------------------------------------------
def refresh
# 아이템 윈도우의 가시 상태 설정
@item_window1.visible = (@right_window.index == 0)
@item_window2.visible = (@right_window.index == 1)
@item_window3.visible = (@right_window.index == 2)
@item_window4.visible = (@right_window.index == 3)
@item_window5.visible = (@right_window.index == 4)
# 현재 장비중의 아이템을 취득
item1 = @right_window.item
# 현재의 아이템 윈도우를 @item_window 로 설정
case @right_window.index
when 0
@item_window = @item_window1
when 1
@item_window = @item_window2
when 2
@item_window = @item_window3
when 3
@item_window = @item_window4
when 4
@item_window = @item_window5
end
# 라이트 윈도우가 액티브의 경우
if @right_window.active
# 장비 변경 후의 파라미터를 소거
@left_window.set_new_parameters(nil, nil, nil)
end
# 아이템 윈도우가 액티브의 경우
if @item_window.active
# 현재 선택중의 아이템을 취득
item2 = @item_window.item
# 장비를 변경
@actor.equip(@right_window.index, item2 == nil ? 0 : item2.id)
# 장비 변경 후의 파라미터를 취득
new_atk = @actor.atk
new_pdef = @actor.pdef
new_mdef = @actor.mdef
# 장비를 되돌린다
@actor.equip(@right_window.index, item1 == nil ? 0 : item1.id)
# 레프트 윈도우에 묘화
@left_window.set_new_parameters(new_atk, new_pdef, new_mdef)
end
end
#--------------------------------------------------------------------------
# ● 프레임 갱신
#--------------------------------------------------------------------------
def update
# 윈도우를 갱신
@left_window.update
@right_window.update
@item_window.update
refresh
# 라이트 윈도우가 액티브의 경우: update_right 를 부른다
if @right_window.active
update_right
return
end
# 아이템 윈도우가 액티브의 경우: update_item 를 부른다
if @item_window.active
update_item
return
end
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (라이트 윈도우가 액티브의 경우)
#--------------------------------------------------------------------------
def update_right
# B 버튼이 밀렸을 경우
if Input.trigger? (Input::B)
# 캔슬 SE 를 연주
$game_system.se_play($data_system.cancel_se)
# 메뉴 화면으로 전환하고
$scene = Scene_Menu.new(0)
return
end
# C 버튼이 밀렸을 경우
if Input.trigger? (Input::C)
# 장비 고정의 경우
if @actor.equip_fix? (@right_window.index)
# 버저 SE 를 연주
$game_system.se_play($data_system.buzzer_se)
return
end
# 결정 SE 를 연주
$game_system.se_play($data_system.decision_se)
# 아이템 윈도우를 액티브화
@right_window.active = false
@item_window.active = true
@item_window.index = 0
return
end
# R 버튼이 밀렸을 경우
if Input.trigger? (Input::R)
# 커서 SE 를 연주
$game_system.se_play($data_system.cursor_se)
# 다음의 엑터에게
@actor_index += 1
@actor_index %= $game_party.actors.size
# 다른 장비 화면으로 전환하고
$scene = Scene_Equip.new(@actor_index, @right_window.index)
return
end
# L 버튼이 밀렸을 경우
if Input.trigger? (Input::L)
# 커서 SE 를 연주
$game_system.se_play($data_system.cursor_se)
# 전의 엑터에게
@actor_index += $game_party.actors.size - 1
@actor_index %= $game_party.actors.size
# 다른 장비 화면으로 전환하고
$scene = Scene_Equip.new(@actor_index, @right_window.index)
return
end
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (아이템 윈도우가 액티브의 경우)
#--------------------------------------------------------------------------
def update_item
# B 버튼이 밀렸을 경우
if Input.trigger? (Input::B)
# 캔슬 SE 를 연주
$game_system.se_play($data_system.cancel_se)
# 라이트 윈도우를 액티브화
@right_window.active = true
@item_window.active = false
@item_window.index = -1
return
end
# C 버튼이 밀렸을 경우
if Input.trigger? (Input::C)
# 장비 SE 를 연주
$game_system.se_play($data_system.equip_se)
# 아이템 윈도우로 현재 선택되고 있는 데이터를 취득
item = @item_window.item
# 장비를 변경
@actor.equip(@right_window.index, item == nil ? 0 : item.id)
# 라이트 윈도우를 액티브화
@right_window.active = true
@item_window.active = false
@item_window.index = -1
# 라이트 윈도우, 아이템 윈도우의 내용을 재작성
@right_window.refresh
@item_window.refresh
return
end
end
end
># ▼▲▼ XRXS_MP 6. 링 메뉴 도입 ver.1.2 ▼▲▼
># by 가즈키
>
>#==============================================================================
># □ 커스터마이즈 포인트
>#==============================================================================
>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_EXIT = RPG::Cache.icon("046-Skill03") # 「 종료 」메뉴의 아이콘
> ICON_DISABLE= RPG::Cache.icon("") # 사용 금지 항목을 뒤따르는 아이콘
> BACKGROUND_COLOR = Color.new(0xcc,0x99,0x33,0x3f)
>end
>###############################################################################
># 링 메뉴 도입 스크립트 Ver. 1.2
># writen by 가즈키
># - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
># ▽도입
># 0. 먼저 XRXL 2. 비트 맵/아이콘 묘사 를 넣어 두어 주세요.
># 1. 이 스크립트를Main섹션 위에 만든 새로운 섹션에 카피하는
># 2. Window_RingMenu의 상부에 있는 7개의 것 RPG::Cache.icon("") 의 "" 의 안에
># 오른쪽의 설명에 써 있는 커멘드용의 아이콘명을 쓴다.
># (맨 밑의 사용 금지는 선택할 수 없는 메뉴에 거듭하는 아이콘입니다.
># 이런 건이 좋을지도→ φ )
># 3. 아이콘 설정의 바로 아래에 있는 SE_STARTUP = "" 것 "" 의 안에 메뉴를
># 열었을 때에 울리고 싶은 것SE의 이름을 쓴다.
># ▽스크립트 접하는 사람에게
># 우선 움직이는 것을 목표로 만든 것이므로(뜻 낮은 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.equip
> s2 = $data_system.words.skill
> s3 = $data_system.words.item
> s4 = "스테이터스"
> s5 = "세이브"
> s6 = "게임 종료"
> @commands = [ s1, s2, s3, s4, s5, s6 ]
> @item_max = 6
> @index = 0
> @items = [ICON_EQUIP, ICON_SKILL, ICON_ITEM, ICON_STATUS, ICON_SAVE, ICON_EXIT ]
> @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
> # 스프라이트 세트를 작성
> @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
> 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 2 # 아이템
> # 결정 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 0 # 장비
> # 결정 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 # 게임 종료
> # 결정 SE 을 연주
> $game_system.se_play($data_system.decision_se)
> # 게임 종료 화면으로 전환하고
> $scene = Scene_End.new
> end
> return
> end
> # 애니메이션중이라면 커서의 처리를 실시하지 않는
> return if @command_window.animation?
> # ↑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_MOVEL)
> @help_window.set_text(@command_window.commands[@command_window.index],1)
> return
> end
> # ↓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_MOVER)
> @help_window.set_text(@command_window.commands[@command_window.index],1)
> return
> end
> 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 0 # 장비
> # 결정 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
>
>
>
# ■ Scene_Item
#------------------------------------------------------------------------------
# 아이템 화면의 처리를 실시하는 클래스입니다.
#==============================================================================
class Scene_Item
#--------------------------------------------------------------------------
# ● 메인 처리
#--------------------------------------------------------------------------
def main
# 헬프 윈도우, 아이템 윈도우를 작성
@help_window = Window_Help.new
@item_window = Window_Item.new
# 헬프 윈도우를 관련짓고
@item_window.help_window = @help_window
# 타겟 윈도우를 작성 (불가시·비액티브하게 설정)
@target_window = Window_Target.new
@target_window.visible = false
@target_window.active = false
# 트란지션 실행
Graphics.transition
# 메인 루프
loop do
# 게임 화면을 갱신
Graphics.update
# 입력 정보를 갱신
Input.update
# 프레임 갱신
update
# 화면이 바뀌면(자) 루프를 중단
if $scene != self
break
end
end
# 트란지션 준비
Graphics.freeze
# 윈도우를 해방
@help_window.dispose
@item_window.dispose
@target_window.dispose
end
#--------------------------------------------------------------------------
# ● 프레임 갱신
#--------------------------------------------------------------------------
def update
# 윈도우를 갱신
@help_window.update
@item_window.update
@target_window.update
# 아이템 윈도우가 액티브의 경우: update_item 를 부른다
if @item_window.active
update_item
return
end
# 타겟 윈도우가 액티브의 경우: update_target 를 부른다
if @target_window.active
update_target
return
end
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (아이템 윈도우가 액티브의 경우)
#--------------------------------------------------------------------------
def update_item
# B 버튼이 밀렸을 경우
if Input.trigger? (Input::B)
# 캔슬 SE 를 연주
$game_system.se_play($data_system.cancel_se)
# 메뉴 화면으로 전환하고
$scene = Scene_Menu.new(2)
return
end
# C 버튼이 밀렸을 경우
if Input.trigger? (Input::C)
# 아이템 윈도우로 현재 선택되고 있는 데이터를 취득
@item = @item_window.item
# 사용 아이템이 아닌 경우
unless @item.is_a? (RPG::Item)
# 버저 SE 를 연주
$game_system.se_play($data_system.buzzer_se)
return
end
# 사용할 수 없는 경우
unless $game_party.item_can_use? (@item.id)
# 버저 SE 를 연주
$game_system.se_play($data_system.buzzer_se)
return
end
# 결정 SE 를 연주
$game_system.se_play($data_system.decision_se)
# 효과 범위가 아군의 경우
if @item.scope >= 3
# 타겟 윈도우를 액티브화
@item_window.active = false
@target_window.x = (@item_window.index + 1) % 2 * 304
@target_window.visible = true
@target_window.active = true
# 효과 범위 (단체/전체)에 응해 커서 위치를 설정
if @item.scope == 4 || @item.scope == 6
@target_window.index = -1
else
@target_window.index = 0
end
# 효과 범위가 아군 이외의 경우
else
# 코먼 이벤트 ID 가 유효의 경우
if @item.common_event_id > 0
# 코먼 이벤트 호출 예약
$game_temp.common_event_id = @item.common_event_id
# 아이템의 사용시 SE 를 연주
$game_system.se_play(@item.menu_se)
# 소모품의 경우
if @item.consumable
# 사용한 아이템을 1 줄인다
$game_party.lose_item(@item.id, 1)
# 아이템 윈도우의 항목을 재묘화
@item_window.draw_item(@item_window.index)
end
# 맵 화면으로 전환하고
$scene = Scene_Map.new
return
end
end
return
end
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (타겟 윈도우가 액티브의 경우)
#--------------------------------------------------------------------------
def update_target
# B 버튼이 밀렸을 경우
if Input.trigger? (Input::B)
# 캔슬 SE 를 연주
$game_system.se_play($data_system.cancel_se)
# 아이템 조각등으로 사용할 수 없게 되었을 경우
unless $game_party.item_can_use? (@item.id)
# 아이템 윈도우의 내용을 재작성
@item_window.refresh
end
# 타겟 윈도우를 소거
@item_window.active = true
@target_window.visible = false
@target_window.active = false
return
end
# C 버튼이 밀렸을 경우
if Input.trigger? (Input::C)
# 아이템을 다 사용했을 경우
if $game_party.item_number(@item.id) == 0
# 버저 SE 를 연주
$game_system.se_play($data_system.buzzer_se)
return
end
# 타겟이 전체의 경우
if @target_window.index == -1
# 파티 전체에 아이템의 사용 효과를 적용
used = false
for i in $game_party.actors
used |= i.item_effect(@item)
end
end
# 타겟이 단체의 경우
if @target_window.index >= 0
# 타겟의 엑터에게 아이템의 사용 효과를 적용
target = $game_party.actors[@target_window.index]
used = target.item_effect(@item)
end
# 아이템을 사용했을 경우
if used
# 아이템의 사용시 SE 를 연주
$game_system.se_play(@item.menu_se)
# 소모품의 경우
if @item.consumable
# 사용한 아이템을 1 줄인다
$game_party.lose_item(@item.id, 1)
# 아이템 윈도우의 항목을 재묘화
@item_window.draw_item(@item_window.index)
end
# 타겟 윈도우의 내용을 재작성
@target_window.refresh
# 코먼 이벤트 ID 가 유효의 경우
if @item.common_event_id > 0
# 코먼 이벤트 호출 예약
$game_temp.common_event_id = @item.common_event_id
# 맵 화면으로 전환하고
$scene = Scene_Map.new
return
end
end
# 아이템을 사용하지 않았던 경우
unless used
# 버저 SE 를 연주
$game_system.se_play($data_system.buzzer_se)
end
return
end
end
end
#==============================================================================
# ■ Scene_Equip
#------------------------------------------------------------------------------
# 장비 화면의 처리를 실시하는 클래스입니다.
#==============================================================================
class Scene_Equip
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
# actor_index : 엑터 인덱스
# equip_index : 장비 인덱스
#--------------------------------------------------------------------------
def initialize(actor_index = 0, equip_index = 0)
@actor_index = actor_index
@equip_index = equip_index
end
#--------------------------------------------------------------------------
# ● 메인 처리
#--------------------------------------------------------------------------
def main
# 엑터를 취득
@actor = $game_party.actors[@actor_index]
# 윈도우를 작성
@help_window = Window_Help.new
@left_window = Window_EquipLeft.new(@actor)
@right_window = Window_EquipRight.new(@actor)
@item_window1 = Window_EquipItem.new(@actor, 0)
@item_window2 = Window_EquipItem.new(@actor, 1)
@item_window3 = Window_EquipItem.new(@actor, 2)
@item_window4 = Window_EquipItem.new(@actor, 3)
@item_window5 = Window_EquipItem.new(@actor, 4)
# 헬프 윈도우를 관련짓고
@right_window.help_window = @help_window
@item_window1.help_window = @help_window
@item_window2.help_window = @help_window
@item_window3.help_window = @help_window
@item_window4.help_window = @help_window
@item_window5.help_window = @help_window
# 커서 위치를 설정
@right_window.index = @equip_index
refresh
# 트란지션 실행
Graphics.transition
# 메인 루프
loop do
# 게임 화면을 갱신
Graphics.update
# 입력 정보를 갱신
Input.update
# 프레임 갱신
update
# 화면이 바뀌면(자) 루프를 중단
if $scene != self
break
end
end
# 트란지션 준비
Graphics.freeze
# 윈도우를 해방
@help_window.dispose
@left_window.dispose
@right_window.dispose
@item_window1.dispose
@item_window2.dispose
@item_window3.dispose
@item_window4.dispose
@item_window5.dispose
end
#--------------------------------------------------------------------------
# ● 리프레쉬
#--------------------------------------------------------------------------
def refresh
# 아이템 윈도우의 가시 상태 설정
@item_window1.visible = (@right_window.index == 0)
@item_window2.visible = (@right_window.index == 1)
@item_window3.visible = (@right_window.index == 2)
@item_window4.visible = (@right_window.index == 3)
@item_window5.visible = (@right_window.index == 4)
# 현재 장비중의 아이템을 취득
item1 = @right_window.item
# 현재의 아이템 윈도우를 @item_window 로 설정
case @right_window.index
when 0
@item_window = @item_window1
when 1
@item_window = @item_window2
when 2
@item_window = @item_window3
when 3
@item_window = @item_window4
when 4
@item_window = @item_window5
end
# 라이트 윈도우가 액티브의 경우
if @right_window.active
# 장비 변경 후의 파라미터를 소거
@left_window.set_new_parameters(nil, nil, nil)
end
# 아이템 윈도우가 액티브의 경우
if @item_window.active
# 현재 선택중의 아이템을 취득
item2 = @item_window.item
# 장비를 변경
@actor.equip(@right_window.index, item2 == nil ? 0 : item2.id)
# 장비 변경 후의 파라미터를 취득
new_atk = @actor.atk
new_pdef = @actor.pdef
new_mdef = @actor.mdef
# 장비를 되돌린다
@actor.equip(@right_window.index, item1 == nil ? 0 : item1.id)
# 레프트 윈도우에 묘화
@left_window.set_new_parameters(new_atk, new_pdef, new_mdef)
end
end
#--------------------------------------------------------------------------
# ● 프레임 갱신
#--------------------------------------------------------------------------
def update
# 윈도우를 갱신
@left_window.update
@right_window.update
@item_window.update
refresh
# 라이트 윈도우가 액티브의 경우: update_right 를 부른다
if @right_window.active
update_right
return
end
# 아이템 윈도우가 액티브의 경우: update_item 를 부른다
if @item_window.active
update_item
return
end
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (라이트 윈도우가 액티브의 경우)
#--------------------------------------------------------------------------
def update_right
# B 버튼이 밀렸을 경우
if Input.trigger? (Input::B)
# 캔슬 SE 를 연주
$game_system.se_play($data_system.cancel_se)
# 메뉴 화면으로 전환하고
$scene = Scene_Menu.new(0)
return
end
# C 버튼이 밀렸을 경우
if Input.trigger? (Input::C)
# 장비 고정의 경우
if @actor.equip_fix? (@right_window.index)
# 버저 SE 를 연주
$game_system.se_play($data_system.buzzer_se)
return
end
# 결정 SE 를 연주
$game_system.se_play($data_system.decision_se)
# 아이템 윈도우를 액티브화
@right_window.active = false
@item_window.active = true
@item_window.index = 0
return
end
# R 버튼이 밀렸을 경우
if Input.trigger? (Input::R)
# 커서 SE 를 연주
$game_system.se_play($data_system.cursor_se)
# 다음의 엑터에게
@actor_index += 1
@actor_index %= $game_party.actors.size
# 다른 장비 화면으로 전환하고
$scene = Scene_Equip.new(@actor_index, @right_window.index)
return
end
# L 버튼이 밀렸을 경우
if Input.trigger? (Input::L)
# 커서 SE 를 연주
$game_system.se_play($data_system.cursor_se)
# 전의 엑터에게
@actor_index += $game_party.actors.size - 1
@actor_index %= $game_party.actors.size
# 다른 장비 화면으로 전환하고
$scene = Scene_Equip.new(@actor_index, @right_window.index)
return
end
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (아이템 윈도우가 액티브의 경우)
#--------------------------------------------------------------------------
def update_item
# B 버튼이 밀렸을 경우
if Input.trigger? (Input::B)
# 캔슬 SE 를 연주
$game_system.se_play($data_system.cancel_se)
# 라이트 윈도우를 액티브화
@right_window.active = true
@item_window.active = false
@item_window.index = -1
return
end
# C 버튼이 밀렸을 경우
if Input.trigger? (Input::C)
# 장비 SE 를 연주
$game_system.se_play($data_system.equip_se)
# 아이템 윈도우로 현재 선택되고 있는 데이터를 취득
item = @item_window.item
# 장비를 변경
@actor.equip(@right_window.index, item == nil ? 0 : item.id)
# 라이트 윈도우를 액티브화
@right_window.active = true
@item_window.active = false
@item_window.index = -1
# 라이트 윈도우, 아이템 윈도우의 내용을 재작성
@right_window.refresh
@item_window.refresh
return
end
end
end
># ▼▲▼ XRXS_MP 6. 링 메뉴 도입 ver.1.2 ▼▲▼
># by 가즈키
>
>#==============================================================================
># □ 커스터마이즈 포인트
>#==============================================================================
>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_EXIT = RPG::Cache.icon("046-Skill03") # 「 종료 」메뉴의 아이콘
> ICON_DISABLE= RPG::Cache.icon("") # 사용 금지 항목을 뒤따르는 아이콘
> BACKGROUND_COLOR = Color.new(0xcc,0x99,0x33,0x3f)
>end
>###############################################################################
># 링 메뉴 도입 스크립트 Ver. 1.2
># writen by 가즈키
># - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
># ▽도입
># 0. 먼저 XRXL 2. 비트 맵/아이콘 묘사 를 넣어 두어 주세요.
># 1. 이 스크립트를Main섹션 위에 만든 새로운 섹션에 카피하는
># 2. Window_RingMenu의 상부에 있는 7개의 것 RPG::Cache.icon("") 의 "" 의 안에
># 오른쪽의 설명에 써 있는 커멘드용의 아이콘명을 쓴다.
># (맨 밑의 사용 금지는 선택할 수 없는 메뉴에 거듭하는 아이콘입니다.
># 이런 건이 좋을지도→ φ )
># 3. 아이콘 설정의 바로 아래에 있는 SE_STARTUP = "" 것 "" 의 안에 메뉴를
># 열었을 때에 울리고 싶은 것SE의 이름을 쓴다.
># ▽스크립트 접하는 사람에게
># 우선 움직이는 것을 목표로 만든 것이므로(뜻 낮은 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.equip
> s2 = $data_system.words.skill
> s3 = $data_system.words.item
> s4 = "스테이터스"
> s5 = "세이브"
> s6 = "게임 종료"
> @commands = [ s1, s2, s3, s4, s5, s6 ]
> @item_max = 6
> @index = 0
> @items = [ICON_EQUIP, ICON_SKILL, ICON_ITEM, ICON_STATUS, ICON_SAVE, ICON_EXIT ]
> @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
> # 스프라이트 세트를 작성
> @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
> 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 2 # 아이템
> # 결정 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 0 # 장비
> # 결정 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 # 게임 종료
> # 결정 SE 을 연주
> $game_system.se_play($data_system.decision_se)
> # 게임 종료 화면으로 전환하고
> $scene = Scene_End.new
> end
> return
> end
> # 애니메이션중이라면 커서의 처리를 실시하지 않는
> return if @command_window.animation?
> # ↑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_MOVEL)
> @help_window.set_text(@command_window.commands[@command_window.index],1)
> return
> end
> # ↓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_MOVER)
> @help_window.set_text(@command_window.commands[@command_window.index],1)
> return
> end
> 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 0 # 장비
> # 결정 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
>
>
>