Zia/커스텀 클래스와 열거형

엔진에서 처리하는 커스텀 아이템에 대한 설명입니다.
항목 이름 뒤의 괄호에는 사용 가능한 최소 버전이 적혀 있습니다. 또한 아이템의 정의나 기능이 바뀌었을 경우 새로 생긴 어트리뷰트는 항목 밑에 따로 기재했습니다.

용어

무언가를 포괄하거나, 이름이 너무 복잡해서 아니면 그냥 내 맘대로 부를 것들의 목록입니다.

typedef

여기의 내용은 Direct2D의 클래스를 그대로 typedef를 통해 정의한 것입니다.

Z_Geometry: ID2D1Geometry
Z_Color: D2D1_COLOR_F
Z_RECT: D2D1_RECT_F - z0.53에서 커스텀 구조체를 사용하도록 변경되었습니다.
Z_ELLIPSE: D2D1_ELLIPSE - z0.53에서 커스텀 구조체를 사용하도록 변경되었습니다.
Z_Font: IDWriteTextFormat
Z_Cursor: HCURSOR

구조체 - 기본

NZ_Angle(float ang)

육십분법 각도를 나타내는 구조체입니다. 모든 각도가 0 ~ 360 사이가 되도록 내부적으로 작동하도록 되어 있습니다.
일반적인 데카르트 평면에서의 각도 측정 방식을 그대로 따라갑니다. 일반적인 float값을 넘겨도 아무 이상 없지만, 언제 고장날 지 몰라요...

생성자

(float ang) 각을 입력받아서, 그대로 저장합니다.

메서드

between(NZ_Angle, NZ_Angle): 이 각이 주어진 두 각 사이에 있는지 판단합니다. 앞의 인자가 시작 값, 뒤의 인자가 끝 값입니다.


NZ_RandomFloatGen = NZ_RFG(float min, float max)(z0.76)

min과 max 사이의 랜덤한 아무 값을 나타내는 구조체입니다.
이때 나오는 값은 모든 값이 균등한 확률로 나옵니다. 맥스웰 분포 같은 건 나중에 만들어 줄게요.

생성자

(float, float): 랜덤 범위의 최솟값과 최댓값을 정해줍니다.

메서드

Get(): 랜덤한 값을 얻습니다.


Z_Point(float x, float y)

이차원상의 점을 나타내는 구조체입니다. typedef를 쓰기 귀찮아서 scale과 같이 점과는 관련 없지만 값을 2개 사용하는 요소도 이 구조체를 사용합니다.
이 구조체는 벡터로 생각하여 벡터 간 연산이 구현되었으며, 행렬에 대해서는 연산 순서에 따라 행벡터인지 열벡터인지가 결정됩니다.

생성자

(float x, float y): 뻔하지...
(NZ_Angle t): (cos(t), sin(t))를 생성합니다.

메서드

operator(p): p가 벡터인 경우 p와의 스칼라곱을 계산합니다. 이외의 경우는 일반적인 계산을 따릅니다.
vdot(p): p와의 벡터곱을 계산합니다.
size(): 벡터의 크기, 다르게 말하면 원점과의 거리를 계산합니다.
squaredSize(): 위에 저거의 제곱입니다. 무려 루트를 계산하지 않지!
arg(): 벡터의 육십분법 편각을 계산합니다.
rarg(): 벡터의 호도법 편각을 계산합니다.

라디안 각이 필요할 때 arg() / 57.어쩌고 하지 마세요. 걍 rarg()를 씁시다.
XInvert(): x좌표의 부호를 바꿉니다.
YInvert(): y좌표의 부호를 바꿉니다.
Z_Point 구조체 앞에 -를 붙이는 것으로 원점 대칭인 좌표를 바로 구할 수 있습니다. .XInvert().YInvert() 하지 마세요.
abs()(z0.76): (|x|, |y|)를 출력합니다.
edot(p)(z0.76): 벡터 p와의 원소곱을 계산합니다.
vdot(p)(z0.76): 벡터 p와의 벡터곱을 계산합니다.
Transpose()(z0.76): (y, x)를 출력합니다.

관련 어트리뷰트

HZ_Point(): 대응하는 점의 해시값을 계산합니다. 혹시 unordered_set 같은 거 쓴다면 써먹으세요.
zia::Point(): 이걸로 Z_Point를 생성하세요.


Z_Matrix(float x1, float x2, float y1, float y2)

x1 x2
y1 y2
2x2 크기의 정사각행렬입니다. 행렬이 그렇듯, 언제나 유용하게 써먹을 수 있어요.

생성자

(float x1, float x2, float y1, float y2): 뻔하지...
(Z_Point left, Z_Point right): 전통적으로...
(NZ_Angle t): (cos(t), -sin(t), sin(t), cos(t))를 생성합니다. 선형 변환 때리라고 만들었습니다.

배율을 의미하는 선형 변환 (a, 0, 0, b)는 없습니다. 직접 쓰세요.

메서드

Left(): (x1, y1), 즉 행렬의 왼쪽 성분을 리턴합니다.
Right(): (x1, y1), 즉 행렬의 왼쪽 성분을 리턴합니다.

두 함수를 어찌해서 직접 Left(), Right()를 수정할 수 있게 해볼게요... 시도는 말이죠...
det(): 행렬의 행렬식, 즉 (x1 * y2 - x2 * y1)를 계산합니다.
Transpose(): 행렬의 전치행렬을 계산합니다. 도대체 누가 쓸까
Invert(): 행렬의 역행렬을 계산합니다.
Z_Point처럼, 구조체 앞에 -를 붙이는 것으로 모든 성분의 부호가 반대인 행렬을 바로 구할 수 있습니다.
abs()(z0.76): 다음 행렬을 출력합니다. 그냥 보여주는 게 더 빠를거 같아서요...
|x1| |x2|
|y1| |y2|

관련 어트리뷰트

HZ_Matrix(): 대응하는 행렬의 해시값을 계산합니다. 혹시 unordered_set 같은 거 쓴다면 써먹으세요.
zia::Matrix(): 이걸로 Z_Matrix를 생성하세요.


Z_Pos(float x, float y, ORIGIN origin)

화면상 물체의 위치를 나타내는 구조체입니다.

생성자

(float x, float y, ORIGIN origin): 말해뭐해
(Z_Point p, ORIGIN origin): Z_Point를 이용하여 간단하게 만들 수도 있어요.

메서드

GetAbsPos(): 윈도우 창의 왼쪽 위를 기준으로 계산된 좌표를 계산합니다. 프로그래머 좌표...를 리턴한다고 보면 됩니다.
ChangeOrigin(ORIGIN): 원점을 바꿔서 계산되는 위치를 리턴합니다.
XInvert()(z0.76): x좌표의 부호를 바꿉니다.
YInvert()(z0.76): y좌표의 부호를 바꿉니다.

관련 어트리뷰트

ORIGIN 열거형:

ORIGIN_TOPLEFT: 왼쪽 위를 원점으로 생각합니다.
ORIGIN_CENTER: 윈도우 창의 중심을 원점으로 생각합니다.
zia::Z_Pos(): 이걸로 Z_Pos를 생성하세요. (z0.76) origin을 입력하지 않으면 자동으로 ORIGIN_CENTER로 간주됩니다.


구조체 - 그래픽 관련

Z_Rect(z0.53)

직사각형 구조체입니다. 왼쪽의 x좌표, 아래의 y좌표, 오른쪽의 x좌표, 위의 y좌표를 저장합니다.

메서드

TopLeft()(z0.76): (왼쪽의 x좌표, 위의 y좌표)를 반환합니다.
BottomLeft()(z0.76): 뻔하죠?(왼쪽의 x좌표, 아래의 y좌표)를 반환합니다.
덧셈과 뺄셈(z0.76): 모든 좌표값에 좌표를 더하거나 뺍니다. 즉 사각형을 평행이동시켜요.
Z_Matrix * Z_Rect(z0.76): 선형변환된 사각형의 새로운 경계를 가져옵니다. 변환은 (0, 0)을 기준으로 이루어집니다.
size()(z0.76): 직사각형의 크기를 반환합니다.
center()(z0.76): 직사각형의 중심의 좌표를 반환합니다.
Include(p)(z0.76): 점이나 벡터가 사각형 안에 들어있는지 판단합니다.

