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
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
359 | 걸어갈때 | Chemistry | 2008.01.20 | 377 |
358 | rpgxp 스크립트 에러 질문 | 엔젤레기온 | 2008.02.18 | 376 |
357 | 간단한 질문 한가지만 드릴게요 ^ㅡ^ [1] | 황혼의새벽 | 2006.10.19 | 373 |
356 | 스크립트를 껐다켰다 할수 없나요?? | 잘생긴넘 | 2007.05.12 | 373 |
355 | 좌표구하기에 관한 질문입니다. | contect | 2007.10.11 | 373 |
354 | 링메뉴스크립트의 문제점발견.고치는방법좀. [2] | sky- | 2006.12.29 | 370 |
353 | 2k몬스터칩은 xp에서못쓰는건가요? | 카롤스 | 2008.01.01 | 370 |
352 | 게임 만드는 것에대한 질문 | 블라블라울라블라 | 2009.08.14 | 370 |
351 | 제가 오늘 RPG만들기 2000 을 처음 하는데요 .... 꼭 답변좀 [2] | 둥근해가떡섭니다 | 2006.08.22 | 364 |
350 | sp를 회복하는 스킬을 만드는 법 | yakanhikou | 2007.08.11 | 364 |
349 | xp 그림 화면에 맞추는 방법. [2] | 아미상 | 2006.12.31 | 362 |
348 | 온라인스크립트와 말하기스크립트 | 랜덤상장 | 2007.07.25 | 360 |
» | 아이템의 타입을 새로 정의하고 싶은데요. | PENJi | 2007.07.30 | 359 |
346 | 횡스크롤 스크립트... [1] | 오징어쪼아 | 2006.08.07 | 357 |
345 | RPGXP의 도트와 게임에 대해서 ㅇㅁㅇ;;왕초보 | 『덩키동크』 | 2006.12.08 | 357 |
344 | 간단한건지 안되는건지모르겠는데.질문이요... [2] | 왜다중복인거야 | 2006.10.30 | 356 |
343 | RPGXP 캐릭터 이동?...에..대해서.. | RPGgood | 2006.08.06 | 354 |
342 | 다섯가지 질문요^^;; [1] | Roger | 2007.02.01 | 353 |
341 | 전투방식을 이렇게 할순 없을까요? [2] | 퀘니히크 | 2007.02.01 | 352 |
340 | 오프닝 만들때... | 로에군 | 2007.02.22 | 351 |