메뉴 건너뛰기

창조도시 기록보관소

RPGXP [비밀소년] ◆공부용◆ 01 - 숫자게이지바

2006.05.24 09:51

천무 조회 수:683 추천:2

[다운로드]


 


제가 [직접공부용] 이란걸 붙여서 올리는 강의는 복사붙이기 식으로,
내용도 모르고서 집어넣는용도로 쓰이는게 아닙니다.
간순하지만 간단하고 명쾌하게 코딩해놓은 것으로,
한줄한줄을 봐가며 이해해서 직접 만들 수 있을정도로 자신의 실력을
향상시키기 위한 용도로 쓴 강의입니다.

꼭 이 강의들이 완벽하단 보장은 없습니다.
하지만 최소한 자신의 실력을 향상시킨다는 목적은 달성하실 수 있을겁니다.

우선 첨부자료에서 예제를 다운받으시구요,


사용자가 해야할 일은 두가지,
Gauge.show - 게이지를 표시
Gauge.hide - 게이지를 감춤
소스의 애러 - 파티맴버가 아무도 없으면 100% 애러납니다.
※그부분은 체크하지 않았는데 나중에 실력이 쌓이면 자신이 직접 애러나지 않도록 수정해보시기 바랍니다. 딱 세줄만 추가하면 그 애러는 고쳐집니다.



예제의 소스는 이렇습니다.



#==============================================================================
# ■ My_Wnd_Guage
#------------------------------------------------------------------------------
#  간단한 숫자 게이지바
#                                                coded by Bimilist
#==============================================================================
class Gauge < Window_Base
  def initialize
    super(0, 0, 176, 64) <-- 게이지의 위치
    self.contents = Bitmap.new(width - 32, height - 32)
  end
  def refresh
    self.opacity = 160 <-- 투명도
    self.contents.clear
    draw_actor_hp($game_party.actors[0], 0, 0)
  end
  def self.show
    if $my_wnd_gauge == nil or $my_wnd_gauge.disposed?
      $my_wnd_gauge = Gauge.new
    end
    $my_wnd_gauge.refresh
  end
  def self.hide
    if not ($my_wnd_gauge == nil or $my_wnd_gauge.disposed?)
      $my_wnd_gauge.opacity = 0
    end
  end
end



그럼 한줄한줄 살펴볼까요?

class Gauge < Window_Base

일단 이건 아직 배울 단계는 아닐겁니다.
그냥 감으로익혀서 사용할 단계지요,
하지만 설명을 하자면,

class Gauge

Gauge라는 이름을 지닌 클래스를 선언하구요,

class Gauge < Window_Base

그것이 Window_Base의 것을 모두 물려받는다는 뜻입니다.
프로그래밍 용어로 오버라이드라고 하는데요, 그것은 상속받다란 뜻이죠.
이렇게 하시면 Window_Base가 지닌 모든 함수들과 변수들을 물려받습니다.


  def initialize
    super(0, 0, 176, 64) <-- 게이지의 위치
    self.contents = Bitmap.new(width - 32, height - 32)
  end


def initialize
함수의 선언입니다.

super(0, 0, 176, 64)

자신의 어머니 클래스(슈퍼클래스)의 같은 이름의 함수를 호출합니다.
좀 더 쉽게 말하자면,

class Window_Base <-- class Gauge의 super class
안에 있는 def initialize를 호출한다는 뜻입니다.

각 함수는 인자를 지니고 있는데,
class Window_Base의   def initialize의 인자는 이렇죠.
def initialize(x, y, width, height)
∴그래서,
super(0, 0, 176, 64) <-- 게이지의 위치
이렇게 super을 호출할때 (x, y, width, height)
이것을 집어넣는겁니다.

1대1 대응시키면 이렇죠.
initialize(x, y, width, height)
            \ \  \     /
        super(0, 0, 176, 64)


