스켈레탈 애니메이션의 뼈 상태 가져오기
스켈레탈 애니메이션은 여러 개의 "뼈"로 구성되어 있으며, 이 뼈들은 애니메이션 프로그램에서 정의되고 이름이 지정됩니다. skeleton_bone_state_get 함수는 특정 뼈의 데이터를 언제든지 가져오는 데 사용됩니다. 이 데이터는 애니메이션 세트에 따라 현재 스켈레톤의 포즈를 나타냅니다.
함수 설명
이 함수는 이전에 생성된 DS 맵을 필요로 하며, 호출 후 다음과 같은 키와 해당 값이 포함됩니다:
| 키 | 설명 |
|---|---|
| "x" | 부모 뼈에 대한 뼈의 로컬 x 위치 |
| "y" | 부모 뼈에 대한 뼈의 로컬 y 위치 |
| "angle" | 부모 뼈에 대한 뼈의 로컬 회전 |
| "xscale" | 부모 뼈에 대한 뼈의 로컬 수평 스케일 |
| "yscale" | 부모 뼈에 대한 뼈의 로컬 수직 스케일 |
| "worldScaleX" | 세계 스케일 X의 크기 (항상 양수, 읽기 전용) |
| "worldScaleY" | 세계 스케일 Y의 크기 (항상 양수, 읽기 전용) |
| "worldAngleX" | X 축에 대한 세계 회전 (읽기 전용) |
| "worldAngleY" | Y 축에 대한 세계 회전 (읽기 전용) |
| "worldX" | 세계 X 위치 (읽기 전용) |
| "worldY" | 세계 Y 위치 (읽기 전용) |
| "appliedAngle" | 스켈레톤 뼈를 포즈하기 위해 사용된 로컬 회전 |
| "parent" | 부모 뼈의 이름 (문자열) |
반환된 맵 데이터는 skeleton_bone_data_get()를 사용할 때 반환되는 기본 포즈와 유사하지만, 이제 "world" 키가 추가되었습니다. 이 값들은 스켈레탈 애니메이션 스프라이트의 루트(원점)에 대한 뼈의 위치를 나타내며, 내장 스프라이트 변수인 image_xscale 또는 image_angle로 설정된 스케일이나 회전을 고려하지 않습니다. 세계 값은 읽기 전용이며 설정할 수 없습니다.
함수 구문
skeleton_bone_state_get(bone, map);
인수 설명
| 인수 | 유형 | 설명 |
|---|---|---|
| bone | 문자열 | 뼈의 이름 (문자열) |
| map | DS 맵 | 뼈 데이터를 저장하는 (이전에 생성된) DS 맵 |
반환값
N/A
활용 예제
아래는 skeleton_bone_state_get 함수를 활용한 예제입니다.
var map = ds_map_create();
skeleton_bone_state_get("head", map);
var xx = ds_map_find_value(map, "worldX");
var yy = ds_map_find_value(map, "worldY");
var deltax = mouse_x - (x + xx);
var deltay = mouse_y - (y + yy);
var angle = -radtodeg(arctan2(deltay, deltax));
ds_map_replace(map, "angle", angle);
skeleton_bone_state_set("head", map);
ds_map_destroy(map);
위 코드는 DS 맵을 생성하고 "head"라는 이름의 뼈에서 데이터를 가져옵니다. 그런 다음 뼈의 세계 위치를 추출하고, 이 데이터를 사용하여 게임에서 마우스 위치를 추적하는 뼈의 "angle"을 설정합니다.
추가 활용 예제:
var map = ds_map_create();
skeleton_bone_state_get("arm", map);
var armAngle = ds_map_find_value(map, "angle");
var newAngle = armAngle + 10; // 10도 회전
ds_map_replace(map, "angle", newAngle);
skeleton_bone_state_set("arm", map);
ds_map_destroy(map);
var map = ds_map_create();
skeleton_bone_state_get("leg", map);
var legX = ds_map_find_value(map, "x");
var legY = ds_map_find_value(map, "y");
if (legY < 100) {
ds_map_replace(map, "y", legY + 5); // Y 위치를 5만큼 증가
}
skeleton_bone_state_set("leg", map);
ds_map_destroy(map);
이러한 예제들은 뼈의 상태를 가져오고 수정하는 방법을 보여줍니다.