조회 수 733 추천 수 2 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 수정 삭제
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 수정 삭제
좀 많이 늦었네요....
그래도 열심히 한번 써볼렵니다.


일단 기본적으로, 윈도우 클래스의 원천을 살펴봅시다.

bitmap > window > window_base > window_selectable > window_command > window_~~

여기서 이번 탄에서 설명할 것은, 바로 selectable과 command 입니다.
여기서 selectable과 command의 차이를 알아야 겠죠?
쉽게 풀어서 말하면, "selectable은 선택가능한 분기"이고, command
는 "selectable과 같지만, 분기의 수가 정해여 있는 것"이라고
볼수 있습니다. 선택 가능한 것에 제한이 걸렸냐 안걸렸냐가
차이입니다.

예를 들면, Scene_Menu에서의 분기는 command이고,
아이템창 등에서 사용되는 분기(아이템 선택, 아이템에 수에따라 다름)는
selectable 입니다.

그렇다면 한번 만들어 봐야 겠죠?


먼저 selectable

class Window_예제윈도우 < Window_Selectable
attr_reader :max_index
def initialize
@max_index = $game_party.actors.size - 1
a = 32 * (@max_index + 1) + 32
if a >= 480
  a = 480
end
super(4, 0, 160, a)
self.contents = Bitmap.new(width - 32, 4 * 32)
self.back_opacity = 230
refresh
self.active = false
self.index = -1
end
def refresh
self.contents.clear
@item_max = $game_party.actors.size
for i in 0...@item_max
y = 32 * i
actor = $game_party.actors[i]
draw_actor_name(actor, 0, y)
end
end
end


즉석해서 만들어본 윈도우 입니다. 선택형이며, 세로 크기가 480이상이면
더이상 안 올라가고, 현제 발동중인(?) 액터의 수에 따라서 항목이
달라지는 윈도우입니다. 선택이 가능하고, 선택에 따른 변화는 index로
취급합니다.......

...보다 먼저 설명할것입니다....


개인적으로, 저는 샐랙터블 윈도우를 싫어합니다.
항목도 지 마음대로(내가 설정했지만...) 변하는 데다가, 변하는 것에
맞춰서 텍스트를 배치시켜야 되니까요. 그래서 저는 그냥 있는 샐랙터블을
응용시키지, 샐랙터블을 만들지는 않습니다.....
곧 나올(...) 게임인 「자라드」에 샐랙터블 윈도우를 넣었지만, 그대로
역시 싫은건 싫습니다.....

그래도 설명은 해야겠죠.

class Window_예제윈도우 < Window_Selectable
attr_reader :max_index
def initialize
@max_index = $game_party.actors.size
a = 32 * @max_index + 32
if a >= 480
  a = 480
end
super(4, 0, 160, a)
self.contents = Bitmap.new(width - 32, $game_party.actors.size * 32)
refresh
self.active = false
self.index = -1
end

윈도우를 만들어야죠. 하지만 보통 윈도우가 아니기에, 좀더 까다롭습니다.

일단 클래스를 지정하고....
class Window_예제윈도우 < Window_Selectable

인덱스를 취득해야 하는데, 그것의 최대치로 계산을 해야하기에...
attr_reader :max_index

그리고 최대 인덱스(커서 위치분기식)의 정의....
@max_index = $game_party.actors.size
참고로, 이것은 제가 선언한 것이며, 오브젝트의 문장의 줄이 1개씩이고,
대상이 엑터들일 경우만 따질때 사용하는 것입니다.

a = 32 * (@max_index ) + 32
if a >= 480
  a = 480
end
super(4, 0, 160, a)

예를 들어, 엑터의 수가 4라고 칩시다. 그렇다면 max_index는 4가 되고,
*32를 하면 128이 되고, +32를 하면 160이 됩니다.
그래서 결과적으로, 윈도우의 높이는 160이 됩니다.
이것을 하는 이유는 무엇일까요?
문장 1줄이 32이기 때문입니다. 거기다가, 캐릭터 라인과 윈도우 테두리까지의
거리는 16, 위아래 두개있으니까 16*2 = 32해서 +32를 하는 것입니다.
참고로, 문장 줄이 2개라면 *32를 *64같은것으로 바꾸면 됩니다.
하지만 저는 그냥 이대로를 추천합니다....

if a >= 480
  a = 480
end

이것....은 페이지가 있더라도, 윈도우의 높이가 최대치(480)을 넘지
않도록 하기 위한것입니다.

그리고 윈도우를 만들어야죠.
super(4, 0, 160, a)

@max_index의 수에 따라서(여기서는 4) 윈도우의 높이가 달라지는 것입니다.
이 상태로 한다면 높이는 160이 되는 겁니다.

그 다음 부분~

self.contents = Bitmap.new(width - 32, $game_party.actors.size * 32)
refresh
self.active = false
self.index = -1