self.contents = Bitmap.new(width - 32, height - 32)
여기서 self. 은 자기 자신의 무언가를 뜻합니다.
더 자세한건 나중에 저절로 익히실테니 지금은 그냥 그렇구나 하세요.

Bitmap.new(width - 32, height - 32)
이건 비트맵을 작성하는건데요,
요약하자면 그림변수를 만드는거죠.
그 그림변수의 사이즈를 지정하는데,
width - 32, height - 32
자신의 넓이 에서 32픽셀이 짧은 넓이
자신의 높이 에서 32픽셀이 짧은 높이
의 사이즈를 지정한거죠.




  def refresh
    self.opacity = 160 <-- 투명도
    self.contents.clear
    draw_actor_hp($game_party.actors[0], 0, 0)
  end





def refresh
역시 함수이름..


self.opacity = 160 <-- 투명도
이것은 사실 슈퍼클래스에서 상속받은 자신의 변수에 수치만 바꿔주는거지만,
이렇게 하면 슈퍼클래스가 알아서 투명도에 맞춰 그림을 그립니다.




self.contents.clear
이것은 아까 만든 그림변수있죠?
self.contents = Bitmap.new(width - 32, height - 32)
이렇게 만든 그림변수.
이걸 싸그리 지우는 명령입니다.

원래 그림을 그릴땐 흰 도화지에 그려야되죠.
그런데 이미 그 위에 뭔가가 그려져 있으면,
두개의 그림이 겹쳐져버려요.
예를들어 6 을 그리려고 하는데 이미 9 가 그려져 있다면 겹쳐져서 8 이 되버리는거죠. 그것도 이상하게 생긴..

draw_actor_hp($game_party.actors[0], 0, 0)
이건 $game_party.actors[0] 이 변수가 지닌 hp를 알아서 그려주는 함수입니다.
슈퍼클래스에 들어있는건데, 호출만 하는거죠.




  def self.show
    if $my_wnd_gauge == nil or $my_wnd_gauge.disposed?
      $my_wnd_gauge = Gauge.new
    end
    $my_wnd_gauge.refresh
  end


def self.show
이번엔 이상한 함수이름이죠?
self. 이라니...
이런 함수는, 자신의 클래스 이름으로부터 직접 호출되는 함수입니다.
예를들어서,
My_Class 라는 class 가 있다면,
보통은,
$my_class = My_Class.new
$my_class.함수이름
이렇게 호출합니다.
그러나
def self.show
이런식으로 만들어진 함수는,
My_Class.show 이렇게 직접호출됩니다.
대신 잃는게 있죠.
자신이 지니고 있다는 표시의 @ 타입의 변수들을 쓰면 안되요.
왜냐면
$my_class1 = My_Class.new
$my_class2 = My_Class.new
이렇게 두개의 My_Class가 있는데,
My_Class.show 라고 하면 둘중 어떤걸
뜻하는지 알수없잖아요.
그러니 둘중 어느거의 변수를 건들일지도 알 수 없죠.
그래서 사용하면 애러나요.



if $my_wnd_gauge == nil or $my_wnd_gauge.disposed?
if 는  조건분기입니다. 익숙하죠?
$my_wnd_gauge == nil
이건 $my_wnd_gauge 라는 글로벌변수(에 대해선 도움말을 보세요)
에 아무것도 안들어있는지 뭔가 들어있는지 여부를 체크합니다.
$my_wnd_gauge.disposed?
이거는 $my_wnd_gauge 라는 게이지가 해체되었는지 여부를 체크합니다.
or 은 또는이란 뜻으로 둘중 하나만 맞으면 이란 뜻이 되구요,

∴즉, 게이지가 아직 만들어지지 않았거나 해체되었으면 이란 뜻이 됩니다.


$my_wnd_gauge = Gauge.new
게이지를 생성합니다.
이건 그냥 감으로 익히세요.
아 추가로 .new 에 의해 생성을 하면,
그 클래스의 initilize 함수(위에 미리 만들어둔거)
를 자동적으로 호출합니다.

