고급강의실
2014.10.16 13:23

RPG Maker VX Ace - 선택지 윈도우 만들기

조회 수 1797 추천 수 2 댓글 2
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

 저번 강좌는 정적 윈도우(입력시 다른 작동을 하지 않는 윈도우)를 생성하는 방법을 알려드렸습니다.

 이번엔 선택 윈도우(선택지 윈도우, Command 윈도우)를 알아 보고자 합니다.


커서 만들기.jpg


 선택지 윈도우는 Window_Command를 상속 받아서 사용하시면 만들 수 있습니다.

 여기서 중요한 것은 Window에서도 선택지에 관련된 정보를 가지고 있다는 점입니다.

 Window의 내용을 보시면,

 

cursor_rect The cursor box (Rect). Specifies a rectangle with coordinates based on the window's contents. (RGSS3)


cursor_rect라고 하여 선택지의 커서 네모를 뜻하는 것이 들어가 있습니다.

그 외도, 글을 표시하는 효과인 contents가 있습니다.(이것은 정적 윈도우를 만들때도 사용한 것으로 글자 표시할때 사용했습니다.)


 선택지 윈도우를 위해서 Window_Command을 상속받은 클래스를 새로 만듭니다.


class Window_Test_Command < Window_Command

end


Window_Command는 Window_Selectable를 상속받은 클래스로, 선택지를 저장하고 표시하는 클래스입니다.

Window_Selectable는 선택을 위해서 입력 받는 함수들이 정의 내려져 있는 클래스들입니다.


 Window_Command는 선택지 리스트를 출력하기 쉽게 정의가 내려져있기 때문에, 선택지를 원하실때는 Window_Command를 사용하시길 바랍니다.


 초기화를 시키겠습니다.

def initialize

clear_command_list

make_command_list

super(0, 0)

end


여기서 clear_command_list는 command_list(선택창 리스트)를  비워 초기화 하는 함수입니다.

이 함수는 Window_Command에 정의가 내려져 있습니다.


make_command_list는 Window_Command에 정의 내려져 있지만, 비어 있는 채로 정의가 내려져 있으며, 이 함수를 이용해서 선택창의 정보를 추가하는 방식으로 되어 있습니다.


make_command_list를 정의내리겠습니다.


def make_command_list

add_command("Test", :name)

add_command("Tests", :Tests)

end


add_command는 다음과 같이 정의가 되어 있습니다.

add_command(name, symbol, enabled = true, ext = nil)

name은 name해쉬 값을, symbol은 심볼값, enabled는 활성화, ext는 확장 장치입니다.


이렇게 하면, 이제 리스트가 추가 되었습니다.


확인 결과입니다.

커서 만들기.jpg

크기만 커졌지, 제대로 글자가 보이지 않습니다.

이유는 앞에 말씀드린, 윈도우는 그림이고, 그림을 그리게 명령어를 줘야합니다.

즉, make_command_list과 add_command는 단지, 선택에 관련된 정보를 저장하게 정의를 내리는 작업을 한것 뿐입니다.

이제, 그림을 그리게 만들어야 합니다.

refresh를 이용해서 나오게 하겠습니다.


def refresh

contents.clear

draw_all_items

end


이렇게 하면, 이제 글자가 보이게 됩니다.

여기서 draw_all_items에서 item은 앞에 나온

add_command("Test", :name)에서 "Test"를 띄우게 됩니다.


적용한 결과입니다.

커서 만들기.jpg


이제 선택하면 활동하도록 만드는 것을 원하실텐데, 작동은 앞에 말씀드린 Title 수정하기에 설명되어 있듯이

핸들러가 연결이 될 필요가 있습니다.

이것은 Window에 정의가 되지 않고, 장면(Scene)에 정의해야되므로, 나중에 하도록 하겠습니다.


이제, 꾸미기 위한 기본적인 정보와 함께 적용한걸 설명 드리겠습니다.

Window에서 기본적으로 꾸미는 장비는

windowskin, contents, cursor_rect 그 외 기타등등이 있는데, 주로는 windowskin과 contents, cursor_rect를 이용해서 만들 수 있습니다.

여기서 커서의 원리와 적용방법을 설명하겠습니다.