관련 어트리뷰트

zia::Rect(float x4): Z_Rect 구조체를 만듭니다.


Z_Ellipse(z0.53)

타원 구조체입니다. 무려 Direct2D의 타원 구조체보다 우월(!)하다구!

관련 어트리뷰트

zia::Ellipse(Z_Point, Z_Point, NZ_Angle): Z_Ellipse 구조체를 만듭니다. 처음의 Z_Point는 타원의 중심의 위치를, 두 번째 Z_Point는 타원의 장단축을(float를 넘겨 원을 만들어도 됩니다.), 마지막 각도는 타원의 기울어진 정도를 나타냅니다.


Z_Brush

물체를 색칠하는 구조체입니다. 쓸려면 쓰셈
색을 전달하여야 하는 요소에 브러시 객체를 전달하면 메모리를 절약할 수 있어요. 약간?

관련 어트리뷰트

zia::Brush(Color color, disposal(z0.65)): 후술할 색 요소들로 브러시를 생성할 수 있습니다. 인자로는 색 요소 중 아무거나 사용하면 됩니다.

Z_Color: 단색 브러시를 만듭니다.
Z_Gradient: 그라디언트 브러시를 만듭니다.
Z_PolarGradient: 원형 그라디언트 브러시를 만듭니다.
(z0.65)함수 끝에 "disposal"을 추가해서 일회용으로 쓰이고 버려지는 브러시를 만들 수 있습니다.


Z_Path(Z_PathSegment arr[])

패스 지오메트리(폴리라인 비스무리한겁니다)를 만드는 데 사용되는 구조체입니다.

하위 클래스

Z_PathSegment(Z_Point x4): 패스 성분을 나타내는 구조체입니다. 내부적으로 이상하게 구현되어 작동하니 웬만하면 건드리지 마요...

관련 어트리뷰트

zia::Z_PathSegment(...): 패스 성분을 만듭니다. 매개변수 종류에 따라 인자를 전달하세요.

Z_Point(float, float): 다음 점의 좌표를 전달하세요. 결과물은 이전 성분의 끝점과 이어진 직선입니다.
Z_Point(float, float), NZ_Angle: 다음 점의 좌표와 만들 원호의 중심각을 전달하세요. 중심각의 부호가 양이면 시계 반대 방향으로, 음이면 시계 방향으로 움직이며 원호를 만듭니다. 결과물은 이전 성분의 끝점과 이어진 원호입니다.
NZ_Angle, Z_Point, NZ_Angle: 지금의 점에서 시작하여 Z_Point에서 끝나는 타원호를 만듭니다. 앞의 NZ_Angle는 시작점에서의 접선 방향을, 뒤의 것은 끝점에서의 접선 방향을 전달합니다. 결과물은 이전 성분의 끝점과 이어진, 이심률이 최소인 타원호입니다.
Z_Point x (2개~3개): n차 베지에 커브를 만듭니다. 이전 성분의 끝점에서 시작하여, 전달된 점들을 컨트롤 포인트로 하여 베지에 커브를 만듭니다. 결과물은 이전 성분의 끝점에서 전달 인자 중 마지막 것까지의 베지에 커브입니다.
zia::Path(...): 패스 지오메트리를 만듭니다. 인자들로 Z_PathSegments를 원하는 만큼 전달하면 됩니다.
시작점에 한하여, Z_PathSegments 대신 Z_Point를 전달하여도 됩니다.


Z_Gradient(Z_GradientSegment arr[], Z_Point start, Z_Point end)

start에서 end까지 이어지는 그라디언트 색깔을 만드는 데 사용되는 구조체입니다.

start와 end의 좌표는 만들어진 지오메트리의 중심의 위치에 따라 정해집니다. 현재 전달한 start와 end의 y좌표가 반전되어 그라디언트가 적용되는 문제점이 있습니다. 다음 버전(z0.53)에서 수정되었습니다.

하위 클래스

