길찾기 알고리즘 중 하나인 A* 알고리즘에 대해 알아보자. 단순히 2D 타일맵에만 적용할 수 있다고 생각했는데 원리를 알고보니 가중치로 연결된 그래프에 모두 적용할 수 있는 방법이었다. 복잡한 공간도 다각형으로 분할한다면 A* 알고리즘을 적용시켜서 길을 찾을 수 있다. A* 알고리즘은 닫힌 목록과 열린 목록이 있고, 이 두 목록을 갱신하면서 길을 찾아간다. 현재 위치에서 갈 수 있는 위치에 대해 G, F, Parent를계산해서 열린 목록에 넣고, 열린 목록에서 최소 F값을 가지고있는 위치를 닫힌 목록에 넣은 후 반복한다. G : 해당 위치로 이동하기 위해 필요한 비용 F : G + 해당 위치에서 목표지점까지의 예상거리 Parent : 해당 위치로 오기 직전 위치 간단한 2D 길찾기 예제를 통해서 원리를 ..
타일 위에서 자연스럽게 움직이는 Movement를 구현해보도록 하자. 엔진에서 제공하는 NavigationMesh를 사용해서 만들 수도 있지만 더 세밀한 개성을 주기 위해서 먼저 간단한 움직임을 직접 구현해본다. 타일 이동이기 때문에 상하좌우 4방향으로 움직일 수 있고, 한 칸씩 이동한다. 이 떄 입력이 연속적으로 발생해도 모두 기억하고 순차적으로 이동할 수 있도록한다. BlockMovement를 바로 구현하기 위해 기본적인 준비물이 몇가지 필요한데, 캐릭터 Mesh와 속도에따라 애니메이션을 재생하는 Blueprint, 그리고 기본적인 맵을 구성한다. 1. Queue 먼저 Controller에서 입력을 받으면 MovementComponent가 입력을 수신하고 Queue에 저장한다. 매 프레임 Queue를..
Linear Interpolation의 약자로 두 값을 선형보간한다. 두 값을 섞는다는 것이라고 생각하면 된다. 원리 입력받은 A, B를 보간하는데 Alpha 비율로 섞어서 계산한다. 수식은 아래와 같다. 예를들어 A = 10, B = 5, Alpha = 0.3 이라면 Lerp(A, B, Alpha)는 위 계산에 의해 8.5가 된다. 예제 float Lerp를 C++ 함수로 작성하면 아래와같이 작성할 수 있다. float Lerp(float A, float B, float Alpha) { return A * (1 - Alpha) + B * Alpha; } 활용 Material 계산에서 가장 많이 사용되는 것으로 보이는데 두 image를 blend해서 하나의 material로 만들어서 사용하기 때문이다. ..
3 match 게임에는 변수가 하나 있는데, 바로 다음에 나올 jewel의 종류가 불규칙적이고 새로 생성되는 jewel로 인해 어떤 연쇄작용이 일어날지 예상할 수 없다는 것이다.* 애니팡의 경우에는 적절한 계산을 통해 진행 불가능한 board가 나오지 않게 새로운 동물이 생성된다고 한다. 그래도 새로운 동물로 인한 연쇄작용은 예측하기 힘들다. 새로 생성되는 jewel이 일으키는 연쇄작용은 생성되는 jewel과 기존 jewel이 match를 이루는 경우이다.새로운 jewel이 바닥( 자신 index번호에 맞는 위치 )에 도달할 때 마다 그 jewel을 기준으로 match3검출을 수행하는 것은 별로 좋지 않은 방법인 것 같다. 4x2 범위에 있는 jewel이 모두 새로 생성되어 아래와 같은 board가 되었..
3 match 게임의 가장 핵심인 match알고리즘을 구현해보자. 이 글에서 구현하려고 하는 Match3 알고리즘은 Swap한 2개의 jewel을 대상으로 이루어지는 검사이며, 주의해야할 점은 다음과 같다.* match가 되어 jewel이 사라지더라도 실제로 화면에 사라지는 모션이 보여지기 전에는 죽는( 어휘력이 떨어져서 죽는다는 표현밖에 생각 못하겠다. )jewel 위에 있는 jewel이 아래로 떨어지지 않는다. ( 즉, 데이터의 변경이 모션이 끝난 후에 일어난다. )* 3개가 맞으면 재자리에서 죽는 모션이 보여지지만, Bejeweled를 기준으로 4개 이상 match가 되었을 때는 Swap했던 mainJewel을 기준으로 나머지 jewel들이 모이고 mainJewel은 승격된다.( 승격된 jewel은..
비주얼드, 애니팡 등으로 알려진 3 match 퍼즐게임을 만들기 위한 알고리즘을 만들어보자. 3 match 게임의 유일한 입력인 Swap을 먼저 구현보자. Swap은 터치 또는 마우스 입력을 받고 드래그를 감지하여 터치한 jewel과 드래그 한 방향의 jewel과 swap 되면서 이루어진다. Swap을 구현해야할 때 주의해야 할 특징은 다음과 같다.*입력을 한 즉시가 아닌 Swap Action( jewel이 실제로 화면에서 움직이는 행위 )이 이루어 지고 난 후 다음 동작( match 또는 rollback )이 이루어져야한다. *아래 코드들은 윈도우 애플리케이션 기준으로 작성한 코드이며, cocos2d-X엔진을 모티브로 작성한 엔진을 사용하여 실제 cocos2d-X 코드와 비슷하지만 내부적인 동작도 같은..
목표무조건 추격하는 미사일이 아닌 자연스럽게 타겟을 추격하는 미사일을 만든다. 이론방향 벡터를 점점 타겟 방향으로 회전시키면서 이동한다.시간이 지날수록 회전하는 속도가 빨라진다. 코드(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); // 현재 방향과 타겟으로의 방향과의 외적 (어느 방향으로..
// normal readFILE *f = fopen("file.bmp", "rb");unsigned char info[54];fread(info, sizeof(unsigned char), 54, f); int width = *(int*)&info[18];int height = *(int*)&info[22]; int size = 3*width*height; // for RGBunsigned char *data = new unsigned char[size];fread(data, sizeof(unsigned char), size, f);fclose(f); // bmp를 저장할 때 RGB가 아닌 BGR순으로 저장하기 때문for(int i=0; i int width = *(int*)&info[18];int he..
- Total
- Today
- Yesterday
- 수학
- SHADER
- swift
- winsock
- DesignPattern
- machine learing
- rxswift
- Java
- 자료구조
- Git
- mongoDB
- 드라마
- SOCKET
- 운영체제
- database
- game
- C/C++
- C
- OS
- C++
- ios
- SwiftUI
- JSP
- scala
- ue4
- 데이터베이스
- Spring
- Cocos2d-x
- 국내여행
- 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |