
If 문장 저번에 얼마나 갔는지 체크를 했으니 이제 너무 멀리가면 반대방향으로 갈 차례이다. 블루프린트에서는 브랜치 문을 통해 할 수 있으며, C++에서는 If문에 해당한다. 우선 얼마나 멀리가면 반대방향으로 갈지 기준으로 잡을 거리를 100으로 초기화해주었다. 이제 기존의 얼마나 움직였는지를 체크하는 DistanceMoved 변수를 이용하여 if 문을 작성해준다. 이때 DistacneMoved를 지역변수로 바꾸고, 헤더파일에서 선언했던 것을 지워주었다. 만약 움직인 거리가 기준 거리 100을 넘기면 속력에 음수를 붙혀 반대방향으로 향하도록 해준다. 이 상태에서 컴파일을 하고 실행해보면, 앞뒤로 움직이는 모습을 볼 수 있다. 하지만 문제점이 있는데, 그것은 현재 플랫폼이 시작점을 조금 지나치며 움직인다는..
문제링크 : https://www.acmicpc.net/problem/11004 11004번: K번째 수 수 N개 A1, A2, ..., AN이 주어진다. A를 오름차순 정렬했을 때, 앞에서부터 K번째 있는 수를 구하는 프로그램을 작성하시오. www.acmicpc.net #include using namespace std; typedef long long ll; typedef pair pii; const int MAX = 987654321; int N, K, arr[5000001]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> N >> K; for(int i=1; i> arr[i]; sort(arr+1, arr+1+N); cout

범위 지정 연산자 현재 작성했던 의사코드 중에서 앞으로 이동하는 부분만 구현한 상태이다. 이제 뒤로 가는 것을 구현하게 된다. 우선 뒤로 가기 위해서 얼마나 이동했는 지 알 필요가 있으며, 이를 위해 필요한 것은 다음과 같다. 플랫폼 시작 위치 플랫폼이 이동한 거리 우선 시작 위치는 언리얼 상에서 굳이 알 필요가 없다. 따라서 UPROPERTY를 작성하지 않고 선언만 해주었다. 그리고 플랫폼이 이동한 거리는 언리얼 상에서 편집할 필요가 없다. 따라서 UPROPERTY(VisibleAnywhere)로 설정함으로써 보이게만 설정해준다. 그리고 해당 거리는 업데이트 된 것을 체크하기 위해 기본 값을 -1로 초기화해주었다. 그럼 이제 시작 위치를 얻을 차례이다. 시작 위치는 당연하게도 맨 처음 플레이를 했을 때..

속도와 델타타임(DeltaTime) 기존에는 속도를 직접 1을 더해주었지만, 속도 전용 변수를 만들어서 적용해준다. 이 과정에서 델타타임이라는 것을 이용해 이동 프레임률을 독립적으로 만드는 방법 또한 알아본다. 기존에는 직접 X 값에 대해서 1을 더하여 하나의 벡터에만 값을 더해주었다. 하지만 벡터에 다른 벡터를 추가할 수 있음을 이제 알기 때문에, 이를 이용하여 새롭게 벡터를 추가해준다. 초기화 값은 (100, 0, 0)으로 설정하였고, 추가로 Category라는 것을 생성하였다. EditAnywhere 옆에 있는 것을 볼 수 있는데, 말그대로 다음과 같은 ("Moving Platform") 카테고리를 생성한다는 것이다. 언리얼에 가서 Moving Plaftform을 보면, 디테일 패널에 위와 같이 M..
문제링크 : https://www.acmicpc.net/problem/9024 9024번: 두 수의 합 프로그램은 표준입력으로 입력을 받는다. 프로그램 입력은 t 개의 테스트 케이스로 구성된다. 입력의 첫 번째 줄에 테스트 케이스의 개수를 나타내는 정수 t 가 주어진다. 두 번째 줄부터 두 줄 www.acmicpc.net #include using namespace std; typedef long long ll; typedef pair pii; const int MAX = 987654321; int T, N, K, arr[1000001]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> T; while(T--) { cin >> N >> K; ..

함수 반환 값 이번에는 저번에 작성했던 의사코드를 구현을 하게 된다. 기존에 작성했던 코드를 지우고 함수 반환 값을 이용하여 구현을 시도 한다. 함수 반환 값을 이해하기 전에 잠깐 다음 두 가지 용어에 대한 개념을 이해할 필요가 있다. 첫 번째는 표현식(Expression)으로 값을 생성하는 코드 조각에 해당한다. 다음으로 문(Statement)으로 수행되어야할 동작을 의미한다. 이 두 가지는 관련되어있으며, 거의 항상 표현식은 동작을 실행시켜야할 때 코드 조각의 값을 계산하기 위해 포함된다. 하지만 반대로 문은 통해 값이 나타나지는 않는다. 다음 표현식의 예시를 살펴보자. MyVector LocalVector.Z + 100 GetActorLocation() C++에서 MyVector를 입력하면 해당 변..

의사코드 VScode 코딩하는 화면을 보다보면, 함수위에 //와 함께 초록색으로 적힌 텍스트를 볼 수 있다. 해당 코멘트는 주석이라고 하며, 컴파일러에서 무시하는 코드이다. // 뒤에 작성하는 내용은 주석처리되며, 초록색으로 작성되는 것을 볼 수 있다. 이러한 주석을 이용하여 앞으로 어떠한 것을 구현하려는지 참조할 수 있는 의사 코드를 작성할 수 있다. 현재 움직이는 플랫폼은 오른쪽으로 밖에 움직이지 않는다. 우리는 앞으로 앞뒤로 움직이는 플랫폼을 만들 예정이다. 이를 의사 코드를 이용해 어떻게 구현할지 미리 다음과 같이 작성해볼 수 있다.
문제링크 : https://www.acmicpc.net/problem/3020 3020번: 개똥벌레 개똥벌레 한 마리가 장애물(석순과 종유석)로 가득찬 동굴에 들어갔다. 동굴의 길이는 N미터이고, 높이는 H미터이다. (N은 짝수) 첫 번째 장애물은 항상 석순이고, 그 다음에는 종유석과 석순이 www.acmicpc.net #include using namespace std; typedef long long ll; typedef pair pii; const int MAX = 987654321; int N, H, arr1[200001], arr2[200001]; int result = MAX, result_cnt; int main() { ios_base::sync_with_stdio(0); cin.tie(0)..

