적과 환경을 감지하는 기능들입니다.
탱크 전방의 장애물/적까지의 거리를 측정합니다. 차체 정면 기준으로 스캔합니다.
let dist = this.scan();
if (dist < 100) {
this.fire(); // 100픽셀 내에 뭔가 있으면 발사
}
레이더 범위(400px) 내에 적 또는 아이템이 있을 때 자동으로 호출되는 함수입니다.
run() 제너레이터와 별개로 동작합니다.
적 목록 배열입니다. 가까운 순서대로 정렬되어 있어서 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 | 나 → 적 방향의 절대 각도. 포탑 조준 시 이 값 사용! |
아이템 목록 배열입니다. 가까운 순서대로 정렬되어 있습니다.
| 속성 | 타입 | 설명 |
|---|---|---|
type |
String | 아이템 종류 (예: "life_box") |
x |
Number | 아이템의 X 좌표 |
y |
Number | 아이템의 Y 좌표 |
distance |
Number | 나와의 거리 (픽셀) |
aimAngle |
Number | 나 → 아이템 방향의 절대 각도 |
💡 TIP: 포탑을 적 방향으로 돌릴 때는 aimAngle을 사용하세요!
bearing은 내 차체 기준 상대 방향이라 계산이 필요합니다.
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); // 멀면 확산탄
}
}
onScan(enemies) {
// 체력순 정렬 (낮은 순)
let weakest = enemies.sort((a, b) => a.energy - b.energy)[0];
this.turnGunTo(weakest.aimAngle);
this.fire();
}
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();
}
}
가장 최근 스캔된 적의 정보를 반환합니다. onHitWall 등의 이벤트 핸들러에서 적의 정보를 참조할 때 유용합니다.
{ enemies, time, age } 또는 null (감지된 적 없음)
enemies: 적 객체 배열 (onScan와 동일)time: 스캔된 시점의 절대 시간 (프레임)age: 스캔된 시점으로부터 경과한 시간 (프레임)
let scan = this.getLastScan();
if (scan && scan.age < 60) {
// 1초(60프레임) 이내의 정보라면 유효하다고 판단
let target = scan.enemies[0];
this.turnGunTo(target.aimAngle);
this.fire();
}
목표 지점까지의 각도와 거리를 계산합니다. 객체({x,y})를 넣어도 됩니다.
angleTo(x, y): 해당 점까지의 절대 각도 반환 (도)distanceTo(x, y): 해당 점까지의 거리 반환 (픽셀)
let angle = this.angleTo(enemy.x, enemy.y);
let dist = this.distanceTo(enemy); // 객체도 가능
this.log("적 방향: " + angle);
포탑의 현재 절대 각도를 반환합니다. this.gunAngle과 동일한 값입니다.
let heading = this.getGunHeading();
화면 콘솔에 메시지를 출력합니다. 디버깅용으로 유용합니다.
this.log("현재 위치: " + this.x + ", " + this.y);
this.log("적 발견! 공격 개시");
복잡한 전략 개발에 활용할 수 있는 고급 API입니다.
내 탱크에서 목표 좌표까지 장애물 없이 사격 가능한지 확인합니다.
if (this.checkLineOfSight(enemy.x, enemy.y)) {
this.fire(); // 장애물 없으면 발사
} else {
this.moveTo(enemy.x, enemy.y); // 가까이 접근
}
특정 좌표의 지형 정보를 확인합니다.
{ type, speedMultiplier, canMove, canShoot }
let t = this.getTerrainAt(300, 200);
if (t.type === 'WATER') {
this.log("물이다! 우회하자");
}
if (t.canMove) {
this.moveTo(300, 200);
}
맵 전체 정보를 반환합니다. 장애물 위치 파악에 유용합니다.
{ width, height, objects }
let map = this.getMapContext();
this.log("맵 크기: " + map.width + "x" + map.height);
// map.objects로 모든 장애물 정보에 접근 가능