#==============================================================================
# ■ Scene_Item
#------------------------------------------------------------------------------
# 아이템 화면의 처리를 실시하는 클래스입니다.
#==============================================================================
class Scene_Item2
#--------------------------------------------------------------------------
# ● 메인 처리
#--------------------------------------------------------------------------
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_Map.new
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
# 전멸의 경우
if $game_party.all_dead?
# 게임 오버 화면으로 전환해
$scene = Scene_Gameover.new
return
end
# 코먼 이벤트 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
넣어주세요.
이게뭐냐면 원래 아이템창 스크립트의 변형형입니다.
제가 변형시킨거 ESC를 누를떄 원래 메뉴로가는걸 맵으로 가게 바꿨죠.
맨위쯤 # 메뉴 화면으로 전환해 쪽 아래 1줄을 바꾼겁니다. 원래 Scene_Item 에서요.
그리고 이 창은 스크립트로 호출할 수 있어요.
$scene = Scene_Item2.new
로 호출이 됩니다.
그럼 특정 버튼누를때 이 스크립트를 호출되게만 하면 아이템창만 뜨고, 닫으면 그대로 창이 닫히게됩니다.
꼭 아이템창 아니더라도 다른것도 다 이런식으로 수정해서 사용 가능합니다.
원래의 스크립트에서 제가 수정한것 빨간처리 했으니 잘 보시고 그냥 갖다 붙여쓰시기보다는 내용을 한번 분석해보시면 도움이 될겁니다.
우선 키 입력으로 조건분기 여는방법은 아시죠? 안다고 가정하고 답변을 드리죠.
우선 스키립트의 하나 새로 추가해주시고요.
이름은 Scene_Item2
내용은
#==============================================================================
# ■ Scene_Item
#------------------------------------------------------------------------------
# 아이템 화면의 처리를 실시하는 클래스입니다.
#==============================================================================
class Scene_Item2
#--------------------------------------------------------------------------
# ● 메인 처리
#--------------------------------------------------------------------------
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_Map.new
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
# 전멸의 경우
if $game_party.all_dead?
# 게임 오버 화면으로 전환해
$scene = Scene_Gameover.new
return
end
# 코먼 이벤트 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
넣어주세요.
이게뭐냐면 원래 아이템창 스크립트의 변형형입니다.
제가 변형시킨거 ESC를 누를떄 원래 메뉴로가는걸 맵으로 가게 바꿨죠.
맨위쯤 # 메뉴 화면으로 전환해 쪽 아래 1줄을 바꾼겁니다. 원래 Scene_Item 에서요.
그리고 이 창은 스크립트로 호출할 수 있어요.
$scene = Scene_Item2.new
로 호출이 됩니다.
그럼 특정 버튼누를때 이 스크립트를 호출되게만 하면 아이템창만 뜨고, 닫으면 그대로 창이 닫히게됩니다.
꼭 아이템창 아니더라도 다른것도 다 이런식으로 수정해서 사용 가능합니다.
원래의 스크립트에서 제가 수정한것 빨간처리 했으니 잘 보시고 그냥 갖다 붙여쓰시기보다는 내용을 한번 분석해보시면 도움이 될겁니다.