Zia/그래픽과 물리

엔진의 그래픽 렌더링과 물리 계산에 사용되는 아이템의 모음입니다. 항목 이름 뒤의 괄호에는 사용 가능한 최소 버전이 적혀 있습니다. 또한 아이템의 정의나 기능이 바뀌었을 경우 새로 생긴 어트리뷰트는 항목 밑에 따로 기재했습니다.

용어

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

매크로

함수처럼 쓰이는 매크로는 여기에 기재되지 않았습니다. 함수처럼 생긴 매크로는 에서 찾으세용

Virtual Key 매크로의 확장

여기서 키보드의 키를 의미하는 Virtual Key의 정보를 확인하세요. 또한 단순히 아스키 코드를 사용하라는 0-9와 Z-A의 범위 또한 Zia에서는 매크로로 만들어놨습니다. 잘 쓰세요!

dt_Input

Input 스레드의 반복 간격입니다. 즉, 이걸 속도 역할을 하는 변수에 곱해주면 컴퓨터의 성능과 관련없이 일정한 속도를 구현할 수 있어요.
하단의 zia::AddFunc(VK_XX)로 전달한 함수 안에 사용하는 등 키보드/마우스 입력과 관련된 함수 안에서 사용하면 됩니다.

dt_Physics

Physics 스레드의 반복 간격입니다. 즉, 이걸 속도 역할을 하는 변수에 곱해주면 컴퓨터의 성능과 관련없이 일정한 속도를 구현할 수 있어요.
하단의 zia::AddFunc(Collider*)로 전달한 함수 안에 사용하는 등 물리적 움직임이나 충돌과 관련된 함수 안에서 사용하면 됩니다.

dt_Graphics

Graphics 스레드의 반복 간격입니다. FPS를 계산하는 등 내부적으로 쓰입니다만... 써보든지

FPS

초당 프레임을 리턴합니다. 근데 이거 게임 성능 테스트 이런 거 하는 프로그램에서 FPS를 어떻게 계산하는 지 모르겠어요... 일단 이걸 게임으로 인식하려나요... 그런건 장담할 수 없습니다.

FLT_KEEPTHAT(z0.53)

물체의 속도 등을 바꿀 때, 이 매크로를 넘기면 넘겨받은 성분의 값은 바뀌지 않습니다.
마치 과로에 지친 30대 직장인처럼, 시크하고 힘없게 "KeepThat."을 외쳐 보세요(!)
(z0.59) 이제는, 오디오의 플레이에도 FLT_KEEPTHAT를 이용할 수 있어요! zia::Pause()를 사용하여 멈춘 소스에 FLT_KEEPTHAT를 인자로 zia::Play()를 사용하면 소스를 재시작할 수 있어요.

KeyBoard(z0.65)

함수의 인자를 정의하는 자리에 넣어서, 함수가 키보드를 관리할 수 있게 합니다.

파생 매크로

ZIA_AGE

상수여서 슬프네요.

함수 - 시스템 관련

ZIA_PROCEDURE(...)

아마 프로젝트를 생성하면 Win32 프로시져 안에 빌트인되어 있을 겁니다. 즉 건드리지 말라는 말이죠.

ZIA_RENDER()

마찬가지로, Win32 윈도우의 루프 안에 존재하는 함수로, 당연히 이게 없으면 화면 렌더링이 안 될 겁니다.

위의 두 함수는 zia 네임스페이스에 들어있지 않습니다. 반면 아래의 모든 함수는 zia 네임스페이스에 들어있습니다. 캼을 습관하세요 캼캼
함수의 이름을 직관적이고 짧게 하기 위해서, Zia는 살짝 무리해서 함수의 이름이 같도록 만들어요. 밑에 읽다가 어디서 본 거 같은 함수가 나온다면 이렇게 쓸 수도 있구나 하고 그러려니 하세요

zia::Initialize()

엔진을 초기화합니다. 이 함수 또한 프로젝트에 빌트인되어 있을 텐데, 건드리지 말라는 뜻이겠죠?

zia::AddFunc(VK_XX, InputType, void()* func | global, void(Keyboard)*(z0.65))

해당하는 키보드나 마우스의 키에 함수를 할당합니다. 함수는 void 형식에 아무 인자도 받지 않으면 됩니다. 만든 함수의 포인터를 전달하세요.
VK_XX 자리에 "global"을 넘기고, InputType를 생략하는 것으로 키보드 전체를 관리할 수도 있습니다.