Z_GradientSegment(float point, Z_Color color): 0에서 1 사이의 위치 point를 입력받았을 때(point가 범위를 벗어나면 어떻게 되는지 모릅니다!), 그 지점에 color 데이터를 저장합니다. 이렇게 저장된 데이터는 그라디언트 컬러를 만들 때 이용됩니다.

Z_PolarGradient 구조체도 이 구조체를 이용하여 생성됩니다.

관련 어트리뷰트

zia::GradSeg(float point, Z_Color color): Z_GradientSegment 구조체를 만듭니다. 이름이 너무 길어서 줄였어요.
zia::Gradient(Z_Point start, Z_Point end, ...): 그라디언트 컬러를 만듭니다. 시작 지점과 끝 지점을 정해주고 Z_GradientSegment 구조체를 원하는 만큼 전달해 주면 됩니다.


Z_PolarGradient(Z_GradientSegment arr[], Z_Point center, Z_Point origin, Z_Point radius)

중심이 center이고 장단축이 radius인 타원형 그라디언트 색깔을 만드는 데 사용되는 구조체입니다.
이때 origin은 그라디언트의 중심을 의미합니다.

center의 위치는 만들어진 지오메트리의 중심의 위치에 따라 정해집니다. 현재 전달한 center의 y좌표가 반전되어 그라디언트가 적용되는 문제점이 있습니다. 다음 버전(z0.53)에서 수정되었습니다.

하위 클래스

Z_GradientSegment(float point, Z_Color color): Z_Gradient와 같은 구조체를 사용합니다.

관련 어트리뷰트

zia::GradSeg(float point, Z_Color color): Z_Gradient와 같은 함수를 사용합니다.
zia::PolarGradient(Z_Point center, Z_Point Origin, float xRadius, float yRadius, ...): 그라디언트 컬러를 만듭니다. 컬러 타원의 중심과 그라디언트의 중심 타원의 장단축을 정해주고 Z_GradientSegment 구조체를 원하는 만큼 전달해 주면 됩니다.
origin 인자가 없다면 center와 같은 것으로 취급하고, 반지름 인자를 하나만 전달하면 원형 그라디언트를 생성합니다.

이때 반지름을 Z_Point를 사용하여 넘길 수 없습니다. 이거 만드는데 함수 오버로드를 너무 많이 만들어서... 프로그래밍 못해서 미안합니다...


Z_Text(Z_Font* font, std::wstring text, Z_Brush brush)

font 폰트를 사용해서 brush의 색으로 이루어진 텍스트를 의미하는 구조체입니다.

관련 어트리뷰트

FontStyle 열거형:

FONTSTYLE_NORMAL: 노~르말한 폰트 자형을 의미합니다.
FONTSTYLE_OBLIQUE: 기울어진 폰트를 의미합니다. 밑의 이탤릭체와 달리 글자의 모양이 변화하지는 않습니다.
FONTSTYLE_ITALIC: 필기체(?) 폰트를 의미합니다.
zia::Font(string fontName, float fontSize, UINT fontWeight, FontStyle fontStyle, UINT fontStretch): 폰트를 생성하는 함수입니다. L"맑은 고딕", L"Arial"과 같은 폰트 이름과 글자의 크기를 전달합니다.
추가적으로, fontWeight를 통해 폰트의 굵기를, fontStyle를 통해 폰트의 모양을, fontStretch를 통해 글자의 간격을 전달할 수 있어요.
zia::Text(string content, Z_Font* font, void* color): 이걸로 텍스트를 생성하세요. 텍스트의 내용이 변하지 않는다면 정적인 텍스트 L"..."을 사용해도 좋지만, 텍스트의 수정이 필요할 때는 std::wstring을 사용해서 넘기세요.


Camera(...)(z0.65)

Zia의 가상 공간을 촬영하여 스크린으로 보여주는 구조체입니다.
엔진이 초기화될 때 기본으로 하나 생성됩니다. 이는 zia::GetCamera()를 통해 얻을 수 있어요.
카메라는 마치 물체인 것처럼 행동합니다. zia::Move() 같은 물체를 컨트롤하는 함수들을 웬만하면 카메라에도 적용시킬 수 있어요.


Z_Animation(...)(z0.76)

