피격 대상을 관통하는 무기의 구현이나(관통 시 1프레임마다 피격 이벤트가 발생하지 않게), 2개 이상의 오브젝트가 약점으로 설정된 오브젝트의 구현에(N개 이상의 약점 부위 피격 시 데미지가 N배로 들어오지 않도록) 유용할 수 있다.


각각 피격될 오브젝트와, 공격 판정이 들어간 오브젝트의:
1. Create 이벤트에 아래 코드를 삽입한다.
hitdelaymap = ds_map_create();

2. Clean Up 이벤트에는 아래 코드를 삽입한다. (사용하지 않는 ds_map 삭제)
ds_map_destroy(hitdelaymap);

3. End Step 이벤트의 끝에 아래 코드를 삽입한다.
// map의 사이즈 검사
var mapsize = ds_map_size(hitdelaymap);
if (mapsize > 0)
{
	// map의 각 키 검사
	var mapkey = ds_map_find_last(hitdelaymap);
	for (var i = mapsize; i > 0; i--)
	{
		// 다음에 탐색할 key 저장
		var nextkey = ds_map_find_previous(hitdelaymap, mapkey);
		// 해당 key의 딜레이값 감소
		var temp = ds_map_find_value(hitdelaymap, mapkey);
		// 딜레이값이 0 이하이거나 key에 해당하는 인스턴스가 없으면 key 삭제
		if (((--temp) <= 0) || (!instance_exists(mapkey)))
		{
			ds_map_delete(hitdelaymap, mapkey);
		}
		else
		{
			// 감소된 딜레이값을 key 섹션에 저장
			ds_map_replace(hitdelaymap, mapkey, temp);
		}
		// key 탐색
		mapkey = nextkey;
	}
}

4. 각각의 피격 스크립트를 다음과 같이 감싼다.
if (!ds_map_exists(hitdelaymap, _hitid))
{
	(피격 스크립트 내용)
	ds_map_add(hitdelaymap, _hitid, 딜레이);
}

여기서 _hitid는 맞은 오브젝트의 id., 딜레이는 피격 딜레이.

Create, Clean Up, End Step 이벤트의 내용은 부모 오브젝트에 쓰고, 자식 오브젝트에서 상속받기 위해서는
event_inherited()

위 코드를 각 자식 오브젝트 내 이벤트 최상단에 삽입해야 한다.


by SHOOTING_STAR 2025. 11. 16. 20:58