관련 어트리뷰트

InputType 열거형:

INPUTTYPE_PRESS: 전달한 함수는 키가 눌려있다면 계속 작동합니다.
INPUTTYPE_TOGGLE: 전달한 함수는, 마치 Caps Lock처럼, 스위치와 같 방식으로 작동합니다.
INPUTTYPE_CLICKDOWN: 전달한 함수는, 키가 눌릴 때 단 한 번 작동합니다.
INPUTTYPE_CLICKUP: 전달한 함수는, 키가 떼어질 때 단 한 번 작동합니다.
INPUTTYPE_DOUBLECLICK: 전달한 함수는, 더블클릭을 인식했을 때 단 한번 작동합니다.
SetDblClickTime(UINT time): 더블클릭으로 인식할 두 클릭 사이의 간격을 설정합니다. 단위는 밀리초입니다.
SetDoubleClickTime(UINT)와 헷갈리지 말아요. 겁나서 테스트해본 적은 없지만, 아마 당신 컴퓨터의 더블클릭 인식 시간을 바꿀 거에요...
이것도 다음 업데이트 때는 zia 네임스페이스에 넣을 예정입니다. 왜 진작 안 넣었냐면 이거는 매우 오래전에 개발된 어트리뷰트에요... 당시엔 네임스페이스란 것도 몰랐다구요...(자랑은 아닙니다)

zia::fps()

FPS를 리턴하긴 합니다만, 위의 FPS 매크로를 쓰세요. 이건 없앨 예정입니다.

zia::GetCursorCoord(ORIGIN)

커서의 위치를 주어진 ORIGIN에 따라 리턴합니다.

zia::SetPixelsPerMeter(float)(z0.65)

게임에서 사용할, 미터 당 픽셀 수를 설정합니다.
뭔 소린지 모르겠죠? 예를 들자면, Zia의 미터 당 픽셀 수의 기본값은 100입니다. 즉 게임 화면의 100픽셀이 Zia의 세계에서는 1m가 되는 것이죠.
이런 기능을 왜 넣었냐고요? 공간 음향을 보다 그럴듯하게 만들기 위해 구현했습니다...

함수 - 그래픽 관련

zia::CreateThing(...)

물체를 만듭니다. 진짜로 뭐든... 만들어요
실제로 여러분이 사용할 함수는, 만들고 싶은 물체의 타입에 따라 달라집니다. 밑에를 확인하세요.
UI 문서에도 있겠지만, UI를 만들 때는 일단 이 함수로 틀을 만들고 Register() 계열의 함수로 UI를 등록해야 합니다.

이 함수군은 공통적으로: 전달받을 타입, "그릴 도구", 렌더링 순서(z좌표), 위치, 회전 각도, 중심으로 사용할 내부 좌표를 전달받아요. 또한 이렇게 만들어진 물체의 포인터를 반환합니다.

zia::CreateThingByFile(...)

"그릴 도구"로, Z_PNG()를 통해 PNG 리소스 파일을 전달하면 됩니다. 정확히 무엇을 전달해야 할지는 가이드(WIP)를 참고하세요.
결과물로 PNG 파일로 만든 그림을 만듭니다. 이때 기준점의 위치는 그림의 왼쪽 아래를 원점으로 두고 계산해서 넘기면 됩니다.
(z0.53) 이제는 Z_Rect로 범위를 지정해서 원하는 범위만 취해서 만들 수 있어요. (z0.71) 이제는 물체의 가장 앞 인자에 리소스 대신 그림 파일의 경로를 넣기만 하면 됩니다.

zia::CreateThingByGeometry(...)

"그릴 도구"로, 지오메트리와, 컬러나 브러시를 전달하면 됩니다.
결과물로 지오메트리 안에 주어진 색으로 칠해진 물체를 만듭니다. 기준점이 위치는 지오메트리의 (0, 0) 좌표를 원점으로 계산해서 넘기면 됩니다.

zia::CreateThingByLine(...)

"그릴 도구"로, Z_Point로 정의된 벡터나 Z_Path, 컬러나 브러시를 전달하면 됩니다.
결과물로 색칠된 선분이나 곡선을 만듭니다. 기준점이 위치는 선분의 시작점을 원점으로 계산해서 넘기면 됩니다.