스프라이트 애니메이션을 나타내는 구조체입니다.
Zia의 애니메이션은 프레임 단위로 나누어지지 않고, 각 스프라이트에게 주어진 초 단위의 시간대로 작동합니다.

생성자

좀 어려운데...
다음의 인자를 원하는 만큼 쓰면 됩니다.

std::pair<Z_Sprite, float>((보일 스프라이트), (스프라이트가 보일 시간))


Z_Cloud(...)(z0.76)

입자 모델을 나타내는 구조체입니다.
입자 모델은 스프라이트를 포함하지 않으며, 물체에 연결돼서 그 물체의 스프라이트가 Z_Cloud를 거치면서 구현됩니다.
사실 Z_Particle가 아니고 Z_Cloud인 이유는 별거없고 걍 짧은게 좋아서그럼


구조체 - 물리 관련

요소가 너무 많은 건 그냥 ...으로 줄였어요

Thing(...)

모든 것을 대표하는 구조체입니다. 일반적인 물체를 포함하여 배경이나 필드, 그림자, UI를 한번에 다룰 수 있어요.
프로그래머들을 위해 말하자면, 부모 클래스란 겁니다.

Object(...)

물체를 나타내는 구조체입니다. 다음 다음 업데이트때 봅시다!

Background(...)

배경화면을 나타내는 구조체입니다. 다음 다음 업데이트때 봅시다!
zia::SetHeight()를 통해 지평선까지의 거리를 지정할 수 있습니다. 지평선까지의 거리가 더 멀면 카메라가 움직일 때 덜 움직여요.

Field(...)

필드, 특히 땅을 나타내는 구조체입니다. 다음 다음 업데이트때 봅시다!

Shadow(...)

그림자를 표현하는 구조체입니다. 연말에 봅시다...

Light(...)

히카리☆ 연말에 봅시다...

UI(...)

유저 인터페이스 요소를 총괄하는 구조체입니다. 세부적인 내용은 여기여기로 가세용


PZ_Field(Z_Point() fVector, Tag, ORIGIN org)

물체에 작용하는 벡터장을 나타내는 구조체입니다. 인자로 벡터를 반환하는 함수와 적용될 태그, 기준점을 받아요.

관련 어트리뷰트

zia::CreateField(): 이걸로 벡터장을 만드세요.

z0.53부터, 해당 함수는 zia 네임스페이스에 포함되었습니다. 무려 그 전엔 zia에 없었어요. 덜렁이 나느 같으니라고!
(0.76) 전달할 벡터장을 람다 식으로 표현할 수 있습니다.
(0.76) 람다 식의 인수는 (Z_Point, Z_Point)로, 각각 물체의 위치와 속도를 의미합니다.


PZ_Collider(...)

물체의 충돌 경계를 나타내는 구조체입니다.

하위 클래스

PZ_ColliderSegment(Z_Point x4): 충돌 경계의 성분을 나타내는 구조체입니다.

(Z_Point, Z_Point): 시작점과 벡터의 크기를 전달합니다. 결과물은 벡터(선분)이에요.
(Z_Point, float): 한 점과 충돌 감지를 할 임계값(반지름)을 전달합니다. 결과물은 점이에요.
(Z_Point, Z_Point, float): 원호의 시작점과 끝점, 그리고 원호의 중심각을 전달합니다. 항상 그랬듯이, 중심각은 부호를 가지며, 양의 경우 시계 반대 방향, 음의 경우 시계 방향입니다. 결과물은 원호에요.
(Z_Point, float, float, NZ_Angle): 타원의 중심과 장단축, 회전한 각도를 전달합니다. 결과물은 완전한 타원으로, 전달받은 각도만큼 회전합니다.
(Z_Point, NZ_Angle, Z_Point, NZ_Angle): 시작점과 그때의 접선의 각도, 끝점과 그때의 접선의 각도를 전달합니다. 결과물은 이심률이 최저인 타원호예요.
(Z_Point x(3~4)): 점 여러 개를 전달합니다. 결과물은 가장 첫 점을 시작, 마지막 점을 끝으로 하는 베지에 커브입니다.
충돌 경계를 만들 때: 이미지의 경우 왼쪽 아래를, 지오메트리의 경우 Z_Path 등으로 만든 지오메트리 자체의 점을 원점으로 합니다.
또한 Z_PathSegment와 다르게, PZ_ColliderSegment는 항상 시작점을 포함합니다. 다르게 말하면, 서로 떨어져 있는 충돌 경계 성분을 한 충돌 경계로 묶을 수 있단 뜻이죠.

