이번 내용은 매우 짧습니다.
저번에 시간 관계상(수정을 귀찮...) 변수에 관한 설명을 못 넣었습니다.
그래서 여기서 설명하려 합니다.
별로 여러울건 못됩니다.
class Window_연금술사 < Window_Base
def initialize
super(0, 0, 160, 96)
self.contents = Bitmap.new(width - 32, height - 32)
refresh
end
def refresh
@total_sec = Graphics.frame_count / Graphics.frame_rate
frame_연금술사 = @total_sec % 100
text_연금술사 = sprintf("%02d", frame_연금술사)
self.contents.clear
self.contents.font.color = normal_color
self.contents.draw_text(4, 0, 128, 32, "연금술사", 0)
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
저번 시간에 배운 것을 활용하여 만든 윈도우 입니다.
"연금술사"라는 텍스트와 함께 100까지 카운트 되고 초기화 되는
시계가 표시될 것입니다.
저번시간에, 변수는 C언어와 같은 방식으로 표시할수 있다고 했습니다.
가능 합니다. printf = ("%d", a); 가 C언어의 방식이죠.
이렇게만 하면 거의 모든 변수를 응용할수 있습니다.
그런데....
언어의 변수가 아닌, 게임에서의 변수(=variables)는 어떨까요...?
R2K 시리즈에선 스크립트가 없기 때문에, "변수"라고 하면 이벤트에서
설정되는 variables를 말합니다. 이런것들은 자체가 수치 이기 때문에
스트링으로 받아드릴수 없고, 에러를 뱉어 버립니다.
그런데.....
어째서 문장에서 v[x]라고 치면 x번의 변수가 스트링으로 나올까요?
Window_Message에 해답이 있습니다.
바로 to_s와 to_i.
연구는 해봤지만 두개의 특징에 대해선 명확하게 못 말하겠군요.
일단 to_s는 로컬 변수 등을 스트링화 시킬수 있습니다. 오브젝트.to_s 와 같은
형식으로 말입니다.
말인 즉슨, 1번 변수를 스트링화 시킨다면 이렇게 되겠죠.
$game_variables[1].to_s
이렇게 써 있다면 더 이상 변수로써의 기능(=수치)을 잃게 됩니다.
대신에 스트링으로써 기능을 가지게 되죠. 이러한 것들을
스트링이 위치한 곳에 넣어주시면, 이 변수의 값이 글자로 나옵니다.
스트링화 시켰다는 것은, 대상 자체가 글자가 된다라는 것이기 때문에,
숫자로 받아들일수 없는 것입니다.
그럼 to_i를 살펴봅시다.
Window_Message를 먼저 살펴봐야 겠죠.
text.gsub!(/\[Vv][([0-9]+)]/) { $game_variables[$1.to_i] }
보나마나 아니겠지만, 제 판단으로는 입력된 수치를 받아드릴수 있게
도와주는 것이나, 또는 받아들인후 그 자리에서 스트링화 시킨다,
또는 해시( {}와 같은 형태)에서 불러 들일때, $1에게만 의존 되어 불러
지는 것이다 라고 판정됩니다.
정확한것은 모릅니다. 그래서 전 to_s만 사용합니다.
혹시 to_i에 대해서 아시는 분은 댓글로.......
이렇게 만들어서 변수를 적용 시켜봅시다.
그런데 정작 나오는 수는 바꿔도 안 바꿔집니다.
왜 그럴까요? 저번 시간에 배운적 있을것입니다.
바로...
update
단순한 update로는 안됩니다. 자신이 세운 연립방정식을 대입하여,
update 메소드가 호출일때 그때마다 초기화 시켜 재계산, 재 출력의
작업을 해야합니다.
말은 어렵게 들리나, 알고 보면 간단합니다.
class Window_연금술사 < Window_Base
def initialize
super(0, 0, 160, 96)
self.contents = Bitmap.new(width - 32, height - 32)
refresh
end
def refresh
@total_sec = Graphics.frame_count / Graphics.frame_rate
frame_연금술사 = @total_sec % 100
text_연금술사 = sprintf("%02d", frame_연금술사)
self.contents.clear
self.contents.font.color = normal_color
self.contents.draw_text(4, 0, 128, 32, $game_variables[1].to_s, 0)
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
이렇게 만들어 봅시다. 그렇다면 윈도우에 1번 변수와 시간이 표기될 것입니다.
여기서 def update를 주목 합시다.
def update
super
if Graphics.frame_count / Graphics.frame_rate != @total_sec
refresh
end
end
저번 시간에 설명 했죠. 이것은 그래픽을 초기화->재구성을 시킬때 필요한 것입니다.
자세한 설명은 이전 강좌에....
여하튼, 여기에 뭔가를 추가해야 합니다.
그전에 변수를 하나 더 만들어 봅시다. (언어로써의 변수)
@variables_연금술사 = $game_variables[1]
라고 refresh 부분에 추가해 봅시다.
그런후....
update 부분에 이렇게 추가해 봅시다. (super 아래에)
if @variables_연금술사 != $game_variables[1]
refresh
end
이렇게 추가한 이유는 뭘까요?
자세한 설명은 저번 강의에서 했으나, 간단하게 설명하겠습니다.
refresh에서 한번 대입을 했습니다. 그런데 그 후에 1번 변수가 바꿔졌다면,
바꿔지기 전의 수를 가지고 있을 것입니다. 그래서, 그것이 다를경우,
refresh를 재소환 해서 초기화, 재구성화 시킨것입니다.
결과적으로, update만 해 놓으면 자동으로 초기와->재구성이 되죠.
강의는 여기서 끝나야 마땅하다만, 몇마디만 더 하겠습니다.
변수를 update에서 자동으로 할수 있게 하는 방법은, 솔직히
조금 불편합니다. 한번 바꿀때 여기저기 만져야 하니까요.
그래서 저는 윈도우를 씬이 변경 되거나 커맨드가 들어왔을때마다
새로 만드는 방법을 사용합니다. 그러면 윈도우 내에선
하나만 바꿔도 자동으로 처리가 됩니다.
이것에 대한 자세한 설명은 5탄에서 기대해 주세요.
※프레임을 위와같은 방법으로 하지 않는 이유는, 프레임 표기는
윈도우를 보는 동안에도 바뀌기 때문입니다.
저번에 시간 관계상(수정을 귀찮...) 변수에 관한 설명을 못 넣었습니다.
그래서 여기서 설명하려 합니다.
별로 여러울건 못됩니다.
class Window_연금술사 < Window_Base
def initialize
super(0, 0, 160, 96)
self.contents = Bitmap.new(width - 32, height - 32)
refresh
end
def refresh
@total_sec = Graphics.frame_count / Graphics.frame_rate
frame_연금술사 = @total_sec % 100
text_연금술사 = sprintf("%02d", frame_연금술사)
self.contents.clear
self.contents.font.color = normal_color
self.contents.draw_text(4, 0, 128, 32, "연금술사", 0)
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
저번 시간에 배운 것을 활용하여 만든 윈도우 입니다.
"연금술사"라는 텍스트와 함께 100까지 카운트 되고 초기화 되는
시계가 표시될 것입니다.
저번시간에, 변수는 C언어와 같은 방식으로 표시할수 있다고 했습니다.
가능 합니다. printf = ("%d", a); 가 C언어의 방식이죠.
이렇게만 하면 거의 모든 변수를 응용할수 있습니다.
그런데....
언어의 변수가 아닌, 게임에서의 변수(=variables)는 어떨까요...?
R2K 시리즈에선 스크립트가 없기 때문에, "변수"라고 하면 이벤트에서
설정되는 variables를 말합니다. 이런것들은 자체가 수치 이기 때문에
스트링으로 받아드릴수 없고, 에러를 뱉어 버립니다.
그런데.....
어째서 문장에서 v[x]라고 치면 x번의 변수가 스트링으로 나올까요?
Window_Message에 해답이 있습니다.
바로 to_s와 to_i.
연구는 해봤지만 두개의 특징에 대해선 명확하게 못 말하겠군요.
일단 to_s는 로컬 변수 등을 스트링화 시킬수 있습니다. 오브젝트.to_s 와 같은
형식으로 말입니다.
말인 즉슨, 1번 변수를 스트링화 시킨다면 이렇게 되겠죠.
$game_variables[1].to_s
이렇게 써 있다면 더 이상 변수로써의 기능(=수치)을 잃게 됩니다.
대신에 스트링으로써 기능을 가지게 되죠. 이러한 것들을
스트링이 위치한 곳에 넣어주시면, 이 변수의 값이 글자로 나옵니다.
스트링화 시켰다는 것은, 대상 자체가 글자가 된다라는 것이기 때문에,
숫자로 받아들일수 없는 것입니다.
그럼 to_i를 살펴봅시다.
Window_Message를 먼저 살펴봐야 겠죠.
text.gsub!(/\[Vv][([0-9]+)]/) { $game_variables[$1.to_i] }
보나마나 아니겠지만, 제 판단으로는 입력된 수치를 받아드릴수 있게
도와주는 것이나, 또는 받아들인후 그 자리에서 스트링화 시킨다,
또는 해시( {}와 같은 형태)에서 불러 들일때, $1에게만 의존 되어 불러
지는 것이다 라고 판정됩니다.
정확한것은 모릅니다. 그래서 전 to_s만 사용합니다.
혹시 to_i에 대해서 아시는 분은 댓글로.......
이렇게 만들어서 변수를 적용 시켜봅시다.
그런데 정작 나오는 수는 바꿔도 안 바꿔집니다.
왜 그럴까요? 저번 시간에 배운적 있을것입니다.
바로...
update
단순한 update로는 안됩니다. 자신이 세운 연립방정식을 대입하여,
update 메소드가 호출일때 그때마다 초기화 시켜 재계산, 재 출력의
작업을 해야합니다.
말은 어렵게 들리나, 알고 보면 간단합니다.
class Window_연금술사 < Window_Base
def initialize
super(0, 0, 160, 96)
self.contents = Bitmap.new(width - 32, height - 32)
refresh
end
def refresh
@total_sec = Graphics.frame_count / Graphics.frame_rate
frame_연금술사 = @total_sec % 100
text_연금술사 = sprintf("%02d", frame_연금술사)
self.contents.clear
self.contents.font.color = normal_color
self.contents.draw_text(4, 0, 128, 32, $game_variables[1].to_s, 0)
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
이렇게 만들어 봅시다. 그렇다면 윈도우에 1번 변수와 시간이 표기될 것입니다.
여기서 def update를 주목 합시다.
def update
super
if Graphics.frame_count / Graphics.frame_rate != @total_sec
refresh
end
end
저번 시간에 설명 했죠. 이것은 그래픽을 초기화->재구성을 시킬때 필요한 것입니다.
자세한 설명은 이전 강좌에....
여하튼, 여기에 뭔가를 추가해야 합니다.
그전에 변수를 하나 더 만들어 봅시다. (언어로써의 변수)
@variables_연금술사 = $game_variables[1]
라고 refresh 부분에 추가해 봅시다.
그런후....
update 부분에 이렇게 추가해 봅시다. (super 아래에)
if @variables_연금술사 != $game_variables[1]
refresh
end
이렇게 추가한 이유는 뭘까요?
자세한 설명은 저번 강의에서 했으나, 간단하게 설명하겠습니다.
refresh에서 한번 대입을 했습니다. 그런데 그 후에 1번 변수가 바꿔졌다면,
바꿔지기 전의 수를 가지고 있을 것입니다. 그래서, 그것이 다를경우,
refresh를 재소환 해서 초기화, 재구성화 시킨것입니다.
결과적으로, update만 해 놓으면 자동으로 초기와->재구성이 되죠.
강의는 여기서 끝나야 마땅하다만, 몇마디만 더 하겠습니다.
변수를 update에서 자동으로 할수 있게 하는 방법은, 솔직히
조금 불편합니다. 한번 바꿀때 여기저기 만져야 하니까요.
그래서 저는 윈도우를 씬이 변경 되거나 커맨드가 들어왔을때마다
새로 만드는 방법을 사용합니다. 그러면 윈도우 내에선
하나만 바꿔도 자동으로 처리가 됩니다.
이것에 대한 자세한 설명은 5탄에서 기대해 주세요.
※프레임을 위와같은 방법으로 하지 않는 이유는, 프레임 표기는
윈도우를 보는 동안에도 바뀌기 때문입니다.