-
Notifications
You must be signed in to change notification settings - Fork 0
튜토리얼 1. 함선 움직여 보기 (2)
자 그럼 빠르게 두번째 목표인 특정 위치로 함선을 움직여 보려합니다.
특정 위치로 움직이기전에, 극좌표를 알고 넘어가야 합니다.
극좌표(polar coordinate)란
기준점을 중심으로 한 점을 x,y가 아닌, 거리(r)와 각도(θ)로 표현하는 좌표계입니다. STARPOO에서는 각도로 degree 단위를 사용하고 있습니다. 위 그림과 같이, 원점을 중심으로 오른쪽 정방향이 0도이며 각도가 증가하면 반시계방향으로 회전하게 됩니다.
자 그럼 가장 쉽게 (0, 0)인 지점인 원점으로 함선을 이동시켜 보도록 하죠.
먼저 현재 함선의 위치를 가져와야겠죠?
STARPOO API 에서 제공하는 polarFrom({x, y, rot}, {x, y})
함수를 사용하면 쉽게 함선과 target 사이의 거리와 각도를 구할 수 있습니다.
polarFrom({x, y, rot}, {x, y})
함수의 반환값인 rot과 r은
-
r
: 첫번째 인자와 두번째 인자간의 거리를 의미하며, -
rot
: 첫번째 인자가 바라보고 있는 방향을 기준으로 두번째 인자와의 각도를 의미합니다.
지금 우리는 원점과 함선사이의 거리와 각도를 구할 것이기 때문에 첫번째 인자에 myShips[0]을, 두번째 인자에 {x: 0, y: 0}
를 넣어주면 됩니다. 따라서 현재 함선의 위치에서 원점까지 거리와 각도를 구하기 위해 아래와 같이 코드를 작성한 뒤 log를 살펴 봅시다.
function update(){
var pos = polarFrom(myShips[0], {x: 0, y: 0});
// 로그 찍어보기
log("rot : " + pos.rot);
log("r : " + pos.r);
}
자, 이제 우리는 현재 함선과 원점 사이의 거리와 각도를 알았습니다. 이 정보를 토대로 함선을 원하는 위치인 원점으로 이동시키려합니다. 이를 위해서 함선이 수행해야하는 일은 두가지로 볼 수 있습니다.
- 함선의 뱃머리를 목표지점으로 돌리기
- 함선을 목표지점에 도착하지 않았다면 전진
위의 두가지 수행을 토대로 코드를 작성하여 봅시다.
var b_once = true;
function update() {
var ship = myShips[0];
var destination = {x: 0, y: 0};
var pos = polarFrom(ship, destination);
// 함선을 목표지점에 도착하지 않았다면
if (pos.r > 0) {
myShips[0].setRotSpeed(pos.rot); // 1. 함선의 뱃머리를 목표지점으로 돌리기
myShips[0].setSpeed(shipMaxSpeed); // 2. 전진
}
// 목표 지점 도착
else
{
// 정지
myShips[0].setRotSpeed(0);
myShips[0].setSpeed(0);
if (b_once) {
b_once = false;
log("x : " + ship.x);
log("y : " + ship.y);
}
}
}
원점으로 가 멈추는 모습을 볼 수 있습니다.
그렇다면 위에서 작성한 script에 목적지만 (200, 700)으로 변경한 뒤 스크립트를 돌려 봅시다.
var b_once = true;
function update() {
var ship = myShips[0];
var destination = {x: 200, y: 700};
var pos = polarFrom(ship, destination);
...
}
정확한 점에 멈추지 않고 빙글빙글도는 모습을 보게됩니다.. 왜 이런걸까요?
이러한 현상의 원인을 아래와 같이 3가지 정도로 추려볼 수 있습니다.
1. 거리 오차 범위를 주지 않아서 2. 목표 지점에 거의 도착할때 감속하지 않아서 3. 마찬가지로 목표 각도에 거의 도착할때 각도 회전을 감속하지 않아서
var bonce = true;
function update() {
var ship = myShips[0];
var dest = {x: 200, y: 700};
var pos = polarFrom(ship, dest);
if (pos.r > 1) {
myShips[0].setRotSpeed(pos.rot / dt);
myShips[0].setSpeed(pos.r / dt);
}
else
{
myShips[0].setRotSpeed(0);
myShips[0].setSpeed(0);
if (bonce) {
bonce = false;
log("x : " + ship.x);
log("y : " + ship.y);
}
}
}