관련 어트리뷰트

zia::ColliderSeg(): 이걸로 PZ_ColliderSegment를 만드세요.
zia::Collider(...): 이걸로 PZ_Collider를 만드세요. PZ_ColliderSegment를 맘껏 넣어 전달하면 됩니다.
zia::Attach(Thing*, ...) 이걸로 PZ_Collider를 만들지 않고 바로 물체에 충돌 경계를 전달할 수 있습니다. 이 함수는 만들어진 충돌 경계를 반환합니다.
이 함수는 다음으로 전달받은 인자를 통해 여러 가지 방식으로 충돌 경계를 만들어요:

zia::Simplify()(z0.59): 경계를 간단하게, 더 계산하기 쉽도록 대충 근사해서 바꿉니다.


PZ_ClosedCollider(...)(z0.53)

물체의 충돌 경계 중 닫힌 부분 하나를 나타내는 구조체입니다.
물체의 포함관계는, 이 구조체가 충돌 경계에 만들어져야지 계산할 수 있어요.

관련 어트리뷰트

아직 없어요. 이 구조체는 PZ_Collider.Simplify() 등으로 생성되기 때문에 임의로 만들거나 할 수 있는 게 아니에요.
정말 쓸모없겠지만, 필요하다면 PZ_ClosedCollider 구조체를 만들어서 PZ_Collider 구조체에 적용시켜서 뭔가를 할 수 있게 해 보죠.


구조체 - 유저 인터페이스 관련

Zia의 UI는 콘솔의 printf()를 대체하는 수준만 개발되었습니다. 이 문서는 z0.50을 기준으로 쓰였으며 UI 기능을 본격적으로 추가하게 된다면 매우 크게 변할 수 있다는 점 참고하세요.

WZ_Comp(...)

윈도우 창의 요소들을 모두 모은 구조체입니다. 개발이 진행됨에 따라 WZ_Comp의 요소는 계속하여 늘어날 예정입니다.
다음은 현재 개발되었거나 개발이 확정된 요소들입니다.

일관성을 위하여, 많은 요소들이 WZ_xxx와 같은 형태로 이름이 바뀔 예정입니다. 나중에 고생하며 바꾸지 말고, 윈도우는 대충 만드세요. 제발...

하위 클래스

각 요소들에는 독립적인 설명이 존재합니다. 링크를 눌러 레퍼런스를 확인하세요.

관련 어트리뷰트

일부 어트리뷰트는 zia 네임스페이스를 사용하지 않습니다. 다음 버전에서 수정될 예정입니다.
WINDOWORDER 열거형: 윈도우 창을 포함하는 UI는 항상 다른 물체들의 위에 존재합니다. 또한 같은 윈도우 창이더라도 나중에 활성화된 창이 가장 위로 올라오게 됩니다.
WINDOWORDER_DEFAULT: 노~르말한 윈도우 창이 행동하는 것처럼 행동합니다.
WINDOWORFER_ALWAYSTOP: 윈도우 창이 활성화와 상관없이 가장 위에 올라옵니다.
TextBlocks(...): WZ_TextBlocks 구조체를 이걸로 만들면 됩니다. TextBlock 구조체를 마음껏 전달하세요.
zia::RegisterWindow(Window*, WZ_Comp, WINDOWORDER): CreateThing으로 생성한 윈도우에 WZ_Comp를 등록합니다. 이 함수를 실행하지 않은 경우 윈도우 창만 존재하세 됩니다.


TitleBar(...)

윈도우 창의 타이틀바를 의미하는 구조체입니다. 여러분이 클릭해서 드래그하는 그거요.

필요에 따라, 추후의 버전에서 많은 기능들이 추가될 것입니다.

관련 어트리뷰트

