조회 수 528 추천 수 5 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 수정 삭제
class Window_연금술사 < Window_Base
  def initialize
    super(0, 0, 128, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    refresh
  end
  def refresh
    self.contents.clear
    self.contents.font.color = normal_color
    self.contents.draw_text(4, 0, 128, 32, "연금술사", 0)
  end
end


제가 신속하게 만들어본 윈도우 입니다.
적용 한다면 아마도 딱 "연금술사" 네 글자만 나오는 윈도우가 완성 될것입니다.

1, 2탄을 전부 읽으셨다면 여기까지 모두다 파악하셨을 겁니다.
그러면 보통 텍스트(즉, 스트링)외에 기이하고 이상한 것들을 살펴 봅시다.


먼저, PlayTime 윈도우!


class Window_PlayTime < Window_Base
  def initialize
    super(0, 0, 160, 96)
    self.contents = Bitmap.new(width - 32, height - 32)
    refresh
  end
  def refresh
    self.contents.clear
    self.contents.font.color = system_color
    self.contents.draw_text(4, 0, 120, 32, "플레이 시간")
    @total_sec = Graphics.frame_count / Graphics.frame_rate
    hour = @total_sec / 60 / 60
    min = @total_sec / 60 % 60
    sec = @total_sec % 60
    text = sprintf("%02d:%02d:%02d", hour, min, sec)
    self.contents.font.color = normal_color
    self.contents.draw_text(4, 32, 120, 32, text, 2)
  end
  def update
    super
    if Graphics.frame_count / Graphics.frame_rate != @total_sec
      refresh
    end
  end
end

여기는 뭐가 많죠. 상당히 많습니다.
일단 refresh 메소드 위 부분 까지는 전부 아시리라 믿습니다.
그러면 refresh 안이 문제 인데요.....
여기를 한번 뜯어 봅시다.

  def refresh
    self.contents.clear
    self.contents.font.color = system_color
    self.contents.draw_text(4, 0, 120, 32, "플레이 시간")
    @total_sec = Graphics.frame_count / Graphics.frame_rate
    hour = @total_sec / 60 / 60
    min = @total_sec / 60 % 60
    sec = @total_sec % 60
    text = sprintf("%02d:%02d:%02d", hour, min, sec)
    self.contents.font.color = normal_color
    self.contents.draw_text(4, 32, 120, 32, text, 2)
  end

def 와 end는 생략한다 치고, 내용 안에서 3번째 줄 까지는 전부 아시죠?
여기까지 했다면 "플레이 시간"이라는 텍스트가 있는 윈도우가 보일것입니다.
여기까지는 아무 문제 없죠.

그런데...

@total_sec = Graphics.frame_count / Graphics.frame_rate
hour = @total_sec / 60 / 60
min = @total_sec / 60 % 60
sec = @total_sec % 60
text = sprintf("%02d:%02d:%02d", hour, min, sec)

이게 다 뭘까요. 그렇습니다. 우리가 프로그래밍 언어에서 흔히 말하는 「변수」입니다.
첫번째 부터 쭉 살펴 볼까요.

@total_sec = Graphics.frame_count / Graphics.frame_rate

일단 앞에 붙은 @ 이라는 것은 글로벌 변수라고 불리우는 것입니다.
이것에 대해 자세한 설명은 엑사포(rpgxp.co.kr)에 있으니 참조 하시길.....
그리고 정의역에 보시면 Graphics.frame_count 이란것이 있습니다.
이것은, 역시 Ruby 에서 몇 안되는 희귀종(?)입니다. 처음 게임을 시작할때
부터(main에서 처리가 시작할때 부터), 그 당시의 시간의 총 프레임을
세는 역할을 담당하는 것입니다.

----정리----
예를 들어, 10초 동안 플레이를 했다면 Graphics.frame_count이 100이 되는 겁니다.
1 프레임이 0.1초인것은 아시죠?

그리고, 뒤에 붙은 Graphics.frame_rate
영어를 아신다면 대충 감이 올것입니다. 설명해 드리자면, 1초에 몇 프레임인가의 비율
입니다. 다 아시죠? 10프레임 : 1초, 즉, 10:1 입니다. 하지만 rate은 10이라는
숫자를 받아드리기 때문에, / Graphics.frame_rate 가 있으면 10으로 나눈다가
되는 겁니다.

요컨데, 「이때까지 플레이한 시간(단위 : 초)」가 되는 겁니다.

그리고 그 아래를 살펴 보도록 하죠.

hour = @total_sec / 60 / 60
min = @total_sec / 60 % 60
sec = @total_sec % 60
text = sprintf("%02d:%02d:%02d", hour, min, sec)

hour, min, sec, text

이것들은 그냥 우리가 설정해 놓은 변수 입니다. 정의도 여기서 되며, 제작도 여기서 되는
그냥 「변수」입니다.

@total_sec % 60

이것은 sec의 정의인데, 이것부터 살펴 보는 이유는, sec(초)가 가장 작은 단위이기 때문입니다.

% 60

프로그래밍 언어에서는 %를 100분율이라고 보지 않고, 「x로 나눈후의 나머지」로 봅니다.
즉, 「이때까지 플레이 한 시간(단위 : 초) / 60 -> 나머지」가 되는 겁니다.
그래서 어떤 수가 나오든 0~59까지밖에 안나오는 겁니다.

min, hour도 마찬 가지지만, min 은 sec의 60배(거꾸로, 나누기 60)이며, hour는
sec의 3600배(거꾸로, 나누기 3600)이기 때문에 /60 이 몇개 붙는 것입니다.


왜 이런것들 까지 설명해야 할 필요가 있냐구요?
프레임은 시시 때때로 변합니다. 그것을 스트링으로 받아 들여서 텍스트를 표시하는것,
즉, 일반 텍스트 외에 텍스트에 속하기 때문입니다.

뭐, 윈도우 강의 중에 텍스트만 너무 치우치지 않냐 라는 것은 사실이지만, 일단은 설명하고 보겠습니다.
왜냐하면 이러한 텍스트를 사용 하는 윈도우가 우리 눈에 떡하니 있기 때문입니다.

Window_PlayTime

본문으로 돌아가서, 이제 text 변수를 설명할 때이군요.
이 변수도 물론 여기서 생성, 정의 된 변수 입니다. 다른곳에서는 못사용 합니다.

text = sprintf("%02d:%02d:%02d", hour, min, sec)

sprintf
어라? 어디서 많이 봤는데. 그렇습니다. C 언어에서 나오는 printf 와 유사 하죠.
사실 99% 맞습니다. text 라는 변수를 괄호 안에 있는 스트링이 표시되는
변수로 정의 한다는 뜻이죠.
요컨데, 텍스트 만들기 라는 것입니다.
그럼 괄호 안에 있는 내용을 살펴볼까요.

("%02d:%02d:%02d", hour, min, sec)

%02d? 이것 역시 C 언어에서 나오는 %d(정수 변수 입력)와 유사합니다.
연구를 통해서 알아본 결과, 스트링이 아닌 것(즉, 변수)을 스트링화 시킬때는
2가지를 사용합니다.
1. sprintf 와 %02d 를 사용한다.
2. 오브젝트에 .to_s 를 붙여 스트링화 시킨다.
그중, 이 방법은 1번이죠. %02d 사이에 있는 콜론(:)은 그냥 텍스트 입니다.
시간을 나타낼때 콜론을 사용하니까요.
따옴표가 끝나고 변수들이 있는 것은, C언어를 하셨다면 아실겁니다.


그럼 이렇게 설정해 놓은 텍스트들을 표시 해야 겠죠?
2탄에서 설명 했던 self.contents.draw_text 를 사용해서 표시해 봅시다.
그러면 일단 표시는 됩니다.


그런데 아래에 update 라는 메소드가 왔군요.

  def update
    super
    if Graphics.frame_count / Graphics.frame_rate != @total_sec
      refresh
    end
  end

def는 메소드를 설정하는 것입니다. update 라는 메소드를 만들었습니다.
그리고 super가 나왔습니다. 이건 슈퍼 클래스에서 받아 들인다는 뜻인데(아니라면
지적해 주시기 바랍니다. 추측해서 쓴것입니다.), 자세한 것은 엑사포에서......
그리고 이 부분이 중요합니다.

if Graphics.frame_count / Graphics.frame_rate != @total_sec

Graphics.frame_count / Graphics.frame_rate <- 이것에 관한 설명은 필요 없겠죠.
이건 좀 복잡한데, 일단은 설명 해 드리겠습니다.

if 는 조건 분기 입니다. 그렇다면 ~가 ~라면 이 되겠죠. 그 옆에 있는것은
위에서 설명한 총 플레이 시간(단위 : 초)입니다. 그리고 != 라는 것은
~가 아닐때 라는 뜻입니다. 그 옆에, @total_sec 라는 것이 있죠.

@total_sec는 방금 지나간 초를 받아 들여서 refresh 메소드를 짰습니다.
(물론 이 변수가 짠건 아닙니다. 말이 그렇다는 겁니다.)하지만 이녀석은
게을러서 한번 하고 맙니다. 그렇다면, 플레이 시간 자체는 증가 하나,
이녀석이 그걸 받아 들이지 않는 다면(즉, 과거를 받아 들였다면), 이
윈도우에 있는 텍스트는 변화를 주지 않습니다.
그래서 이 윈도우를 사용 하는 부분의 update 메소드에서 오브젝트.update를
통하여(즉, 이 메소드를 불러 온다)@total_sec에게 자신의 일을 상기시켜
주는 것입니다. 프레임의 차이는 매 초마다 이루워 지기 때문에, 그때마다
refresh를 불러 일으켜(거기에 써 있죠), update가 붙은 오브젝트는
매 초마다 변화를 주도록 짜여져 있는 것입니다.

스프라이트의 이동, 물체 이동등을 연구하실 분은 위 복잡한 설명을 수십번이라도
읽기를 추천합니다. 매우 중요한 파트거든요.

요컨데, 오브젝트.update 를 해 주기만 하면, 변화하는 텍스트가 완료되는 것입니다.




짧았는지 길었는지는 쓰다보면 못 느끼는 거라서 여기서 끝내겠습니다.

다음 4~5 탄도 기대해 주세요~




위에 대한 간략 설명
: x와 y가 있는데, x=y라고 했다. 여기서 x가 변할때, y는 바로 적용 되지 않기 때문에
오차가 생긴다. 여기서 오차가 생길때를 조건으로, 다시 맞춰주는 명령을 짜 준다.

이것은 나중에 스프라이트에 대해서 연구를 해서 자세하게 설명하겠습니다.
?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
804 언어/기타 사회 경험치 『연금술사』 2005.12.26 520
803 RPG Maker Trpg에 대하여 조금 자세히 분석하자!! 블레이드 마스터 2006.04.09 522
802 언어/기타 삭제 게이지의달인 2007.06.02 525
801 언어/기타 플레이어와 접촉시 투명해지는 이미지 file 린쌍 2005.11.17 526
800 언어/기타 이런 건 어떨려나...(진짜 조그만한 팁) Mr.kim 2006.03.26 526
799 언어/기타 [TIP]변수를 이용해 난수를 써보자 CC(虎) 2005.09.22 526
798 RPG Maker 예를 들어서.. 태풍™ 2005.09.25 528
» RPG Maker [RXP]윈도우 만들기 3탄-특이한 텍스트들(프레임편) 『연금술사』 2006.03.11 528
796 언어/기타 미디를 하려면.. dnajs 2006.09.11 529
795 언어/기타 2. Direct로 그림그리기! file 케이코냥이 2006.09.10 530
794 언어/기타 포토샵 완전 정복 !! - 1 - (채도감소) file 다크세이버™ 2006.12.20 532
793 RPG Maker 커맨드 - '변수의 조작' 익히기 Ark。 2006.05.09 533
792 언어/기타 삭제 게이지의달인 2007.06.14 534
791 언어/기타 게임 스토리가 생각이 안날떼....... 마왕강림 2006.01.30 534
790 RPG Maker 기존의 마법 속성에서 벗어나자 미카엘net 2006.04.03 534
789 언어/기타 자연스러운 커다란 맵에 스크린샷 나른한지지 2006.01.12 535
788 언어/기타 마법 쓸때 사용하는 촉매 옵져버☆ 2006.02.03 536
787 RPG Maker 오프라인을 활용하자. 홀리커터™ 2006.06.24 536
786 RPG Maker 픽쳐대전의 불가능 설명(X파일대 수석박사 사토루 교수님 특별초대) 사토루 2006.01.30 537
785 언어/기타 사람들은 다양한 기술과 재미를 원한다! 다크세이버™ 2006.05.19 538
Board Pagination Prev 1 ... 6 7 8 9 10 11 12 13 14 15 ... 51 Next
/ 51






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

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