튜토리얼 2. 적 함선에 레이저 발사해보기 (2) - GameEgg/STARPOO-II GitHub Wiki

# 목차

  1. 적 함선 탐색하기
  2. 적 함선에 레이저 쏘기

레이저를 쏘자!

#코드 정리

우리의 인공지능에 새로운 기능을 추가하기에 앞서, 기존의 기능을 함수로 정리해봅시다.

저번 튜토리얼에서 만든 로직을 searchEmeny 라는 함수로 분리하고, 이번에 만드는 로직은 attackEnemy라고 명명합시다.

만약 발견한 적이 있다면, searchEnemy를 중지하고 attackEnemy로 돌입하게 됩니다.

아래는 코드 전문입니다.

function update(){

	myShips.forEach(function(myShip,index){
		if(enemyShips.length == 0)
			searchEnemy(myShip,index);
		else
			attackEnemy(myShip);
	});
}

function searchEnemy(myShip,index){
	var targetDegree = index * 360 / myShips.length;
	var targetR = groundRadius * 0.8;

	var targetPoint = cartesian({r:targetR,rot:targetDegree});
	var polarFromShip = polarFrom(myShip,targetPoint);

	myShip.setRotSpeed(polarFromShip.rot/dt);
	myShip.setSpeed(polarFromShip.r / dt);
}

function attackEnemy(myShip){
}

#적을 조준하자

우리는 단순하게, 적 함선의 배열에서 첫 번째로 들어있는 배를 타겟으로 삼도록 합시다.

타겟을 삼은 배를 바라보는 것은 저번 튜토리얼에서 했던 것과 다를 것이 없습니다.

우선 배의 속력을 0으로 만들어 멈추고, 적을 바라보도록 아래와 같이 코드를 작성합니다.

function attackEnemy(myShip){
	myShip.setSpeed(0);
	
	var targetPoint = enemyShips[0];
	var polarFromShip = polarFrom(myShip,targetPoint);
	myShip.setRotSpeed(polarFromShip.rot/dt);
}

바라봤으니, 쏘는 일만 남았습니다. 쏴봅시다.

바라보는 각이 적을 향하고 있다면 발사. 간단한 코드입니다.

if(Math.abs(polarFromShip.rot) < 0.01){
	myShip.shoot(shipMaxHp/2);
}

#완성!

맵 전체로 흩어져 적을 탐색하고, 적을 발견하면 조준해 격추하는 인공지능이 완성되었습니다.

완성된 ai 전문은 아래와 같습니다.

function update(){

	myShips.forEach(function(myShip,index){
		if(enemyShips.length == 0)
			searchEnemy(myShip,index);
		else
			attackEnemy(myShip);
	});
}

function searchEnemy(myShip,index){
	var targetDegree = index * 360 / myShips.length;
	var targetR = groundRadius * 0.8;

	var targetPoint = cartesian({r:targetR,rot:targetDegree});
	var polarFromShip = polarFrom(myShip,targetPoint);

	myShip.setRotSpeed(polarFromShip.rot/dt);
	myShip.setSpeed(polarFromShip.r / dt);
}

function attackEnemy(myShip){
	myShip.setSpeed(0);

	var targetPoint = enemyShips[0];
	var polarFromShip = polarFrom(myShip,targetPoint);
	myShip.setRotSpeed(polarFromShip.rot/dt);

	if(Math.abs(polarFromShip.rot) < 0.01){
		myShip.shoot(shipMaxHp/2);
	}
}

판저 포!

#생각해보기

위 스크린샷을 보면, 적을 향해 쏜 레이저가 아군에게 대미지를 주고 있습니다.

어떻게 하면 아군을 쏘지 않고, 적군만 공격할 수 있을까요?

어떻게 하면 더 효과적인 진형을 잡을 수 있을까요?

어떻게 하면 더 안전하게 정찰할 수 있을까요?

이제부터는 여러분의 몫입니다.