티스토리 뷰

목표

무조건 추격하는 미사일이 아닌 자연스럽게 타겟을 추격하는 미사일을 만든다.


이론

방향 벡터를 점점 타겟 방향으로 회전시키면서 이동한다.

시간이 지날수록 회전하는 속도가 빨라진다.


코드(ex:Cocos2d-x)

void Bullet::update(float dt){

    auto pos = this->getPosition(); // 현재 위치 저장

    auto momoPos = momo->getPosition(); // 타겟의 위치

    Vec2 toDir = momoPos - pos;

    toDir = Normalize(toDir);   // 방향 단위벡터 계산

    float cross = (toDir.x*direction.y) - (toDir.y*direction.x);    // 현재 방향과 타겟으로의 방향과의 외적 (어느 방향으로 돌지 계산할때 사용)

    

    float angle = acosf((toDir.x*direction.x)+(toDir.y*direction.y));   // 벡터의 내각 (0~180 양수)

    if(cross > 0)   // 외적 값이 음수이면 시계방향으로 회전

        angle *= -1;

    

    direction.rotate(Vec2(0,0), angle*turnRadian*dt);   // 회전


    turnRadian += 5.0f * dt;    // 회전 속도 증가

//    if(turnRadian >= maxRadian)

//        direction = toDir;

    

    speed += momentum*dt;   // 이동

    if(speed.x >= maxSpeed.x)

        speed.x = maxSpeed.x;

    if(speed.y >= maxSpeed.y)

        speed.y = maxSpeed.y;

    

    pos.x += direction.x * speed.x * dt;

    pos.y += direction.y * speed.y * dt;

    

    this->setPosition(pos); // 이동한 위치 저장

}


결과



플레이어가 향하고 있는 방향 반대로 출발하여 둥글게 원을 그리며 목표 지점으로 들어온다.


'Programming > Algorithm' 카테고리의 다른 글

Lerp 연산 (Linear Interpolation)  (0) 2020.07.17
3 match game 알고리즘 : CrossCheck  (0) 2017.01.08
3 match game 알고리즘 : match3  (0) 2017.01.05
3 match game 알고리즘 : Swap  (3) 2017.01.03
bmp파일 읽기  (0) 2015.06.05
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함