TITLEBARPOS 열거형:

TITLEBARPOS_TOP: 윈도우 상단에 타이틀바를 설치합니다. 밑을 보시면 알겠지만, 다른 쪽에 타이틀바를 설치하는 변태같은 짓을 할 수도 있어요...
TITLEBARPOS_BOTTOM: 윈도우 하단에 타이틀바를 설치합니다.
TITLEBARPOS_LEFT: 윈도우 좌단에 타이틀바를 설치합니다.
TITLEBARPOS_RIGHT: 윈도우 우단에 타이틀바를 설치합니다.
CreateTitleBar(Z_Text, Color, TITLEBARPOS, float): 내용이 Z_Text이고, 색이 Color이며, float 크기의 폭을 가지고 TITLEBARPOS 방향으로 정렬된 타이틀바를 만듭니다.


TextBlock(...)

윈도우 창에 존재하는 텍스트를 표현하는 구조체입니다.

필요에 따라, 추후의 버전에서 많은 기능들이 추가될 것입니다.

관련 어트리뷰트

CreateTextBlock(Z_Text, Color, Z_Pos, float): 내용이 Z_Text이고, 색이 Color인 타이틀바를 Z_Pos 위치에 만듭니다.

ORIGIN_TOPLEFT: 창의 왼쪽 위를 원점으로 두고 위치를 계산합니다.
ORIGIN_CENTER: 창의 중심을 원점으로 두고 위치를 계산합니다. 안쓰는 기능이라 그런지 어딘가 하자 있을 예정
그런데 그것이 실제로 일어났습니다. ORIGIN_CENTER의 좌표 계산 방식에 오류가 있어서, 텍스트 박스가 이상한 곳에 생성됩니다.
아무도 안 썼기를 빌어야죠. 다음 버전에 수정될 예정입니다.


구조체 - 오디오 관련

AZ_Sound(...)(z0.59)

소스 사운드의 부모 클래스입니다. 별로 이거 자체를 쓸 일은 없을 겁니다.
밑의 모든 하위 클래스들은 exclusive 설정을 통해, 소리가 중첩되지 않고 한 소리만 재활용하여 사용할 수 있게 설계되었습니다. 요긴하게 써먹으시져

하위 클래스

AZ_Background(...)(z0.59)

배경음악으로 사용되는 소스 사운드를 만듭니다. AZ_Sound에서 상속된 클래스에요.
마치 배경음악처럼, 자동으로 반복 재생을 하도록 설정되었습니다.
이 소스는 배경 서브믹스로 진출합니다.

AZ_Ambient(...)(z0.59)

배경에 깔리는 주변 사운드를 만듭니다. 빗소리, 바람 소리 같은 거요. AZ_Sound에서 상속된 클래스에요.
귀에서 의식하지 않도록, 끊기지 않도록 반복 재생하도록 설정되었습니다.
현재, 앰비언트가 좀 더 부각되도록 배경음악 서브믹스에 이 서브믹스를 레퍼런스로 하여 사이드체인 컴프레셔를 설치한 상태입니다. 추후 컴프레셔의 인수들을 조절할 수 있게 해줄 게요.
이 소스는 앰비언트 서브믹스로 진출합니다.

AZ_OneShot(...)(z0.59)

한 발짜리 소리를 만듭니다. 총 소리 같은 단발음을 다룹니다. AZ_Sound에서 상속된 클래스에요.
이 소스는 원샷 서브믹스로 진출합니다.

AZ_OneShotEx(...)(z0.59)

모든 사운드를 씹어버리고(!) 자기 혼자 재생되는, 엄청난 존재감의 원샷입니다. 이 소리는 존재감이 엄청나서, 자기 자신도 씹어먹을 정도로 강합니다! 인자를 뭐로 하든, 항상 exclusive로 설정됩니다.
이 소스가 플레이될 때 모든 서브믹스에서 페이드 아웃과 페이드 인이 발생합니다. 하지만 서브믹스의 소리는 멈추지 않고 계속 진행됩니다.
이 소스는 마스터 보이스에 직접 진출합니다.

관련 어트리뷰트

