RPGXP 아이템의 타입을 새로 정의하고 싶은데요.
2007.07.30 09:36
아래의 스크립트는 아이템을 종류별로 분류하여 보여주는 스크립트 입니다.
-사용방법-
우선 스크립트창을 띄어서 Main 이라는 곳에 마우스 우클릭 '삽입' 하고 빈 클래스를 만드세요.
그 다음 그 빈 클래스 이름을 Harts_Window_ItemTitle 로 정하고 아래 스크립트를 전부 복사해서 내용에 붙이고 저장하세요.
#==============================================================================
# ■ Harts_Window_ItemTitle
#------------------------------------------------------------------------------
# 아이템 화면에서 타이틀을 표시하는 윈도우。
#==============================================================================
class Harts_Window_ItemTitle < Window_Base
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
#--------------------------------------------------------------------------
def initialize
super(0, 0, 160, 64)
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.clear
self.contents.font.color = normal_color
self.contents.draw_text(4, 0, 120, 32, $data_system.words.item, 1)
end
end
#==============================================================================
# ■ Harts_Window_ItemCommand
#------------------------------------------------------------------------------
# 아이템의 종별 선택을 실시하는 윈도우입니다.
#==============================================================================
class Harts_Window_ItemCommand < Window_Selectable
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
#--------------------------------------------------------------------------
def initialize
super(0, 64, 160, 288)
self.contents = Bitmap.new(width - 32, height - 32)
@item_max = 8
@commands = ["유즈 아이템", "배틀 아이템", $data_system.words.weapon, $data_system.words.armor1, $data_system.words.armor2, $data_system.words.armor3, $data_system.words.armor4, "이벤트 아이템"]
refresh
self.index = 0
end
#--------------------------------------------------------------------------
# ● 리프레쉬
#--------------------------------------------------------------------------
def refresh
self.contents.clear
for i in 0...@item_max
draw_item(i, normal_color)
end
end
#--------------------------------------------------------------------------
# ● 항목의묘화
# index : 항목번호
# color : 문자색
#--------------------------------------------------------------------------
def draw_item(index, color)
self.contents.font.color = color
y = index * 32
self.contents.draw_text(4, y, 128, 32, @commands[index])
end
#--------------------------------------------------------------------------
# ● 헬프텍스트 갱신
#--------------------------------------------------------------------------
def update_help
case self.index
when 0
@text = @commands[0]
when 1
@text = @commands[1]
when 2
@text = @commands[2]
when 3
@text = @commands[3]
when 4
@text = @commands[4]
when 5
@text = @commands[5]
when 6
@text = @commands[6]
when 7
@text = @commands[7]
end
@help_window.set_text(@text)
end
end
#==============================================================================
# ■ Window_Item
#------------------------------------------------------------------------------
# 아이템 화면에서, 소지 아이템의 일람을 표시하는 윈도우입니다.
#==============================================================================
class Harts_Window_ItemList < Window_Selectable
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
#--------------------------------------------------------------------------
def initialize
super(160, 0, 480, 416)
refresh
self.index = 0
end
#--------------------------------------------------------------------------
# ● 아이템의 취득
#--------------------------------------------------------------------------
def item
return @data[self.index]
end
#--------------------------------------------------------------------------
# ● 리프레쉬
#--------------------------------------------------------------------------
def refresh
if self.contents != nil
self.contents.dispose
self.contents = nil
end
@data = []
end
#--------------------------------------------------------------------------
# ● 아이템 일람 설정
# command : 선택중의 커맨드
#--------------------------------------------------------------------------
def set_item(command)
refresh
case command
when 0
for i in 1...$data_items.size
if ($data_items[i].occasion == 0 or $data_items[i].occasion == 2) and $game_party.item_number(i) > 0
@data.push($data_items[i])
end
end
when 1
for i in 1...$data_items.size
if ($data_items[i].occasion == 1 and $game_party.item_number(i) > 0)
@data.push($data_items[i])
end
end
when 2
for i in 1...$data_weapons.size
if $game_party.weapon_number(i) > 0
@data.push($data_weapons[i])
end
end
when 3
for i in 1...$data_armors.size
if $data_armors[i].kind == 0 and $game_party.armor_number(i) > 0
@data.push($data_armors[i])
end
end
when 4
for i in 1...$data_armors.size
if $data_armors[i].kind == 1 and $game_party.armor_number(i) > 0
@data.push($data_armors[i])
end
end
when 5
for i in 1...$data_armors.size
if $data_armors[i].kind == 2 and $game_party.armor_number(i) > 0
@data.push($data_armors[i])
end
end
when 6
for i in 1...$data_armors.size
if $data_armors[i].kind == 3 and $game_party.armor_number(i) > 0
@data.push($data_armors[i])
end
end
when 7
for i in 1...$data_items.size
if $data_items[i].occasion == 3 and $game_party.item_number(i) > 0
@data.push($data_items[i])
end
end
end
# 항목수가 0 이 아니면 비트 맵을 작성해, 전항목을 묘화
@item_max = @data.size
if @item_max > 0
self.contents = Bitmap.new(width - 32, row_max * 32)
self.contents.clear
for i in 0...@item_max
draw_item(i)
end
end
end
#--------------------------------------------------------------------------
# ● 종류별 아이템 수의 취득
#--------------------------------------------------------------------------
def item_number
return @item_max
end
#--------------------------------------------------------------------------
# ● 항목의 묘화
# index : 항목번호
#--------------------------------------------------------------------------
def draw_item(index)
item = @data[index]
case item
when RPG::Item
number = $game_party.item_number(item.id)
when RPG::Weapon
number = $game_party.weapon_number(item.id)
when RPG::Armor
number = $game_party.armor_number(item.id)
end
if item.is_a?(RPG::Item) and
$game_party.item_can_use?(item.id)
self.contents.font.color = normal_color
else
self.contents.font.color = disabled_color
end
x = 4
y = index * 32
bitmap = RPG::Cache.icon(item.icon_name)
opacity = self.contents.font.color == normal_color ? 255 : 128
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
self.contents.draw_text(x + 400, y, 16, 32, ":", 1)
self.contents.draw_text(x + 416, y, 24, 32, number.to_s, 2)
end
#--------------------------------------------------------------------------
# ● 헬프 텍스트 갱신
#--------------------------------------------------------------------------
def update_help
@help_window.set_text(self.item == nil ? "" : self.item.description)
end
end
#==============================================================================
# ■ Harts_Scene_Item
#------------------------------------------------------------------------------
# 아이템 화면의 처리를 실시하는 클래스입니다. 재정의
#==============================================================================
class Scene_Item
#--------------------------------------------------------------------------
# ● 메인 처리
#--------------------------------------------------------------------------
def main
# 타이틀 윈도우를 작성
@itemtitle_window = Harts_Window_ItemTitle.new
#커멘드 윈도우를 작성
@itemcommand_window = Harts_Window_ItemCommand.new
@command_index = @itemcommand_window.index
#아이템 윈도우를 작성
@itemlist_window = Harts_Window_ItemList.new
@itemlist_window.active = false
#헬프 윈도우를 작성
@help_window = Window_Help.new
@help_window.x = 0
@help_window.y = 416
# 헬프 윈도우를 관련지어
@itemcommand_window.help_window = @help_window
@itemlist_window.help_window = @help_window
# 타겟 윈도우를 작성 (불가시·비액티브하게 설정)
@target_window = Window_Target.new
@target_window.visible = false
@target_window.active = false
# 아이템 윈도우 내용 표시
@itemlist_window.set_item(@command_index)
# 트란지션 실행
Graphics.transition
# 메인 루프
loop do
# 게임 화면을 갱신
Graphics.update
# 입력 정보를 갱신
Input.update
# 프레임 갱신
update
# 화면이 바뀌면 루프를 중단
if $scene != self
break
end
end
# 트란지션 준비
Graphics.freeze
# 윈도우를 해방
@itemtitle_window.dispose
@itemcommand_window.dispose
@itemlist_window.dispose
@help_window.dispose
@target_window.dispose
end
#--------------------------------------------------------------------------
# ● 프레임 갱신
#--------------------------------------------------------------------------
def update
# 윈도우를 갱신
@itemtitle_window.update
@itemcommand_window.update
@itemlist_window.update
@help_window.update
@target_window.update
if @command_index != @itemcommand_window.index
@command_index = @itemcommand_window.index
@itemlist_window.set_item(@command_index)
end
# 커멘드 윈도우가 액티브의 경우: update_itemcommand 를 부른다
if @itemcommand_window.active
update_itemcommand
return
end
# 아이템 윈도우가 액티브의 경우: update_itemlist 를 부른다
if @itemlist_window.active
update_itemlist
return
end
# 타겟 윈도우가 액티브의 경우: update_target 를 부른다
if @target_window.active
update_target
return
end
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (커멘드 윈도우가 액티브의 경우)
#--------------------------------------------------------------------------
def update_itemcommand
# 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 @itemlist_window.item_number == 0
# 버저 SE 를 연주
$game_system.se_play($data_system.buzzer_se)
return
end
# 결정 SE 를 연주
$game_system.se_play($data_system.decision_se)
# 아이템 윈도우를 액티브하게 한다
@itemcommand_window.active = false
@itemlist_window.active = true
@itemlist_window.index = 0
return
end
end
#--------------------------------------------------------------------------
# ● 프레임 갱신 (아이템 윈도우가 액티브의 경우)
#--------------------------------------------------------------------------
def update_itemlist
# B 버튼이 밀렸을 경우
if Input.trigger?(Input::B)
# 캔슬 SE 를 연주
$game_system.se_play($data_system.cancel_se)
# 아이템 윈도우를 액티브하게 한다
@itemcommand_window.active = true
@itemlist_window.active = false
@itemlist_window.index = 0
@itemcommand_window.index = @command_index
return
end
# C 버튼이 밀렸을 경우
if Input.trigger?(Input::C)
# 아이템 윈도우로 현재 선택되고 있는 데이터를 취득
@item = @itemlist_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
# 타겟 윈도우를 액티브화
@itemlist_window.active = false
@target_window.x = 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)
# アイテムウィンドウの項目を再描画
@itemlist_window.draw_item(@itemlist_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)
# アイテムウィンドウの内容を再作成
@itemlist_window.refresh
end
# ターゲットウィンドウを消去
@itemlist_window.active = true
@target_window.visible = false
@target_window.active = false
@itemlist_window.set_item(@command_index)
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)
# 아이템 윈도우의 항목을 재묘화
@itemlist_window.draw_item(@itemlist_window.index)
@itemlist_window.set_item(@command_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
여기서 제가 하려는 것은 뭐냐면,
무기, 방어구 등의 아이템들은 아예 안나오고,(게임 내에서 사용하지 않아서)
게임 내에선 이벤트성 아이템(편지같은 거.....)를 용도에 따라 여러가지로 분류해서
이 스크립트가 제가 정의한 아이템 타입대로 아이템을 분류해서 보여줬으면 합니다.
나름 도움말과 스크립트를 몇시간째 노려보고 있지만 루비를 잘 몰라서 그런지 잘 모르겠네요
다시 요약하면, 사용자 정의의 아이템 타입(게임 내에선 이벤트 아이템과 동일합니다)을 여러개 만들고,
위 스크립트가 새로 정의된 타입에 맞게 아이템을 분류해주길 원합니다.
완벽한 답변을 요구하는게 아니니 조금이라도 도움을 주셨으면 하는 바람입니다.
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
379 | RPG XP 를 받긴 했습니다만... | 『덩키동크』 | 2007.12.10 | 282 |
378 | RPG XP 를 받긴 했습니다만... | 류현 | 2007.12.10 | 539 |
377 | 생초보- 맵 연결 (장소 이동) 질문. | 『덩키동크』 | 2007.12.01 | 69 |
376 | 생초보- 맵 연결 (장소 이동) 질문. | eclipse | 2007.12.01 | 383 |
375 | 마우스 관련 답변 부탁드립니다. [1] | 울스M | 2007.10.29 | 342 |
374 | 좌표구하기에 관한 질문입니다. | 『덩키동크』 | 2007.10.14 | 61 |
373 | 좌표구하기에 관한 질문입니다. | contect | 2007.10.11 | 373 |
372 | RPG XP 조작키 변경에 대해 가르쳐주세요 | 반데드 | 2007.10.02 | 255 |
371 | RPG XP 조작키 변경에 대해 가르쳐주세요 | 유진 | 2007.09.20 | 522 |
370 | RPG XP 조작키 변경에 대해 가르쳐주세요 [1] | Raview | 2007.09.19 | 617 |
369 | RXP데미지계산 문제가 있어요!!! | 리스티온 | 2007.09.09 | 319 |
368 | 애니메이션 제작 [1] | 『덩키동크』 | 2007.08.15 | 103 |
367 | 애니메이션 제작 [2] | 속박의사슬 | 2007.08.13 | 436 |
366 | sp를 회복하는 스킬을 만드는 법 | yakanhikou | 2007.08.11 | 364 |
365 | 퀘스트목록 만들기 [2] | 자크 | 2007.08.08 | 628 |
364 | 스크립트로 커먼 이벤트 실행하는법? [3] | PENJi | 2007.08.05 | 489 |
363 | [스크립트]게이지바 글자 올리는법좀.. [2] | 하앍하앍~ | 2007.08.01 | 4413 |
362 | XP에선 문장의표시에서 글자색이나 글자속도를.. | 하앍하앍~ | 2007.07.31 | 231 |
» | 아이템의 타입을 새로 정의하고 싶은데요. | PENJi | 2007.07.30 | 359 |
360 | 고정되어있는 이벤트 움직이는 모션 설정하기 | 나카리 | 2007.07.29 | 126 |