window는 열리자마자 항상 update를 실행하고 있습니다.(게임이 비활성화 될때까지 계속 실행시킵니다.)

그래서 update에 키를 입력 받을때, 행동을 취하게 하는

process_cursor_move와 핸들러를 실행시켰는지 확인하는 process_handling를 실행시킵니다.

이것은 Window_Selectable에 정의가 되어 있습니다.


def update

super

process_cursor_move

process_handling

end


이렇게 되어 있는것에서 super(상위 클래스)의 함수를 실행 시키지 않기 위해서 super를 제외 시킵니다.

super는 결국 Window 클래스의 update를 실행 시켜서 기존의 커서를 작동 시키게 만들기 때문에,

기존 커서를 작동을 막기 위해서라도 super를 지우시는게 좋습니다.


super를 지우고 실행 시켜보면, 놀랍게도 기존 커서가 이상없이 작동이 됩니다.

그 이유는 상위 클래스에서 정의내려진 cursor_rect를 수정하는 함수가 있는데가

Window_Selectable에 있기 때문입니다.

그래서 버튼을 눌르면 작동하게 되는 함수

update_cursor를 재 정의 내릴 필요가 있습니다.


def update_cursor

if @cursor_all

cursor_rect.set(0, 0, contents.width, row_max * item_height)

self.top_row = 0

elsif @index < 0

cursor_rect.empty

else

ensure_cursor_visible

#cursor_rect.set(item_rect(@index))

cursor_rect = item_rect(@index)

end

end


위에 함수 정의에서 원래 소스는 주석처리하고 추가 시킨 것을 보시면, cursor_rect를 새로운 rect로 변환시킨걸 볼 수 있습니다.

이상하게 set을 이용하면 원래 커서가 발동되고 작동 되기 때문입니다.

그래서 막은 후에 적용하셔야지 커서가 완벽하게 보이지 않습니다.


적용한 결과입니다.


커서 만들기.jpg


커서가 보이지 않게 되었습니다.


cursor_rect는 Rect클래스입니다.

Rect클래스는 단지 사각형 클래스로, 위치, 폭과 높이만 정의된 클래스입니다.

그리고 그걸 처리해주는 작업을 하는것이 Window에 정의내려진 Update 함수입니다.

그런데 그런 것을 모조리 다 막아 버렸으니 표시가 나오지 않게 되는 겁니다.


이제, 강제적으로 커서를 적용하도록 하겠습니다.


def update_cursor

if @cursor_all

cursor_rect.set(0, 0, contents.width, row_max * item_height)

self.top_row = 0

elsif @index < 0

cursor_rect.empty

else

ensure_cursor_visible

#cursor_rect.set(item_rect(@index))

cursor_rect = item_rect(@index)

contents.clear

contents.stretch_blt(cursor_rect, Cache.system("Window"),Rect.new(64,64,32,32))

draw_all_items

end

end


원래 있는건 주석 처리하고 추가 된것입니다.

cursor_rect만한 위치에 정의된 곳에서 그래픽에 있는 Window라는 그림의 위치(Rect.new(64,64,32,32)란, Window 그림에서 x축 64, y축 64, 넓이 32, 높이 32만큼 그림을 짤라서 가져오는 거라고 보시면 됩니다.)

contents는 글과 글자를 가지고 있기 때문에, 이렇게 작성할 수 있습니다.

stretch_blt는 그림에 일부분을 짤라서 적용시키는 함수입니다.

순서대로 한다면, 먼저 네모 위치를 정의내리고,

contents를 비운 후 네모위치에 맞게 네모를 그린 후에 글자를 띄우는 겁니다.



[이것을 보면, 2등신 캐릭터를 만드는 방법은 Bitmap에서 stretch_blt을 이용하여 3번째 매개 변수인 사각형을 2등신 혹은 4등신 캐릭터에 맞게 수정하면, 이상 없이 캐릭터를 보여줄 수 있게도 할 수 있음을 보여주게 되고, 그 외도 적용할 수 있게 됩니다.]


결과는 위에 있는 그림의 커서처럼 됩니다.


그 다음 그림의 뒷 배경이 회색으로 바뀌게 만드는 것은, Window_Base라고 정의 내려져 있는 것의 update_tone을 수정하시면 됩니다.

update_tone은 Tone 클래스를 받아서 처리하는 것으로, 시스템에서 윈도우 색을 설정할때 사용되는 소스입니다.(저장되는게 아닌 실질적으로 사용되는 소스입니다.)






-Window 파일에 관련되어 나와서 몇몇 데이터를 설명 드리겠습니다.


Window_Base에서 text_color라는게 존재합니다.

이것은 글자 색을 설정하는데 사용이 되는데, 이것이 Window파일에 있는 색상을 가져와서 적용합니다.

Window.png

붉은 네모친 곳


이것을 받아서 글자의 색상을 적용합니다.

색상을 가져오는데 사용되는 함수는 getPixel이라는 함수를 사용하여 색상을 가져오고,

뒷 배경이 정의 되어 지는 windowskin은 현재 그림의 가장 검은색(붉은 네모 왼쪽)과 위쪽에 있는 흰색 테두리를 받아서 적용합니다.


이상 선택지 윈도우 + 커서 변경 법이였습니다.


긴 글 읽어 주셨어 감사합니다.

?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수 추천 수
공지 초급강의실 게임제작강좌 A-Z 색인 (2016.1.24 ver) 2 file 천무 2016.01.12 7372 1
112 중급강의실 [상급강좌]VX 폰트 변경하기 1 양쭌 2015.07.12 1792 0
111 중급강의실 초보의 게임제작 도전기 #1-1[데이터 베이스 둘러보기] 2 치와도라 2015.05.05 1404 2
110 중급강의실 초보의 게임제작 도전기! #0 [RPG 만들기?] 치와도라 2015.05.05 1358 1
109 중급강의실 픽쳐 서서히 등장! 픽쳐 서서히 퇴장! 4 치와도라 2015.04.29 965 2
108 고급강의실 VX ACE XAS로 액션 RPG를 만들어보자! - 1. 개요 데크크래프트 2015.04.01 3964 0
107 중급강의실 VX Ace 픽쳐 메뉴 예제(V1.01) 2 APED 2015.03.18 1053 0
106 고급강의실 그림표시50개끝? 51개 해보자. 2  운 2014.12.01 1190 1
» 고급강의실 RPG Maker VX Ace - 선택지 윈도우 만들기 2 JunkMan 2014.10.16 1797 2
104 고급강의실 RPG Maker VX Ace - 윈도우 만들기 3 JunkMan 2014.10.16 2538 2
103 고급강의실 RPG Maker VX Ace - RPG Maker Title 장면(Scene) 수정하기. JunkMan 2014.10.15 1659 1
102 고급강의실 RPG Maker VX ACE - System 데이터 구조 JunkMan 2014.10.15 1056 0
101 고급강의실 RPG Maker VX ACE - CommonEvent 데이터 구조 JunkMan 2014.10.15 701 0
100 고급강의실 RPG Maker VX ACE - Animation 데이터 구조 JunkMan 2014.10.15 707 0
99 고급강의실 RPG Maker VX ACE - State 데이터 구조. JunkMan 2014.10.15 679 0
98 고급강의실 RPG Maker VX ACE - Troop 데이터 구조. JunkMan 2014.10.15 627 0
97 고급강의실 RPG Maker VX ACE - Enemy 데이터 구조. 1 JunkMan 2014.10.15 687 0
96 고급강의실 RPG Maker VX ACE - Armor 데이터 구조. JunkMan 2014.10.15 557 0
95 고급강의실 RPG Maker VX ACE - Weapon 데이터 구조. JunkMan 2014.10.15 848 0
94 고급강의실 RPG Maker VX ACE - Item 데이터 구조. JunkMan 2014.10.14 835 0
93 고급강의실 RPG Maker VX ACE - Skill 데이터 구조. JunkMan 2014.10.14 1156 0
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 Next
/ 10






[개인정보취급방침] | [이용약관] | [제휴문의] | [후원창구] | [인디사이드연혁]

Copyright © 1999 - 2016 INdiSide.com/(주)씨엘쓰리디 All Rights Reserved.
인디사이드 운영자 : 천무(이지선) | kernys(김원배) | 사신지(김병국)