메뉴 건너뛰기

창조도시 기록보관소

그림 표시
Graphics 모듈
스프라이트와 비트 맵
프로퍼티

그림 표시

RGSS 의 게임 라이브러리를 사용해 그림을 표시해 보겠습니다.


Graphics 모듈

RGSS 의 게임 라이브러리 중에서 가장 중요한 것은 Graphics 모듈입니다. 그래픽스 모듈이라고 읽습니다.
말그대로 게임내의 그래픽을 전반적으로 처리하기 위한 메소드의 모임으로, 게임 화면에 표시되는 모든 그래픽은 이 모듈의 기능을 사용해 처리되고 있습니다.

모듈이란 같은 분야의 메소드를 모아 놓은 집합이라고 생각하면 됩니다.
클래스와 비슷한 개념입니다만, 모듈의 경우 인스턴스를 생성할 수 없고 그 필요도 없습니다. 인스턴스란 "일시적"이라는 의미로 쓸 수 있으며, 클래스에서는 @을 붙혀서 인스턴스 변수를 생성해서 클래스 안에서만 조작이 가능하게 할 수 있지요. 오브젝트가 파기되면 조작할 수 없는 것이지요.

그러면 우선 다음과 같이 입력해 주세요.

loop do
  Graphics.update
end


loop do ~ end 라는 것은 무한 루프를 말합니다. 끝이 없는 루프입니다. 브레이크를 걸어주지 않으면 반복되지요. 지난번 단원에서 설명했던 것으로 기억합니다.

따라서 여기에서는 루프를 사용해서 Graphics.update 라고 하는 행의 실행을 반복하게 됩니다.
이 행은 Graphics 모듈의 update 메소드를 호출하고 있습니다. 특정 클래스의 오브젝트에서 해당 클래스의 메소드를 사용하는 법과 비슷하지요.

Graphics.update 는 게임 화면을 갱신(업데이트)하고 시간을 1 프레임 진행하면 말하는 역할을 완수합니다.

이 타이밍에 맞춰서 화면에 표시되고 있는 그래픽이 일제히 교체되는 것입니다. 이 형태가 RGSS 게임 실행의 기본입니다.
RPG 게임을 실행하는 복잡한 스크립트도 이 기본형에 여러가지 처리를 첨가해 만들어져 있습니다.

덧붙여 여기서 든 예만으로는 아무것도 표시되지 않습니다.
새까만 화면을 몇번이나 고쳐 쓴다고 하는 처리를 반복하고 있을 뿐입니다.

여기서부터, 이제 그림을 표시하는 방법을 배워볼까요?

스프라이트와 비트 맵
방금전의 스크립트에 2 행을 다음과 같이 추가해 봅시다.
화면 좌상에 작은악마의 그림이 표시되면 성공입니다.

devil = Sprite.new
devil.bitmap = Bitmap.new("Graphics/Battlers/075-Devil01")

loop do
  Graphics.update
end


Sprite 와 Bitmap 라고 하는 새로운 클래스가 나왔습니다.

Sprite 는 게임 화면에 특정 그림을 표시하기 위한 기본 개념이 되는 스프라이트를 나타내는 클래스입니다.
Bitmap 은 스프라이트 등의 전송원이 되는 비트맵의 내용 그 자체를 나타내는 클래스입니다.
도움말에서 많이 쓰이는 "전송원"이라는 말이 생소하게 들릴텐데요. 그러니까, 그림을 어디로부터 전송해오느냐는 근원지를 말합니다.

1 행에서는 Sprite 클래스의 인스턴스를 새롭게 작성해 그것을 devil 라고 하는 변수에 대입하고 있습니다.
정수나 문자열등의 오브젝트를 작성할 때는 3 이라든지 "Ruby" 와 같이 값을 직접 쓸 수 있습니다만, 스프라이트를 작성할 때 에는 이와 같이 Sprite.new 라고 기술할 필요가 있습니다. 특정 클래스의 오브젝트를 생성할 때 보통 new라는 메소드를 씁니다.

2 행에서는, RGSS-RTP 에 포함되어 있는 그림 파일 ("075-Devil01")을 읽어들여 Bitmap 클래스의 인스턴스를 새롭게 작성합니다.
그리고 devil 오브젝트의 bitmap 라고 부르는 프로퍼티에서 그것을 설정해 주었습니다.
이렇게 이 비트맵을 스프라이트의 전송원으로서 할당한다고 하는 의미가 되어 입니다.
그리고 해당 비트맵은 앞서 말한 그림파일을 읽어들였으니, 그 그림파일에서 그림을 전송해서 스프라이트에 표시한겁니다.

Bitmap.new 의 인수에서는 / 사용하는 것을 주의하세요.
백슬래시 \의 경우 특별한 의미를 갖기 때문에 폴더를 나타낼 때는 /를 사용합니다.

프로퍼티

Sprite 클래스의 bitmap 의 같은 것을 프로퍼티라고 부릅니다. 이것은 Ruby 언어 사양에 있는 개념이 아니고, RGSS 독자적인 용어입니다.

게임 라이브러리에는 대입 연산자를 사용해 내용의 설정을 할 수 있도록 정의되고 있는 메소드가 많기 때문에 그러한 것을 편의적으로 프로퍼티라 부릅니다.

예를 들어, 스프라이트의 좌표를 나타내는 x, y 라는 프로퍼티의 값을 변경하면, 이와 같이 됩니다.

devil = Sprite.new
devil.bitmap = Bitmap.new("Graphics/Battlers/075-Devil01")
devil.x = 320
devil.y = 240

loop do
  Graphics.update
end

3 행에서는, 스프라이트의 X 좌표를 지정하는 프로퍼티 x 에 320 이라고 하는 값을 설정해 주었습니다.
4 행에서는, 스프라이트의 Y 좌표를 지정하는 프롭퍼티 y 에 240 이라고 하는 값을 설정해 주었습니다.

이것을 실행하면, 스프라이트의 표시 위치가 화면 중앙 부근이 되어 있을 것입니다.

한층 더 손봅시다.

devil = Sprite.new
devil.bitmap = Bitmap.new("Graphics/Battlers/075-Devil01")
devil.ox = devil.bitmap.width / 2
devil.oy = devil.bitmap.height / 2
devil.x = 320
devil.y = 240

loop do
  Graphics.update
end

완전하게 중앙에 표시되게 되었습니다. 이것은 ox, oy 라는 프로퍼티를 설정하는 것으로, 스프라이트의 원점을 변경 했기 때문입니다.

RPGXP 의 이벤트 커멘드 [픽쳐의 표시] 로는 원점을 [좌상],[중심] 으로부터 선택할 수 있습니다만, 그것과 같은 개념입니다.
디폴트 상태에서는, 원점은 그림의 좌상이 되어 있습니다.

width, height 라고 하는 것은 Bitmap 클래스의 메소드로, 각각 그림의 폭과 높이를 취득하는 것입니다.
그것들을 2 로 나눈 값, 즉 그림의 중심을 원점으로서 설정한 것입니다.

여기까지 오면 Sprite 클래스나 Bitmap 클래스의 설명을 읽고, 재미있을 것 같은 프로퍼티나 메소드를 찾아내면, 그것이 RGSS 습득에의 지름길입니다.


배열이란?

배열
배열의 생성
배열의 요소에의 대입
배열의 조작
배열에 의한 루프

배열이란?

복수의 오브젝트를 일괄해 취급하고 싶을 때 사용합니다.

배열의 생성
배열은 [] 이라고 하는 기호안에 요소를 늘어놓는 것으로 생성할 수 있습니다.

a = ["알렉스 ", "브라이언 ", "캐롤 "]

이 프로그램에서는, "알렉스", "브라이 안", "캐롤 " 라고 하는 3 개의 문자열을 격납한 배열을 작성해, 그것을 a 라고 하는 변수에 대입하고 있습니다.

배열안의 오브젝트를 꺼낼 때 , 이와 같이 합니다.

a = ["알렉스 ", "브라이언 ", "캐롤 "]

p a[0]          # => "알렉스 "
p a[1]          # => "브라이언 "
p a[2]          # => "캐롤 "

이와 같이, a[0] 이나 a[1] 등, 각각의 요소를 별개의 변수와 같이 취급한다 일이 생깁니다.여기서 0, 1, 2 와 같은 숫자를, 배열의 첨자라고 부릅니다.
첨자는 1 에서가 아닌 0 으로부터 시작되어 있는 것에 주의.
0 으로부터 시작되어, 왼쪽에 있는 요소부터 0, 1, 2 …순으로 이어집니다.

배열에는 문자열 뿐만이 아니라, 임의의 오브젝트를 넣을 수 있습니다.
첨자를 지정하지 않고 배열 오브젝트 그 자체를 p 로 표시하는 일도 가능.

a = [2000, "알렉스 ", true, 1..50]

p a             # => [2000, "알렉스 ", true, 1..50]


배열의 요소에의 대입
배열의 각 요소는 보통 변수와 같게 취급할 수 있기 때문에 대입으로 값을 변경하는 일도 할 수 있습니다.

a = [10, 20, 30]
a[0] = 100

p a             # => [100, 20, 30]

이 예에서는, 우선 10, 20, 30 이라고 하는 3 개의 수치를 "격납"한 배열을 작성해 최초의 요소에 나중에 100 을 대입하고 있습니다.
이 때 a[0] 에는 10 이 격납되어 있습니다만 대입에 의해서 100 으로 바꾸어 넣었기에 출력 결과가 이와 같이 되는 것입니다.

최초로 작성한 배열의 범위외의 첨자를 지정해 대입하면, 자동적으로 배열이 확장됩니다.

a = [10, 20, 30]
a[3] = 40

p a             # => [10, 20, 30, 40]

배열이 작성된 시점에서는 요소는 3 개였지만, a[3] 이라고 하는 범위외의 요소 에 대해서 대입했기 때문에, 자동적으로 요소 4 개의 배열이 되었습니다. C 언어 등에서는 이러한 대입은 용서되지 않습니다만, Ruby 는 유연한 언어이므로 안심 입니다.

범위를 건너 뛰면 어떻게 되는 것입니까?

a = [10, 20, 30]
a[5] = 60

p a             # => [10, 20, 30, nil, nil, 60]

nil 라고 하는 값이 나타났습니다.이것은 true 나 false 등과 같은의사 변수의 일종으로, 의미는 「아무것도 없다」라고 하는 것입니다.true 가 「진」, false 가 「가짜」를 나타내는 것과 같이, nil 는 「無」를 나타냅니다.

배열의 조작

배열은 Array 클래스의 인스턴스입니다.따라서 이 클래스에서 정의된 메소드를 사용해서 배열 데이터의 조작을 실시할 수 있습니다.

예를 들어, 배열의 요소수를 알고 싶은 경우는 size 라고 하는 메소드를 사용합니다.
String 클래스의 size 메소드는 문자열의 바이트수를 돌렸지만, Array 클래스의 size 메소드는 배열의 요소수를 돌려줍니다.
배열이 공집합일 때는 0 을 돌려줍니다.

a = ["알렉스 ", "브라이언 ", "캐롤 "]

p a.size        # => 3

배열안에 특정의 값이 포함되어 있는지 어떤지 알고 싶은 경우는, include? 그렇다고 하는 메소드를 사용합니다.

a = ["알렉스 ", "브라이언 ", "캐롤 "]

p a.include?("브라이언 ")      # => true
p a.include?("데이지 ")        # => false

3 행에서는 include? 메소드를 사용하고, 배열에 "브라이언" 이라는 값이 포함되어 있는지 어떤지를 확인.
이 경우, 1 행의 배열의 생성으로 "브라이언 " 값이 설정되어 있기 때문에, true가 출력됩니다.
4 행의 경우 "데이지 " 라고 하는 값이 포함되어 있을까 어떨까를 확인하고 있습니다.
그러한 값은 존재하지 않으므로, false가 출력됩니다.

배열에 의한 루프

for 루프에는 범위 오브젝트 뿐만이 아니라, 배열 지정도 할 수 있습니다.

a = ["알렉스 ", "브라이언 ", "캐롤 "]

for s in a
  p s
end

여기에서는 변수 s 를 이용하고, 배열 a 에 격납된 요소를 루프 시키면서 출력시키고 있습니다.
루프 시키는 범위가 a 에 격납되고 있는 요소의 수, 그리고, "알렉스", "브라이언", "캐롤 " 순으로 메시지 박스에 표시되어 거기서 루프 종료가 됩니다.




해시
해시의 생성
해시에의 값의 추가
해시의 조작
해시에 의한 루프

해시란?

배열과 닮은 데이터 구조에 해시라는 것이 있습니다.

해시의 생성

해시는 연상 배열이라고도 불립니다.
배열과의 차이는, 값을 꺼내기 위해 키 (배열의 첨자에 상당하는 것)로서 임의의 오브젝트를 사용할 수 있는 것입니다.
해시는 {} 이라고 하는 기호안에 요소를 늘어놓는 것으로 생성할 수 있습니다.

a = {"알렉스 "=>2000, "등산용 륙색 "=>2003}

이 예에서는, "알렉스 " 와 "등산용 륙색 "가 값을 꺼내는 키로, 2000, 2003 이 실제의 값입니다.
이와 같이, 해시를 직접 생성 할 경우에는 => 라고 하는 기호를 사용해 키와 값을 늘어놓습니다.

해시안의 오브젝트를 꺼낼 때는 아래와 같이 합니다.

a = {"알렉스 "=>2000, "등산용 륙색 "=>2003}

p a["알렉스 "]        # => 2000
p a["등산용 륙색 "]            # => 2003
p a["우사응"]        # => nil

마지막 예로부터 알수 있듯이, 존재하지 않는 키를 지정했을 경우는 nil 이 됩니다.

여기에서는 문자열을 키로 했습니다만, 물론 문자열이 아니어도 상관하지 않습니다.
키로서 정수 밖에 사용하지 않는 데이터에서도, 그 번호가 전부 다른 경우에는 배열보다 해시를 사용하는 편이 편리. 파티소지 아이템에서 쓰이지요.

덧붙여 「값에 대응하는 키를 조사한다」경우에는 [] 의 안에 값을 쓰고 키를 꺼낼 수 없습니다.
그러한 조작을하기 위한 메소드는 별도로 준비되어 있습니다.

해시의 값의 추가

해시는 프로그램중에서 직접 데이터를 지정해 생성하는 것보다 우선 공집합 해시를 만들어 데이터를 추가해 나가는 것 쪽이 많을지도 모릅니다.
공집합 해시의 예

a = {}

배열의 요소에 대입하는 것과 완전히 똑같이, 해시에 값을 추가하는 것이 할 수 있습니다.

a = {}
a["알렉스 "] = 2000

p a                 # => {"알렉스 "=>2000}

해시의 조작

해시는 Hash 클래스의 오브젝트입니다.
배열과 같이, 이 클래스에서 정의된 메소드를 사용해서 데이터의 조작을 할 수 있습니다.
예를 들면, 해시로부터 값을 삭제하는 경우는 delete 메소드를 사용합니다.

a = {"알렉스 "=>2000, "등산용 륙색 "=>2003}
a.delete("등산용 륙색 ")

p a                 # => {"알렉스 "=>2000}

해시가 특정의 키를 가지고 있을지 알고 싶은 경우는, include? 그렇다고 하는 메소드를 사용합니다.

a = {"알렉스 "=>2000, "등산용 륙색 "=>2003}

p a.include?("알렉스 ")    # => true
p a.include?("우사응")    # => false

3 행에서는 include? 메소드를 사용하고, 해시에 "알렉스 " 라고 하는 키가 포함되어 있는지 어떤지를 확인해 있습니다.
이 경우 1 행의 해시의 생성으로 "알렉스 " 키가 설정되어 있기 때문에, true가 출력됩니다.
같은 4 행 째로는 "우사응" 라고 하는 키가 포함되어 있을까를 확인하고 있습니다.
그러한 키는 존재하지 않으므로, false가 출력됩니다.

해시에 의한 루프
Hash 클래스에는, 키의 일람을 배열로서 취득하는 keys 메소드가 있습니다.

a = {3=>6, 4=>10, 5=>15}
p a.keys            # => [5, 3, 4]

이와 같이, => 의 좌측에 있는 키의 일람이 배열로서 출력됩니다. 해시에는 순서가 없기 때문에, 순서는 정해지지 않습니다.
배열을 for 루프로 지정하는 방법에 대해 학습한 것을 응용하면, keys 메소드의 반환값을 for 루프로 지정하면 해시의 키에 의한 루프를 만들 수 있는 것을 알 수 있군요.

a = {3=>6, 4=>10, 5=>15}

for k in a.keys
  p k
end

이것을 실행하면 3, 4, 5 가 무순서로 표시됩니다.
또, values 라고 하는 메소드를 사용하면, 값 쪽의 일람을 취득할 수 있습니다.

a = {3=>6, 4=>10, 5=>15}

for v in a.values
  p v
end

이것을 실행하면 6, 10, 15 가 무순서로 표시됩니다.


휴... 도움말을 기초로 해서 그런지 날림 강의가 되었군요. 응용편에 빨리 들어가고 싶은마음에 그만.
어쨌든... 이해가 안 가는 부분을 짚어주시면 부가설명하겠습니다.
번호 제목 글쓴이 날짜 조회 수
371 레벨에 따라 값을 더 받아보자! [5] 다크세이버™ 2006.06.05 273
370 강력한 무료 에디터 Elitpad 6.5 file 나라 2006.06.04 138
369 제 2 부 ! 나도 게임을 만들수 있다 ! [5] 다크세이버™ 2006.06.01 320
» [스크립트기초] 제 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
362 [비밀소년] ◆공부용◆ 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