end
조건분기의 끝을 뜻해요.

$my_wnd_gauge.refresh
refresh함수를 호출합니다.

end
함수의 끝을 뜻하구요.



  def self.hide
    if not ($my_wnd_gauge == nil or $my_wnd_gauge.disposed?)
      $my_wnd_gauge.opacity = 0
    end
  end



def self.hide
위에서 배운것과 동일하니 넘어가요.

if not ($my_wnd_gauge == nil or $my_wnd_gauge.disposed?)
($my_wnd_gauge == nil or $my_wnd_gauge.disposed?)
이것도 위에서 한것과 동일.. 그러나
not 이란 뜻은 뭐뭐가 아니라면의 뜻입니다.
결국, 이 조건분기문은 (게이지가 아직 만들어지지 않았거나 해체되었으면) 이 아니면 이란 뜻이 됩니다.

∴즉, 게이지가 만들어졌고 해체되지도 않았으면 이란 뜻입니다.


$my_wnd_gauge.opacity = 0
투명도를 완전투명으로 만들어버려요.
이 함수의 이름은 self.hide
감추다란 뜻입니다.
그러니 투명도를 0으로 만들어서 감추는거죠.



휴.. 끝...

잘 다듬어지지는 않은 첫 강의였습니다.
(그러나 수정했음.. ㅋㅋ)

그러나 설명은 충분히 달아두었으니,
천천히 읽으시면 100% 이해하실꺼라 봅니다

번호 제목 글쓴이 날짜 조회 수
371 레벨에 따라 값을 더 받아보자! [5] 다크세이버™ 2006.06.05 273
370 강력한 무료 에디터 Elitpad 6.5 file 나라 2006.06.04 138
369 제 2 부 ! 나도 게임을 만들수 있다 ! [5] 다크세이버™ 2006.06.01 320
368 [스크립트기초] 제 4과. 그림표시, 배열과 해시의 클래스. [1] 천무 2006.05.24 473
367 [스크립트] 배틀포인트, 배틀샵 [1] 천무 2006.05.24 669
366 [스크립트] 창고 시스템 [9] 천무 2006.05.24 621
365 [스크립트] KGC 몬스터도감 [4] 천무 2006.05.24 795
364 [연금술사] 드디어 완성! 스크립트로 점프&데쉬하기 [5] file 천무 2006.05.24 762
363 [비밀소년] 한글이름입력기 v1.76 [6] file 천무 2006.05.24 2117
» [비밀소년] ◆공부용◆ 01 - 숫자게이지바 [1] file 천무 2006.05.24 683
361 [툴기능] RPG XP로 액알만들기.(스샷) [10] 천무 2006.05.24 1541
360 [스크립트기초] 제 3과. 조건분기와 루프. [2] 천무 2006.05.24 222
359 [스크립트] 파티원 교체. [2] 천무 2006.05.24 424
358 [스크립트] 스탯포인트로 스테이터스 조절하기입니다. 출처:gunmong [6] 천무 2006.05.24 506
357 [스크립트] 이전의 액알게이지바와는 비교도 안될 멋진 초고속 게이지바 - 그라데이션 [7] 천무 2006.05.24 879
356 [스크립트] 대화창에 이름+얼굴 띄우기: 메시지 플러스 가장 최신버전 (2005년 2월1일 버전) [4] 천무 2006.05.24 755
355 [스크립트] 소지수 한계 돌파 [1] 천무 2006.05.24 250
354 [스크립트] 대화창 크기 위치를 내맘대로! 좀더 간단화 시켰습니다.(소형윈도우 네임도 추가) [1] 천무 2006.05.24 444
353 [스크립트] 전투시 몬스터 머리위로 게이지바 만들기 [6] 천무 2006.05.24 835
352 [스크립트] 레벨과 능력치 한계를 자유자재로. 출처: 모모모 [1] 천무 2006.05.24 384