현재 인자로 Z_Path를 전달하여 곡선을 만들 때 Z_PathSegment가 2개 이상이면 오류가 생깁니다. 다음 버전에서 말끔하게 고쳤으니 걍 다음 버전 쓰세요 ㅠㅠ

zia::CreateThingByThing(...)(z0.53)

"그릴 도구"로, Zia로 만든 물체를 전달하면 됩니다.
결과물로 전달한 물체와 동일하거나, 전달한 물체가 회전되거나 크기가 조정된 모습을 만듭니다.
Z_Rect로 범위를 지정해서 원하는 범위만 취해서 만들 수 있어요.

zia::CreateThingByText(...)(z0.71)

"그릴 도구"로, Z_Text를 전달하면 됩니다.
결과물로 글씨가 쓰여진 물체를 만들어요.

zia::Enable(Thing*)

물체를 활성화하여, 보이게 합니다.

zia::Disable(Thing*)

물체를 비활성화하여, 안 보이게 합니다. 추가적으로, 충돌 경계는 물체가 비활성화되어 있다면 작동하지 않습니다.

Thing 클래스와 UI를 제외한 모든 하위 클래스에 대해서, zia::Toggle()는 작동하지 않습니다. 누가 물체를 토글하고 싶어 하는데요?

zia::Reorder(Thing*, int)

물체의 렌더링 순서를 전달받은 값으로 바꿉니다. 이 값이 클수록, 물체는 앞에 그려지게 됩니다.

zia::SetBackgroundColor(Z_Color(*))

배경의 색을 지정된 색으로 바꿉니다. 그라디언트는 인자로 못 넘기냐고요? 도대체 왜 그러는데요?

zia::SetScale(Thing*, Z_Point | Camera*, float(z0.65))

가로세로의 비율이 전달받은 것만큼 늘어지거나 쪼그라듭니다. Z_Point의 인자 대신 float를 전달하여 가로세로의 확대/축소 비율을 동일하게 할 수 있어요.

물체의 크기가 변화하는 것은 물리 엔진이 관여하지 않습니다. 즉 크기의 변화를 나타내는 속도 같은 것은 없으며, 충돌 처리를 진행할 때도 그 변화를 예측할 수 없기에 CollideInvoke 열거형에서
을 사용하는 경우 충돌 처리가 되지 않습니다. (z0.65) 카메라의 경우 종횡비 변화는 불가능하고, 단순한 확대 비율만 조절 가능합니다.

zia::SetCenter(Thing*, ...)(z0.53)

다음으로 넘겨준 인자에 따라 이하와 같이 작동합니다.

Z_Point: 물체의 원래 원점을 기준으로 중심 좌표를 결정합니다.
COM 열겨형: 열거형에 따라서 중심 좌표를 결정합니다.

zia::Attach(Thing*, Thing*)(z0.53)

뒷 물체를 앞 물체의 차일드로 만듭니다.
이때 차일드의 order 또한 존중되어, 부모의 위나 아래에 위치하게 만들 수 있습니다.

Reorder()으로 차일드의 순서를 바꾸면 차일드가 이상한 곳에 추가로 그려지는 오류가 있습니다. 다음 버전에서 수정될 예정입니다.

zia::Zoom(Camera*, float)(z0.65)

카메라의 확대 비율의 변화하는 속도를 조절합니다.
굳이 이 기능을 만든 이유는, 카메라 스크린의 이동 범위를 제대로 제한하기 위해서에요. 다르게 말해서, 물리 엔진이 예측할 수 있습니다.

zia::Flash(Camera*, Z_Color, fadein, duration, fadeout)(z0.65)

해당 카메라에, 아주 기본적인 플래시를 터뜨립니다. 플래시의 색깔과 페이드인 시간, 유지 시간, 페이드아웃 시간을 넘기면 됩니다.

zia::Trace(Camera*, Thing*, float)(z0.65)

해당 카메라가 물체를 따라다니게 합니다. 추가로 넘기는 float를 통해 따라다니는 강도를 설정할 수 있습니다.
강도를 INFINITY로 설정하면 카메라 시점이 물체에 완전 고정됩니다.
무려 만드는 데 미분방정식을 사용했어요..! 이게 쓸모가 있다니!!!

zia::SetBorder(Camera*, Z_Rect*)(z0.65)

카메라의 충돌 경계를 설정합니다.
카메라가 지정한 경계 밖으로 나가지 못하게 하는 용도가 아니라, 경계와 닿으면 그쪽으로 이동하지만 못하도록 설계되었습니다. 즉 카메라는 여전히 경계를 탈출할 수 있으며 다시 경계 안으로 들어오지 못하게 될 수도 있습니다.
스크린이 경계와 충돌하는 지 계산할 때는, 물리적으로 예측 가능한 행동만 계산됩니다(그래서, 카메라에 한해서 Zia::Zoom()이 사용 가능한 것이죠).

zia::SetHeight(Camera*, float)(z0.65)

카메라의 높이를 설정합니다. 높이? 3차원? 히이이이익
걱정 마세요... Zia는 여전히 2D 엔진입니다. 카메라의 높이는 공간 음향을 실감나게 구현하는 데 사용됩니다. 딱 그뿐이에요.
초기값은 모니터를 50cm 앞에서 바라볼 때의, Zia의 세계 안에서의 높이입니다. 제가 쓰는 34인치 WFHD 모니터, ppm 100 기준으로 16미터 정도 나오네요.

zia::Show(Utilities)(z0.71)

유틸리티를 활성하하여, 보이게 합니다.

zia::Hide(Utilities)(z0.71)

유틸리티를 비활성하하여, 안 보이게 합니다.

zia::CreateCursor(...)(z0.71)

리소스나 파일 경로와 기준점(핫스팟이라 해요)을 받아서 커서를 만듭니다.
만든다고 끝이 아니고 이하의 함수를 통해 커서를 지정해 주어야 해요.

zia::SetDefaultCursor(Z_Cursor)(z0.71)

전딜빋은 커서를 디폴트 커서로 바꿔요. 외부에서 마우스 커서가 들어왔을 떄만 원래 커서가 디폴트 커서로 바뀌어요. 커서를 윈도우 내에서 움직이거나, 클릭을 한다고 이 함수를 통해서 커서가 바뀌는 게 아니니까 즉시 커서를 바꿔야 한다면 밑의 걸 쓰세요
NULL을 전달해서 기본 커서로 바꿀 수도 있어요

zia::SetCursor(Z_Cursor)(z0.71)

전달받은 커서로 즉시 현재 커서를 바꿉니다.
NULL을 전달해서 기본 커서로 바꿀 수도 있어요

zia::FullScrean(bool)(0.71)

전닳한 bool이 true라면 화면을 전체화면으로, false라면 창으로 바꿔요.

zia::SetText(Thing*, Z_Text)(z0.71)

zia::CreateThingByText로 만들어진 객체에 대해서, 그 글자를 넘겨준 텍스트로 바꿔요.

함수 - 물리 관련

zia::GetTag(Thing* | Camera*(z0.65))

물체의 태그를 받아옵니다. 태그에 대한 설명은 가이드를 참고하세요.

zia::SetTag(Thing*, DWORD | Camera*, DWORD(z0.65))

물체의 태그를 설정합니다. 태그의 설명을 숙지하셨다면 아시겠지만, 태그는 이진수로 넘겨줘요.

zia::Warp(Thing*, Z_Pos | Camera*, Z_Point(z0.65))

물체의 위치를 전달한 위치로 순간이동시킵니다. 물리 엔진이 예측할 수 없습니다.

zia::Move(Thing*, Z_Point | Camera*, Z_Point(z0.65))

물체의 속도를 변화시킵니다. 이때 +x방향은 오른쪽, +y방향은 위쪽입니다.

zia::Force(Thing*, Z_Point | Camera*(z0.65), Z_Point)

힘이라고 써놓긴 했지만, 물체의 가속도를 변화시킵니다. 이때 +x방향은 오른쪽, +y방향은 위쪽입니다.
뭐, 힘을 받으니까 가속력이 있잖아요. 뭐 어때요?

zia::Rotate(Thing*, NZ_Angle | Camera*, NZ_Angle(z0.65))

물체가 회전한 각도를 정해줍니다. zia::Warp()처럼, 물리 엔진이 예측할 수 없습니다.

zia::Spin(Thing*, float | Camera*, NZ_Angle(z0.65))

물체의 각속도를 변화시킵니다. 전통적으로 그렇듯, 부호가 +인 건 시계 반대 방향이에요.

zia::Torque(Thing*, float | Camera*, NZ_Angle(z0.65))

토크라고 써놓긴 했지만, 물체의 각가속도를 변환시켜요. 각가속도는, 영어로 너무 길어요.

