Array
앞서 살펴봤던 EUDVariable은 변수는 기본적으로 하나의 값만 저장할 수 있습니다. 예를 들어, 디펜스게임의 라운드별 적 체력을 변수로 관리한다고 할 때 var round1_hp = 90;처럼 숫자 하나만 담을 수 있죠. 하지만 라운드가 1~2개도 아니고 50라운드 이상의 적 체력은 매번 변수를 만들 수 없습니다. 이렇게 여러 개의 데이터를 하나로 묶어 다뤄야 하는 상황이 많습니다.
이러한 문제를 해결하기 위해 등장한 것이 바로 배열(array) 자료형입니다. 배열은 여러 개의 값을 하나의 변수에 순서대로 저장할 수 있도록 도와주는 자료구조입니다.
EUDArray와 EUDVArray
epScript에서는 크게 두 가지 종류의 배열을 제공합니다. 이 두 배열은 각각 다른 방식으로 동작하며, 상황에 따라 적절한 것을 선택해 사용해야 합니다.
EUDArray: 메모리 직접 접근 방식
EUDArray는 스타크래프트의 메모리에 직접 접근하는 방식의 배열입니다. 데스테이블(Death Table)과 같은 방식으로 게임 메모리에 값을 직접 저장하고 수정합니다.
EUDArray 특징
- 빠른 쓰기 속도
- 메모리에 직접 접근하기 때문에 값을 쓰거나 수정하는 속도가 매우 빠릅니다.
- 특히
++,--,==같은 기본적인 연산이 매우 효율적입니다.
- 느린 읽기 속도
- 값을 읽을 때는 2진 트리 구조를 탐색해야 하므로 상대적으로 느립니다.
- 자주 읽어야 하는 데이터는 EUDVArray를 고려해보세요.
실제 사용 예시:
const landTimer = EUDArray(50); // 50개의 구역 타이머
function updateLandTimer() {
// 모든 구역의 타이머를 매 프레임마다 감소
for (var i=0; i<landTimer.length; i++) {
if (landTimer[i] > 0) {
landTimer[i] -= 1; // 빠른 감소 연산
}
}
}
EUDVArray: 트리거 기반 가상 변수
EUDVArray는 여러 개의 EUDVariable을 하나로 묶은 형태입니다. 각 요소가 독립적인 트리거 변수로 동작하여, 값을 읽고 쓰는 방식이 EUDArray와는 완전히 다릅니다.
EUDVArray 특징
-
빠른 읽기 속도
- 각 요소가 독립된 트리거 변수이므로 값을 읽는 속도가 매우 빠릅니다.
- 자주 값을 확인하거나 표시해야 하는 데이터에 적합합니다.
-
상대적으로 느린 쓰기
- 값을 수정할 때는 트리거를 통해야 하므로 EUDArray보다는 느립니다.
- 하지만 읽기가 많은 상황에서는 전체적인 성능이 더 좋을 수 있습니다.
실제 사용 예시:
const heroEPD = EUDVArray(8)(); // 8명의 플레이어의 영웅유닛을 위한 배열
function checkHeroHP(cp) {
// 여기서 heroEPD는 아래 상황처럼 write보다는 read로 자주 사용하게 됩니다.
// 영웅이 사망하여 새로운 유닛이 할당되기 전까지는 write가 실행되지 않기 때문입니다.
const hp = dwread_epd(heroEPD[cp] + 0x08/4);
if (hp == 0 || hp > 0x7FFFFFFF) {
// 체력이 0이거나 음수이면 false
return false;
}
return true;
}
언제 무엇을 사용해야 할까?
| EUDArray를 쓰면 좋은 경우 | EUDVArray를 쓰면 좋은 경우 |
|---|---|
| 값을 자주 수정하는 경우 (타이머, 카운터 등) | 값을 자주 읽어야 하는 경우 |
| 대량 데이터를 저장할 때 | 플레이어별 상태를 관리할 때 |
| 비교 연산이 많은 경우 | 데이터를 자주 표시하거나 계산에 활용할 때 |
PVariable
PVariable은 사실 EUDVArray(8)()와 완전히 동일한 자료형입니다.
EUDVArray(8)을 사용하게 됩니다. 이런 패턴이 매우 흔하기 때문에 epScript에서는 이를 PVariable이라는 별도의 타입으로 제공하여 코드를 더 직관적으로 작성할 수 있게 해줍니다.