Bitmap 세팅은 2탄이였던가..? 에서 설명해 놨을것입니다.
다시 한번 설명하겠습니다. Bitmap 세팅은 contents 들의 세팅 범위입니다.
Bitmap 세팅이 되었다면, draw_...시리즈에서 x, y를 0으로 놔도 문제가
없습니다. 여기서는 160(가로) - 32 = 128, 그리고 4(여기서만) * 32 = 128로,
contents들의 세팅범위는 128*128이 되는것입니다. 별로 문제 될것은
없으니, 일단 제쳐 둡시다.

그다음은 self.active = false과 self.index = -1이 나오는 데요, 이것은
refresh의 사용이 끝났을때입니다.....라기 보다는, 있어 봤자
크게 영향을 미칠것은 없습니다. 5탄에서 좀더 자세하게 나올것이니,
좀더 안전하게 하실분은 냅두시고, 대충 하실분은 지우셔도 됩니다.


그다음은 refresh 메소드 입니다. clear 정도는 2탄에서 배웠으니 문제 없겠죠.

@item_max = $game_party.actors.size
for i in 0...@item_max
y = 32 * i
actor = $game_party.actors[i]
draw_actor_name(actor, 0, y)
end

먼저, 가장 중요한 @item_max!! 이것은 반드시 필요합니다. 이것이 없다면
active 여도 항목이 1이며, 선택도 -1로 취급되고, index 설정이 없다면
無와 같이 취급됩니다. 그래서 refresh든 initialize든, 클래스 내에는
반드시 이 변수를 지정해야 합니다. selectable에서 항목수를 정하는
중요한 변수입니다.

@item_max = $game_party.actors.size

일단은 파티의 수로 해 놓아봅시다. 여기선 4라고 해 두었으니, 적용시켜
보면 이름이 있던, 뭐가 있던 항목은 4개가 됩니다.

for i in 0...@item_max
y = 32 * i
actor = $game_party.actors[i]
draw_actor_name(actor, 0, y)

말했었던가요....? 위에서 준비한 스크립트는 파티의 이름을 표시하는
윈도우 입니다. index로 참조를 한다면 응용도 가능합니다.
그래서 여기서 draw_actor_name이 나오는 것입니다.

아무튼, 샐랙터블에서는 for 루프를 사용하는 것이 가장 보편적인
방법입니다. for 루프를 모르신다면 http://www.rpgxp.co.kr에서
참조를 하세요.

여기서는 actor를 0~4(가정의 수) 까지 대입해서 actors를 참조하고
있습니다. 그 상태에서 draw....를 쓴후, actor를 참조시키면
차례대로 대입하면서 바로바로 쓰여지는 것이지요.
그리고 y는 0, 32, 64....식으로 가며, 이것으로 자동으로
텍스트 위치가 설정되죠.

이것!

텍스트 위치!

이게 제가 가장 싫어하는 부분입니다.
텍스트 위치가 자동으로 안된다는 것입니다. 텍스트는 있어도,
항목이 없으면 끝이고, 항목이 있어도 텍스트가 없으면 역시
끝입니다.
열이 1개라면 큰 불편이 없지만, 2개라면 (initialize에서 @column_max로 지정)
더욱 불편합니다. 그래서 제가 커맨드를 더 좋아하는 것입니다.


조금 (많이) 허술했긴 했지만.....이정도가 샐랙터블을 사용한 스크립트의
예제에 대한 설명입니다. 이정도면 대충 감을 잡으면서 만들수는 있을것입니다.

제가 추천하는 방법은, 이것 외에, Window_Item등을 보면서
참조해서 윈도우를 만드는 것입니다. 제가 개인적으로 샐랙터블을 안좋아하는
탓에, 정확히 설명은 못하겠네요.....


그래도 계속 설명 들어갑니다.
제 의견을 한가지 말씀드리자면, 샐랙터블을 마스터 하는 것 보다는,
그냥 Window_Selectable에서 참조해서 쓰시는게 좋다고 봅니다.

일단 기본적인 샐랙터블을 하나 만들어 보겠습니다.



class Window_조낸_많은_선택들 < Window_Selectable
def initialize
@max_index = 99
super(0, 0, 640, 480)
@column_max = 5
refresh
end
def refresh
@item_max = @max_index
end
end

이대로 실행시키면 99가지의 선택이 있는 윈도우가 생성됩니다.
이런걸 한번 만들어 볼까요?

위의 내용은 예제 설명이고, 이것은 활용법 설명입니다.
이 설명은 Window_Selectable 에서 자동으로 참조되게
해 놓은 설명입니다. 그래서 간단하죠.
하지만 텍스트 배치는 알아서....

그럼 순서대로 작성해 봅시다.

1. 클래스
class Window_조낸_많은_선택들 < Window_Selectable

2. 윈도우 제작
def initialize
super(0, 0, 640, 480) #풀 화면 사이즈

3. 열의 생성
@column_max = 5

4. refresh 소환
refresh

5. refresh 설정
def refresh
@item_max = @max_index #또는 미지수.

이것이 기본 선택 윈도우 제작법 입니다.
이정도면 거의 완벽하게 만들수 있습니다.


그리고 텍스트가 있는(당연하지만....) 선택 윈도우.

1. 클래스
class Window_조낸_많은_선택들 < Window_Selectable

2. 윈도우 제작
def initialize
super(0, 0, 640, 480) #풀 화면 사이즈
self.contents = Bitmap.new(width - 32, height - 32)

3. 열의 생성
@column_max = 5

4. refresh 소환
refresh

5. refresh 설정
def refresh
@item_max = @max_index #또는 미지수.
self.contents.clear
self.contents.draw_text....여기서 부터는 알아서....



이번 강좌는 뭔가 빠지고 순서도 어긋나고 필요 있는 설명도
몇개 없고 그렇습니다...괜히 예제만 놓고 설명만 늘어져서 오히려
않좋은 강좌가 됬군요.....
아마도 지금 제 컨디션이 않좋고, 제가 샐랙터블을 싫어해서일것입니다.
하지만 강좌를 쓰다보니 샐랙터블도 그렇게 싫다는 생각은 않드네요.

대충 만드셨다면 그걸로 OK입니다. 디버깅은 의외로 간단하니까요.
6탄도 만들어 볼까나요...? 평소에 많이하는 실수/디버깅법...이랄까나.

이번 4-1과 4-2는 5탄이 없으면 별로 소용이 없을것입니다.
active도 시켜야 하고, index도 맞춰야 하니까요.
하지만 이것은 별로 걱정안해도 됩니다. 5탄에서 제대로 설명할수만
있다면(제가), 아마도 90% 성공 할 것입니다.

그럼 안녕히.....으윽...속쓰려..
?

  1. [VB] SRPG의 이동경로는 어떻게? (1)

    Date2005.12.30 CategoryRPG Maker By성령의분노 Views852
    Read More
  2. [TIP]RXP에서 돈 99999999 한번에 올리기

    Date2005.08.19 CategoryRPG Maker ByCC(虎) Views898
    Read More
  3. [RXP]윈도우 만들기 4탄-스페셜 윈도우(커맨드)

    Date2006.05.05 CategoryRPG Maker By『연금술사』 Views456
    Read More
  4. [RXP]윈도우 만들기 4탄-스페셜 윈도우(샐랙터블 편)

    Date2006.02.17 CategoryRPG Maker By『연금술사』 Views733
    Read More
  5. [RXP]윈도우 만들기 3탄-특이한 텍스트들(프레임편)

    Date2006.03.11 CategoryRPG Maker By『연금술사』 Views528
    Read More
  6. [RXP]윈도우 만들기 3탄-특이한 텍스트들(변수편)

    Date2006.02.03 CategoryRPG Maker By『연금술사』 Views625
    Read More
  7. [RXP]윈도우 만들기 2탄-텍스트 삽입

    Date2006.02.11 CategoryRPG Maker By『연금술사』 Views589
    Read More
  8. [RXP]윈도우 만들기 1탄-윈도우 제작

    Date2005.12.30 CategoryRPG Maker By『연금술사』 Views1111
    Read More
  9. [RPG2K~XP] 좌표를 통한 범위공격

    Date2006.01.14 CategoryRPG Maker ByPolaris君 Views981
    Read More
  10. [rpg2k] 바로가기를 이용해 테스트 플레이 실행하기

    Date2012.01.14 CategoryRPG Maker By베넘 Views1595
    Read More
  11. [RPG2003] 한단계 도약 : 이중 변수번호의 변수

    Date2011.07.31 CategoryRPG Maker ByA. 미스릴 Views2364
    Read More
  12. [rpg2000]페이지의 순서와 이벤트의 출력

    Date2006.02.02 CategoryRPG Maker By[夢想家] Views427
    Read More
  13. [RPG2000/3 팁] 간편한 이벤트 단축키

    Date2015.04.05 CategoryRPG Maker By하앵 Views570
    Read More
  14. [RPG2000/3 팁] 간편한 이벤트 단축키

    Date2015.04.06 CategoryRPG Maker By하앵 Views1666
    Read More
  15. [Rpg2000,2003]주인공의 나이상승하게 하기

    Date2005.09.16 CategoryRPG Maker By사토루 Views692
    Read More
  16. [RPG2000,2003]게이지쉽게 만드는법

    Date2005.08.12 CategoryRPG Maker By사토루 Views1675
    Read More
  17. [RPG XP]스크립트를 이용한 SRPG 이동범위 산출 및 범위 보여주기

    Date2009.01.09 CategoryRPG Maker By신덴 Views4170
    Read More
  18. [RPG XP]간단한.... 그러나 중요한, 그림자 만들기

    Date2005.12.12 CategoryRPG Maker By실키 Views885
    Read More
  19. [RPG XP] CG, 음악 감상 스크립트 [한글화]

    Date2005.11.13 CategoryRPG Maker By책벌레공상가 Views766
    Read More
  20. [RMXP] 펫 소환 강좌

    Date2007.01.07 CategoryRPG Maker By연필군 Views635
    Read More
Board Pagination Prev 1 ... 5 6 7 8 9 10 11 12 13 14 15 Next
/ 15






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

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