zia::Attach(Thing*, ...)

z0.53부터 이름이 바뀌었습니다. 예전 이름은 AttachCollider이에요.
전달한 물체에 충돌 경계를 생성합니다. 함수는 이렇게 만든 충돌 경계의 포인터를 반환합니다.
물체의 포인터 다음에 전달한 인자에 대해서
float: 0부터 1 사이의 수를 임계값으로 전달하는 것으로, 픽셀 단위로 처리되는 픽셀 퍼펙트 경계를 만듭니다. 숫자가 클수록 인자의 알파 재널에 더 민감하게 반응하여 충돌 경계를 계산할 것입니다.
PZ_Collider*, Z_Point: Z_Point로 보낸 인자를 비트맵이나 지오메트리의 오프셋으로 삼아, 그 자리에 미리 만들어진 충돌 경계를 적용합니다.
ColliderPreset: 물체의 모양에 맞춰서, Zia 맘대로 충돌 경계를 만듭니다. 다음 열거형을 통해 어느 정도 모양은 정해 줄 지, 아니면 진짜 맘대로 만들게 할지 결정해요.
COLLIDERPRESET_RECTANGLE: 직사각형 충돌 경계를 만듭니다.
COLLIDERPRESET_ELLIPSE: 타원형 충돌 경계를 만듭니다. 이때 타원은 어떤 방향으로 기울거나 하지 않습니다.
COLLIDERPRESET_PATH: 진짜로 자기 맘대로 충돌 경계를 만듭니다. 진짜로요.
COLLIDERPRESET_PATH는 아직 구현되지 않았어요. 한번 구현해 보실래요? 아무런 인자도 넘겨받지 않고 아무 그림에서도 해당되는 충돌 경계를 만드는 방법을요?
Z_RECT*: 정해진 직사각형으로 충돌 경계를 만듭니다.
Z_Ellipse*: 정해진 타원형으로 충돌 경계를 만듭니다.
Z_Path*, ColliderEnd: 정해진 패스를 통해 충돌 경계를 만듭니다. ColliderEnd 열거형을 통해 패스를 닫히도록 양 끝을 이을 건지, 놔둘 건지 결정해요.
COLLIDEREND_CLOSED: 패스를 닫아서, 닫힌 도형이 되도록 합니다.
COLLIDEREND_OPEN: 패스를 열어서, 선과 같은 도형이 되도록 합니다.
를 넘기는 것으로 원하는 충돌 경계를 구현하세요.

zia::Enable(PZ_Collider*)

충돌 경계를 활성화합니다.

zia::Disable(PZ_Collider*)

충돌 경계를 비활성화합니다. 충돌 경계가 비활성화됐다면 그 경계는 다른 충돌 경계들과 충돌을 확인하지 않아요.

zia::Toggle(PZ_Collider*)

충돌 경계가 활성화되었다면 비활성화하고, 비활성화되었다면 활성화합니다. 원래 토글이 그런 거에요.

zia::Show(PZ_Collider*)

충돌 경계를 시각화합니다.

이 함수를 통해 물체의 윤곽선을 구현하려고 하지 마세요. 디버그용 기능이라 퀄리티가 좀 꾸졌습니다...

zia::Hide(PZ_Collider*)

시각화된 충돌 경계를 숨깁니다.

zia::AddFunc(PZ_Collider*, CollideInvoke, void(Thing*, Thing*)*)

충돌 경계가 충돌(비스무리한거)을 감지했다면 실행할 함수를 전달합니다. 이때 전달할 함수의 매개변수의 첫 번째 인자는 자신이 속한 물체의 포인터를, 두 번쨰 인자는 충돌한 물체의 포인터를 의미합니다.
CollideInvoke 열거형에 의해 어느 때에 전달한 함수가 발동되는 지 결정할 수 있어요.

COLLIDEINVOKE_INTERSECTED: 두 충돌 경계가 서로 겹친다면 항상 발동합니다.
COLLIDEINVOKE_TOUCHED: 두 충돌 경계가 겹치기 시작했다면 한 번 발동합니다.
COLLIDEINVOKE_UNTOUCHED: 두 충돌 경계가 더 이상 겹치지 않았다면 한 번 발동합니다.
COLLIDEINVOKE_INTERSECTING: 두 충돌 경계 가다음의 움직임으로 서로 겹칠 예정이면 항상 발동합니다.
COLLIDEINVOKE_TOUCHING: 두 충돌 경계가 다음의 움직임으로 겹치기 시작할 예정이라면 한 번 발동합니다.
COLLIDEINVOKE_UNTOUCHING: 두 충돌 경계가 다음의 움직임으로 더 이상 겹치지 않을 예정이라면 한 번 발동합니다.

