-----------------------------------------------------------
어차피 글씨를 쓰는 곳이니 세로 크기는 작게 20으로 잡았습니다.
@sprite.z는 스프라이트의 우선순위를 말합니다.
('이벤트 - 그림의 표시 - 번호' 와 같은 역할)
또 다른 모든 것들보다 위에 떠야 하기 때문에 999999로 잡았습니다.
opacity는 불투명도를 말합니다.
0 ~ 255까지 설정이 가능한데, 수치가 작아질수록 투명해집니다.
다음 @text에는 플래싱 메시지에 들어갈 글자를 저장합니다.
@wait_count와 @fade_in/out은 페이드 인/아웃을 위한 변수들입니다.
다음으로 change_color 메소드를 만들어봅시다.
-----------------------------------------------------------
def change_color(new_color)
@sprite.bitmap.font.color = new_color
end
-----------------------------------------------------------
Bitmap 클래스에는 폰트 이름과 사이즈, 색상에 관한 함수도 있습니다.
bitmap.font.name = "폰트이름"
bitmap.font.size = 크기
bitmap.font.color = Color.new(R,G,B)
여기서 RGB는 Red,Green,Blue의 약자입니다.
각각의 색이 얼마나 들어가느냐에 따라 전체 색이 달라지죠!
또 Color.new(R,G,B,불투명도) 로 사용할 수도 있습니다.
불투명도는 위에서 말한 opacity입니다.
그리고 가장 중요한 refresh 메소드입니다.
-----------------------------------------------------------
def refresh
@sprite.bitmap.clear
@sprite.bitmap.fill_rect(Rect.new(0,0,640,20), Color.new(0, 0, 0, 100))
@sprite.bitmap.draw_text(1, 3, 640, 12, @text, 1)
@sprite.bitmap.draw_text(1, 4, 640, 12, @text, 1)
@sprite.bitmap.draw_text(1, 5, 640, 12, @text, 1)
@sprite.bitmap.draw_text(-1, 3, 640, 12, @text, 1)
@sprite.bitmap.draw_text(-1, 4, 640, 12, @text, 1)
@sprite.bitmap.draw_text(-1, 5, 640, 12, @text, 1)
@sprite.bitmap.draw_text(0, 3, 640, 12, @text, 1)
@sprite.bitmap.draw_text(0, 5, 640, 12, @text, 1)
@sprite.bitmap.font.color = Color.new(255, 255, 255)
@sprite.bitmap.draw_text(0, 4, 640, 12, @text, 1)
@sprite.visible = true
@fade_in = true
end
-----------------------------------------------------------
일단 bitmap을 클리어합니다. 이전에 쓰여진 글자가 있을 수도 있으니까요.
다음 fill_rect 함수는 처음 스크린샷의 뒷배경입니다.
비트맵을 기준으로 rect 값을 정하고, 그만큼을 지정된 색상으로 채우는 겁니다.
다음은 draw_text 메소드입니다.
draw_text(x좌표, y좌표, 가로, 세로, 텍스트, 정렬방식) 입니다.
정렬방식은 적지 않아도 무방합니다.
기본은 좌측 정렬이며, 1을 입력하면 중앙 정렬, 2를 입력하면 우측 정렬이 됩니다.
(글자도 그림 취급을 하기 때문에 그릴 공간을 입력해야 하죠.)
draw_text가 왜이리 많이 쓰였냐, 물어보신다면 대답해 드리는게 인지상정!
바로 테두리 효과를 위해서입니다.
테두리는 지정한 색으로, 중앙은 흰색으로 출력합니다. 그러면 한층 깔끔하게 나오겠죠?
다음으로 @sprite.visible은 스프라이트가 보여지는지 여부를 설정합니다.
그리고 @fade_in 변수를 참으로 바꾸어 페이드 인 시작을 알립니다.
그 뒤, 업데이트 부분에서는!
-----------------------------------------------------------
def update
if @fade_in
if @sprite.opacity < 255
@sprite.opacity += 10
return
elsif @wait_count > 0
@wait_count -= 1
return
else
@fade_out = true
@fade_in = false
end
end
if @fade_out
if @sprite.opacity > 0
@sprite.opacity -= 10
return
else
@wait_count = 40
@fade_out = false
@fade_in = false
@text = ""
@sprite.visible = false
end
end
end
-----------------------------------------------------------
저는 돌아가는 원리만 설명합니다.
일단 fade_in이 참일 경우, opacity를 검사합니다.
opacity가 255보다 작으면(약간이라도 투명하면) 불투명하게 만듭니다.
그리고 처리를 중단(return) 합니다.
이런 식으로 계속 불투명하게 만들면 결국에는 불투명해지겠죠?
그럼 이제 wait_count를 검사합니다.
왜 검사하냐! 바로 불투명한 상태로 조금은 남아있어야 하기 때문입니다.
1프레임에 1씩 빼는 것이고 wait_count가 40이니 1초동안 불투명한 상태로 보여집니다.
자, wait_count까지 0이 되면 어떻게 할까요?
fade_in은 false로 바꾸고 fade_out을 true로 바꿉니다.
그럼 페이드 아웃이 시작되죠.
다시 opacity를 검사해서, 0보다 크면 (완전히 투명하지 않으면) 투명하게 만듭니다.
그리고 완전히 투명해지면 (opacity <= 0) wait_count를 다시 40으로 바꾸고,
fade_out과 fade_in을 거짓으로 만든 뒤, text를 비우고 visible을 false로 합니다.
이제 텍스트도 없고, 페이드 인/아웃 효과도 없고, 보이지도 않습니다.
다시 refresh를 해야 보이겠죠.
자, 그럼 이제 이걸 사용하는 함수를 만들어 봅시다.
FlashMessage 클래스 내에 선언하지 마세요!
-----------------------------------------------------------
def 메시지(msg, new_color = Color.new(0, 0, 0))
$flash_message.text(msg)
$flash_message.change_color(new_color)
$flash_message.refresh
end
-----------------------------------------------------------
이제 힘들여 만든 FlashMessage 스크립트를 선언해야겠죠?
Main 섹션의 begin 아래에 $flash_message = FlashMessage.new 를 넣어주시고
Scene_Map 섹션의 def update 아래에 $flash_message.update 를 넣어주세요.
사용법은 이벤트 - 스크립트에
메시지("할말", Color.new(R,G,B)) 입니다.
R,G,B는 숫자인거 아시죠?
추가로 색상코드 대강 알려드리자면~
검정색 : Color.new(0, 0, 0)