로컬 변수 (지역 변수) 우리가 여태 사용해온 변수들은 클래스 변수이다. 클클래스 변수는 클래스의 인스턴스가 있는 한 유지된다. 변수가 유지되는 기간을 스코프라 하며, 클래스의 인스턴스만큼 유지되는 것 이외에도 함수만큼 유지되는 경우도 있다. 로컬 변수는 후자에 해당하게 된다. 로컬 변수는 함수 내에서만 존재하고, 함수를 호출할 때 마다 초기화가 된다. 먼저 다음과 같이 값을 할당해보았다. 기존의 MyVector의 경우 매 프레임마다 Y 값을 계속 더해줌으로써 우측으로 이동했지만, LocalVector의 경우 매 프레임마다 Z 값을 계속 더해줘도 위로 이동하지 않는다. 매 프레임마다 (1, 2, 3)의 위치로 초기화를 진행하고 Z 값을 1을 더해주는 것이기 때문에, Z 값을 더해준다 한들 다시 (1, 2..

Tick 움직이는 플랫폼을 위해서는 Tick 함수를 알아야 한다. Tick 함수를 이해하기 위해서는 대부분의 게임 엔진을 구축하는 게임 루프 과정을 우선 알 필요가 있다. 1. 게임 엔진이 플레이어의 인풋을 가져옴 (스페이스바, 마우스 버튼 등) 2. 위 정보를 이용해 게임 상태를 업데이트 (플레이어 이동, 공 튀어오름 등) 3. 게임 엔진에서 게임 상태를 가져와 화면에 렌더링 렌더링을 통해 일련의 숫자들이 화면에 표시될 이미지로 바뀌며, 이러한 이미지가 프레임이다. 동영상을 구성하는 그림 중에서 그림 하나가 프레임이라고 생각하면 된다. 이러한 프레임을 초당 얼마나 많이 나타낼 수 있는가를 프레임률(FPS)이라고 한다. 컴퓨터가 1초당 통과할 수 있는 게임 루프의 수이자, 인풋을 처리하고 상태를 업데이트..
문제링크 : https://www.acmicpc.net/problem/7795 7795번: 먹을 것인가 먹힐 것인가 심해에는 두 종류의 생명체 A와 B가 존재한다. A는 B를 먹는다. A는 자기보다 크기가 작은 먹이만 먹을 수 있다. 예를 들어, A의 크기가 {8, 1, 7, 3, 1}이고, B의 크기가 {3, 6, 1}인 경우에 A가 B를 먹을 www.acmicpc.net #include using namespace std; typedef long long ll; typedef pair pii; const int MAX = 987654321; int T, A, B; int arr1[20001], arr2[20001]; int main() { ios_base::sync_with_stdio(0); cin...

C++에서 함수 호출하기 저번에는 구조체를 사용해 위치를 직접 할당해줬지만, 이번에는 함수를 호출하여 위치를 지정해준다. 블루 프린트에서 SetActorLocation이라는 함수를 사용했던 것을 기억할 것이다. C++에서도 같은 함수를 사용하며, 인수라고 불리는 인풋을 받는다. FVector로 할당했던 1, 2, 3을 생성자를 통해 직접 할당해줄 수 있다. 컴파일 후 언리얼로 돌아가서 확인을 해보는데, 현재 MovingPlatform2 액터에는 컴포넌트가 존재하지 않는다. 따라서 사실상 위치를 가질 수 없는 상태이다. 이를 위해 컴포넌트로 큐브를 추가해주었다. 우리는 FVector(1, 2, 3)의 값을 FVector 타입 변수인 MyVector에 저장했었다. 따라서 SetActorLocation에 FV..

C++에서 구조체 사용하기 전 강의를 통해 간단한 변수를 사용해보았지만 벡터나 트랜스폼 같이 더 복잡한 유형은 어떻게 해야할까? 과정은 변수를 선언할 때와 거의 동일하다. 마찬가지로 언리얼에 노출시키기 위해 UPROPERTY(EditAnywhere)를 작성해주고, 이번에는 FVector 타입을 선언한다. 블루프린트에서 다뤘던 벡터를 이렇게 다루는데, 여기서 맨앞에 작성한 F는 구조체를 뜻한다. 앞서 MovingPlatform2에 A를 붙여 액터를 나타낸 것과 같은 방식이다. 값을 할당할 때에는 기존 변수 때와는 달리, 새 구조체나 클래스 값을 만드는 생성자가 필요하다. 생성자는 항상 데이터 타입과 이름이 같으며, 테스트로 X, Y, Z에 대해 각각 1, 2, 3을 할당해보았다. 이렇게 만든 값을 다른 값..
문제링크 : https://www.acmicpc.net/problem/2343 2343번: 기타 레슨 강토는 자신의 기타 강의 동영상을 블루레이로 만들어 판매하려고 한다. 블루레이에는 총 N개의 강의가 들어가는데, 블루레이를 녹화할 때, 강의의 순서가 바뀌면 안 된다. 순서가 뒤바뀌는 경 www.acmicpc.net #include using namespace std; typedef long long ll; typedef pair pii; const int MAX = 987654321; int N, M, arr[100001]; int l, r; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> N >> M; for(int i=0; i> arr[..

C++ 파일 및 BeginPlay 저번 강의를 통해 C++ 변수를 선언해주었지만, 아직 기능을 실행하는 방법은 모른다. 이번엔 간단한 기능을 테스트해보게 된다. 블루프린트에서 BeginPlay를 기억할 것이다. Vscode에서 cpp 파일을 보면 마찬가지로 BeginPlay 항목이 존재한다. 블루 프린트 때와 마찬가지로 실행시에 해당 항목을 적용한다는 것이다. 우선 간단하게 전에 만들었던 MyInt의 값을 게임 플레이 시에 9로 바뀌도록 해보자. 단순히 MyInt에 9를 할당해주면 된다. 이제 언리얼로 돌아가 플레이를 누르면 MyInt의 값이 9로 바뀌어있다. 이번엔 할당이 아니라 간단한 덧셈을 테스트해보자. 이를 위해 입력받는 값 A, B와 결과값 APlusB를 선언해주었다. 이를 cpp 파일에서 단순..