zia::SetCollisionQuality(float)

Zia에서는 많은 곡선 경계 요소를 사용하고 있는데, 내부적으로 계산을 줄이기 위해 모두 선분으로 근사하여 계산합니다. 이때 그 선분의 길이의 기준을 이 함수를 통해 결정할 수 있어요.
전달하는 요소는 선분의 길이입니다. 이때 전달한 선분의 길이가 정확하게 곡선의 일부분의 길이가 되진 않습니다.
결과적으로, 전달하는 숫자가 크면 충돌의 품질이 낮아지고, 작으면 충돌의 품질이 높아집니다. 그만큼 랙을 초래할 가능성이 있으니 주의하세요.

zia::SetTag(PZ_Collider*, int)(z0.53)

충돌 경계의 태그를 전달받은 값으로 설정합니다.
z0.53 이전에는, 충돌 경계의 태그는 무조건 부모 물체와 동일하였는데, 이제는 둘의 태그가 동일하지 않아서 장(PZ_Field)을 받는 물체의 충돌을 종속성 없이 처리할 수 있게 되었습니다. ㄷㄷ

zia::Include(Thing*, Thing*)(z0.53)

뒤의 물체가 앞의 물체에 들어있는지 판단합니다. 포함한다면 true, 포함하지 않는다면 false를 반환합니다.
이 함수는 앞의 물체의 충돌 경계를 ClosedCollider()를 이용하여 (포함관계를 따질..!) 닫힌 경계를 만들었을 때 제대로 작동합니다. 앞의 물체의 충돌 경계에 닫힌 경계가 없다면 false를 반환해요.

zia::Simplify(PZ_Collider*)(z0.53)

충돌 경계를 간소화합니다. 충돌 경계를 너무 간소화시켜서 눈에 보이는 오차가 생길 수도 있습니다...

zia::ClosedCollider(PZ_Collider*, float, (out)PZ_ClosedCollider**)(z0.53)

전달받은 충돌 경계를 통해, 닫힌 충돌 경계들을 만들어냅니다. 이때 넘겨준 float는 이것보다 크기가 작은 자잘한 경계들을 걸러내게 합니다.
2개의 값을 반환하는 함수에요. 직접 반환되는 정수값은 만들어진 PZ_ClosedCollider의 개수를 반환하고, PZ_ClosedCollider*의 포인터를 넘기면 만들어진 PZ_ClosedCollider*의 배열을 저장해 줍니다.

zia::Show(PZ_ClosedCollider*)(z0.53)

닫힌 충돌 경계를 보이게 합니다.

zia::Hide(PZ_ClosedCollider*)(z0.53)

닫힌 충돌 경계를 숨깁니다.

zia::Fix(Thing*, FixAbsolute)(z0.71)

물체를 차일드로 만들면, 그 물체는 부모 물체를 따라다니게 됩니다.
만약 물체의 움직임을 원하는 대로 고정하고 싶다면 FIX계열 열거형을, 차일드의 움직임을 부모에게서 독립하게 만드려면 Absolute계열 열거형을 사용하세요.

Fix 계열:
FIX_XCOORD: 물체의 x좌표를 고정합니다.
FIX_YCOORD: 물체의 y좌표를 고정합니다.
FIX_ROTATION: 물체의 회전 위치 고정합니다.
FIX_SCALE: 물체의 크기를 고정합니다.

Absolute 계열:
ABSOLUTE_XCOORD: 물체의 x좌표를 절대 좌표로 취급합니다.
ABSOLUTE_YCOORD: 물체의 y좌표를 절대 좌표로 취급합니다.
ABSOLUTE_ROTATION: 물체의 회전 위치를 절대 좌표 취급합니다. 수평한 축이 0이에요.
ABSOLUTE_SCALE: 물체의 크기를 절대적으로 취급합니다.
Fix 열거형은 믈체가 움직이는 것만 못하게 합니다. zia::Warp, zia::Rotate 등의 물체의 상태를 통째로 바꾸는 것은 막지 못합니다. 당신이 물체를 움직였지, 물체가 움직인 게 아니니까요.