DefaultSubmix 열거형: 이걸 사용하면 서브믹스 단위로 무언가 할 때 대상을 정해줄 수 있습니다.

0: 마스터 보이스를 의미합니다.
DEFAULTSUBMIX_BACKGROUND: 배경음악 서브믹스를 의미합니다.
DEFAULTSUBMIX_AMBIENT: 앰비언트 서브믹스를 의미합니다.
DEFAULTSUBMIX_ONESHOT: 원샷 서브믹스를 의미합니다.
(z0.65, 일부 z0.59에서도 가능)이 친구들은 | 연산자를 이용하여 여러 서브믹스를 한번에 지정할 수도 있습니다.
PlayMode 열거형: 이 열거형을 통해 AZ_Sound의 작동 방식을 결정할 수 있어요.
PLAYMODE_NONEXCLUSIVE: 소리를 새로 재생한다고 이전 것이 끊기지 않아요.
PLAYMODE_EXCLUSIVE: 소리를 새로 재생하면 이전 것을 끊어요.
PLAYMODE_STREAMING: 소리를 한번에 읽어들이지 않고, 일부분만 불러와서 차지하는 메모리를 줄여요.


AFZ_Effect(...)(z0.59)

오디오에 적용할 이펙트 클래스입니다.
이걸 만들려고 DSP를 공부했다니깐요?? 아마 다음 프로젝트를 진행할 때는 DSP를 마스터할 겁니다...

이걸 써먹는 방법은 일단 내부적으로 구현을 한 상태입니다. 추후 방식이 바뀔 수 있으나 "이런 식으로 쓸 수 있다!" 정도만 알아두시기 바래요.

하위 클래스

AFZ_VolumeMeter(...)(z0.59)

서브믹스에 적용시켜서 피크 볼륨을 얻어내는 이펙트입니다. 즉 아무 효과도 없어요. 나 같은데?

AFZ_VolumeControl(...)(z0.59)

서브믹스의 볼륨을 바꾸는 이펙트입니다. 볼륨 조절 버튼 게 섰거라~
(z0.71) 서브믹스의 팬, 즉 소리의 좌우 치우침을 조절할 수 있게 됐어요.

AFZ_Compressor(...)(z0.59)

기준 이상으로 커진 볼륨을 적절한 비율으로 낮춥니다. 인수로 Threshold와 ratio를 가집니다.
더 쩌는 건 이건 사이드체인 이펙트를 구현할 수 있단 겁니다!! 장난 안치고 Zia로 EDM 하나 뽑아도 될 듯 합니다...
사이트체인을 넣을 볼륨미터 이펙트를 추가 인자로 건네주면 사이드체인 이펙트를 사용할 수 있습니다.

AFZ_TwoPassFilter(...)(z0.59)

이걸 개발하기 위해 DSP를 배웠습니다...
버터워스 필터 2개를 이용하여 원하는 효과를 만들어 보세요. 기준 주파수와 감쇠 레벨, 반전 여부를 받습니다.
기본적으로는 버터워스 필터는 높은 주파수를 줄여 웅얼거리는 소리를 내게 만들어 줍니다(Low-Pass Filter라고 하죠). 반전시켜서 높은 주파수만 통과시키게 할 수 있습니다. 알아서 쓰시기 바래요. 필터 자체를 반전시킬 수 있다는 점도 기억하세요.
주파수 범위의 양 끝 모두 필터를 씌울 수 있도록 필터 인자를 2개 받도록 설정해 놓았습니다.

관련 어트리뷰트

PassFilter 구조체: 버터워스 필터 그 자체입니다. 주파수와 감쇠 레벨, 반전 여부를 받아 필터(정확히는 필터를 구성하는 상수 배열들)을 만든다고 생각하면 됩니다.
PassFilterSlope 열거형: PassFilter의 감쇠 레벨을 의미합니다.

PASSFILTERSLOPE_6DB
PASSFILTERSLOPE_12DB
PASSFILTERSLOPE_18DB
PASSFILTERSLOPE_24DB
위로 갈수록 감쇠율이 작습니다. 즉 밑으로 갈수록 범위의 소리를 엄격하게 먹는다는 얘기에요.