◀ 돌아가기 (Main)

📡 Sensing API

적과 환경을 감지하는 기능들입니다.

scan()

탱크 전방의 장애물/적까지의 거리를 측정합니다. 차체 정면 기준으로 스캔합니다.

let dist = this.scan();
if (dist < 100) {
    this.fire(); // 100픽셀 내에 뭔가 있으면 발사
}

onScan(enemies, items)

레이더 범위(400px) 내에 적 또는 아이템이 있을 때 자동으로 호출되는 함수입니다.
run() 제너레이터와 별개로 동작합니다.

📦 Param 1: enemies (Array)

적 목록 배열입니다. 가까운 순서대로 정렬되어 있어서 enemies[0]이 가장 가까운 적입니다.

속성 타입 설명
x Number 적의 X 좌표 (가로 위치)
y Number 적의 Y 좌표 (세로 위치)
distance Number 나와의 거리 (픽셀)
energy Number 적의 남은 체력 (0~100)
name String 적의 이름
team Number 적의 팀 번호
angle Number 차체가 바라보는 방향 (절대 각도)
gunAngle Number 포탑이 바라보는 방향 (절대 각도)
bearing Number 내 차체 기준 상대 각도 (-180~180). 음수=왼쪽
aimAngle Number 나 → 적 방향의 절대 각도. 포탑 조준 시 이 값 사용!

🎁 Param 2: items (Array)

아이템 목록 배열입니다. 가까운 순서대로 정렬되어 있습니다.

속성 타입 설명
type String 아이템 종류 (예: "life_box")
x Number 아이템의 X 좌표
y Number 아이템의 Y 좌표
distance Number 나와의 거리 (픽셀)
aimAngle Number 나 → 아이템 방향의 절대 각도

💡 TIP: 포탑을 적 방향으로 돌릴 때는 aimAngle을 사용하세요!
bearing은 내 차체 기준 상대 방향이라 계산이 필요합니다.

🎯 예제 1: 기본 공격

onScan(enemies) {
    let target = enemies[0]; // 가장 가까운 적
    
    this.log("적 발견: " + target.name);
    this.log("거리: " + Math.round(target.distance) + "px");
    
    // aimAngle로 포탑 조준!
    this.turnGunTo(target.aimAngle);
    
    // 거리에 맞는 미사일 선택
    if (target.distance < 150) {
        this.fire('A');  // 가까우면 집중탄
    } else {
        this.fire('B', target.distance);  // 멀면 확산탄
    }
}

🎯 예제 2: 약한 적 우선 공격

onScan(enemies) {
    // 체력순 정렬 (낮은 순)
    let weakest = enemies.sort((a, b) => a.energy - b.energy)[0];
    
    this.turnGunTo(weakest.aimAngle);
    this.fire();
}

🎯 예제 3: 위험 감지 회피

onScan(enemies) {
    let enemy = enemies[0];
    
    // 적 포탑이 나를 향하고 있는지 확인 (±30도 이내)
    let aimingAtMe = Math.abs(enemy.gunAngle - enemy.aimAngle) < 30;
    
    if (aimingAtMe && enemy.energy > 30) {
        this.log("위험! 회피 기동!");
        this.moveToAndAim(this.x + 100, this.y, enemy.x, enemy.y);
    } else {
        this.turnGunTo(enemy.aimAngle);
        this.fire();
    }
}

getLastScan()

가장 최근 스캔된 적의 정보를 반환합니다. onHitWall 등의 이벤트 핸들러에서 적의 정보를 참조할 때 유용합니다.

let scan = this.getLastScan();
if (scan && scan.age < 60) {
    // 1초(60프레임) 이내의 정보라면 유효하다고 판단
    let target = scan.enemies[0];
    this.turnGunTo(target.aimAngle);
    this.fire();
}

angleTo(x, y) / distanceTo(x, y)

목표 지점까지의 각도와 거리를 계산합니다. 객체({x,y})를 넣어도 됩니다.

let angle = this.angleTo(enemy.x, enemy.y);
let dist = this.distanceTo(enemy); // 객체도 가능
this.log("적 방향: " + angle);

getGunHeading()

포탑의 현재 절대 각도를 반환합니다. this.gunAngle과 동일한 값입니다.

let heading = this.getGunHeading();

log(message)

화면 콘솔에 메시지를 출력합니다. 디버깅용으로 유용합니다.

this.log("현재 위치: " + this.x + ", " + this.y);
this.log("적 발견! 공격 개시");

🧪 고급 감지 기능

복잡한 전략 개발에 활용할 수 있는 고급 API입니다.

checkLineOfSight(targetX, targetY)

내 탱크에서 목표 좌표까지 장애물 없이 사격 가능한지 확인합니다.

if (this.checkLineOfSight(enemy.x, enemy.y)) {
    this.fire(); // 장애물 없으면 발사
} else {
    this.moveTo(enemy.x, enemy.y); // 가까이 접근
}

getTerrainAt(x, y)

특정 좌표의 지형 정보를 확인합니다.

let t = this.getTerrainAt(300, 200);
if (t.type === 'WATER') {
    this.log("물이다! 우회하자");
}
if (t.canMove) {
    this.moveTo(300, 200);
}

getMapContext()

맵 전체 정보를 반환합니다. 장애물 위치 파악에 유용합니다.

let map = this.getMapContext();
this.log("맵 크기: " + map.width + "x" + map.height);
// map.objects로 모든 장애물 정보에 접근 가능