티스토리 뷰
목표
무조건 추격하는 미사일이 아닌 자연스럽게 타겟을 추격하는 미사일을 만든다.
이론
방향 벡터를 점점 타겟 방향으로 회전시키면서 이동한다.
시간이 지날수록 회전하는 속도가 빨라진다.
코드(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
- 자료구조
- SHADER
- scala
- machine learing
- 알고리즘
- mongoDB
- DesignPattern
- Cocos2d-x
- 국내여행
- ue4
- SOCKET
- C/C++
- JSP
- Java
- 운영체제
- rxswift
- game
- 드라마
- 데이터베이스
- swift
- 수학
- C
- SwiftUI
- OS
- winsock
- Git
- Spring
- C++
- ios
- database
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |