전체 글 35

[Physics] 2D 충돌 감지 구현하기 (2D Collision Detection) - Part 2

지난 번에 이어, Part 2입니다. 기본적인 구성 요소는 Part 1에서 모두 구현했기 때문에, 이번에 다룰 내용은 Part 1의 간단한 응용에 지나지 않습니다. 1. RoundRect 모서리가 둥근 사각형을 구현하기 위해서는 우리가 잘 아는, 이미 정의된 도형들로 Decomposition을 해줄 필요가 있습니다. 오늘 다룰 두 가지 도형들은 모두 이렇게 decomposition이 필요합니다. RoundRect같은 경우에는 이 과정이 매우 간단한 편에 속합니다. 사각형의 width와 height, 네 귀퉁이에 그릴 원의 반지름 r은 사용자가 결정하게끔 해줍시다. 전체 너비 및 높이의 합이 width + r, height + r이 되도록 속성을 분리해줘도 좋고, 전체 너비 및 높이를 width, heig..

C++/Game 2022.04.10

[Physics] 2D 충돌 감지 구현하기 (2D Collision Detection) - Part 1

안녕하세요. 오늘은 C++로 2D 충돌 처리를 구현해봅시다. Part 1에서는 AABB, 원, 볼록 다각형을 구현해보고 Part 2에서는 요걸 응용해서 RoundRect나 오목 다각형도 만들어 볼겁니다. Reference - https://gamedevelopment.tutsplus.com/series/how-to-create-a-custom-physics-engine--gamedev-12715 How to Create a Custom Physics Engine - Envato Tuts+ Game Development Tutorials There are many reasons you might want to create a custom physics engine: first, learning and ho..

C++/Game 2022.04.09

[BOJ/C++] shake! 2021 E ~ I번 (BOJ 24232, 24233, 24234, 24235, 24236)

오랜만의 포스팅입니다. 하던 일에 진전이 별로 없었기 때문에 포스팅할 것도 없네요. 이번엔 2021 shake의 나머지 문제를 모두 풀어봤습니다. 억까 때문에 스트레스가 쌓여서 PS는 이제 그만 건드릴까 생각 중입니다. 이전 문제들 (A ~ D번)은 여기에서 확인하실 수 있습니다. BOJ 24232. 망가진 나무 문제 링크 : https://www.acmicpc.net/problem/24232 24232번: 망가진 나무 첫째 줄에 뒤집어야하는 간선을 $N-1$자리 이진수로 출력한다. 왼쪽에서 $i$번째 비트는 $i$번째 간선을 뒤집어야 하면 1, 아니면 0이다. 이진수에 등장하는 1의 개수가 최소가 되도록 해야 한다. www.acmicpc.net 풀이 : 2021 shake의 E번, F번, G번, I번 ..

C++/PS 2022.03.12

[게임 프레임워크 개발 일지] #5 Multi Style이 적용된 Text

SFML에서의 텍스트는 Text 클래스를 사용하면 되지만, 그대로 쓰기에는 문제점이 있습니다. 첫 번째 문제는, 스타일이나 색깔을 객체 하나 당 하나씩만 쓸 수 있다는 점입니다. 보통 여러 개의 스타일을 혼합해서 쓸 수 있게 해주는 텍스트를 RichText라고 부르는 데, SFML에는 기본적으로 이런 RichText가 존재하지 않습니다. 그러니 직접 만들어야 합니다. Text에 스타일을 하나만 적용할 수 있다고 했으니, Text 객체를 여러 개 만들어서 처리해야 합니다. 여간 귀찮은 일이 아니군요. 그래서 전지전능한 구글에 검색해서 누군가가 미리 만든 것을 github에서 찾을 수 있었습니다. source: https://github.com/skyrpex/RichText 이 RichText는 스타일과 텍..

C++/Game 2022.02.18

[게임 프레임워크 개발 일지] #4 Entity와 Component

ECS를 정석대로 구현하면, Component는 Entity의 tag 역할만 수행하고, 실제 상호작용은 System에서 이루어집니다. 다만 이러한 ECS가 나를 위한 해답이 될지는, 경우에 따라 다릅니다. 저같은 경우에도, Component에 기능을 조금 추가할 필요가 있었습니다. 처음 설계에 Renderable을 Component에 추가했기 때문에, (이게 좋지 않은 방향이어서 그랬는지는 몰라도) 그래픽 포인터를 안전하게 할당하기 위한 함수를 정의했습니다. 이번 포스팅에서는 Entity와 Component 관련 파트를 만들면서 사용한 방법을 정리하겠습니다. 처음 윈도우 창 (이하 Window)을 정의할 때는 Component로 정의했습니다. 시스템 관련으로 Component를 더 정의할 가능성이 있다고..

C++/Game 2022.02.06

[BOJ/C++] shake! 2021 A ~ D번 (BOJ 24228, 24229, 24230, 24231)

요즘 너무 바쁘다. 게임 엔진 건드릴 시간이 없다... 아무튼, shake 2021의 문제를 풀어봤습니다. Open Contest에서는 D번까지 풀었고, 그 뒤로는... 나중에 풀어봐야겠습니다. 시간이 부족행 BOJ 24228. 젓가락 문제 링크 : https://www.acmicpc.net/problem/24228 24228번: 젓가락 두 개의 정수 $N, R$이 주어진다. $(1 ≤ N,R ≤ 10^{18})$ www.acmicpc.net 풀이 : 젓가락이 한 쌍 완성되기 위한 최악의 경우는, 모든 젓가락을 하나씩 뽑은 뒤에 아무 젓가락이나 하나 뽑는 경우입니다. 이 때 뽑는 갯수는 $N + 1$개입니다. 그 이후엔 방금 완성한 한 쌍을 다시 뽑는 경우 (2개)와, 나머지 젓가락 중 한 쌍을 완성하는..

C++/PS 2022.01.21

[BOJ/C++] 23744. 알고리즘 과외

문제 링크 : https://www.acmicpc.net/problem/23744 23744번: 알고리즘 과외 지환이(롸롸롸롸)가 운영하는 알고리즘 학원에는 $N$명의 학생이 있고, 각 학생은 $1$부터 $N$까지의 번호를 가지고 있다, 알고리즘 학원에서는 학생의 수준을 나타내기 위해 레이팅 시스템을 www.acmicpc.net 1. 설명 N명의 학생이 있고, 각각 레이팅 값이 있습니다. 레이팅 차가 최대가 되도록 2명을 뽑아 그 차를 구해야 하는데, 학생마다 짝이 될 수 있는 학생 번호의 구간이 다릅니다. 2. 풀이 더보기 2021 서강대 프로그래밍 대회에서 출제된 문제입니다. 공식 홈페이지에 풀이가 있습니다. $i$번째 학생과 짝을 이룰 수 있는 학생 번호의 구간은 $[i - r_i, i - l_i]..

C++/PS 2022.01.05

[게임 프레임워크 개발 일지] #3 EventManager 설계

제가 생각한 EventManager의 구조는 이렇습니다. 1] Event Type은 sf::Event와 sf::String 두 가지이다. sf::Event는 기본적인 시스템 이벤트에, sf::String은 커스텀 이벤트에 해당합니다. 두 가지 클래스를 한 컨테이너에 넣어두기는 힘들기 때문에, 각각에 대한 컨테이너를 만들어야 했습니다. 2] Event Type에 따라 Event는 여러 개 사용할 수 있다. 하나씩만 사용했다간 분명 문제가 있을 것 같아서 컨테이너를 더 끼워넣었습니다. 각 이벤트 함수에 대한 ID는 심플하게 unsigned int로 했습니다. 그냥 int를 사용해도 됐는데, 음... 왜 이랬는지는 기억 안남. 함수 객체에 대한 ID를 생성해서 Event 객체만 제시하면 알아서 추가/삭제가 가..

C++/Game 2021.12.31

[BOJ/C++] 17476. 수열과 쿼리 28

문제 : https://www.acmicpc.net/problem/17476 17476번: 수열과 쿼리 28 길이가 N인 수열 A1, A2, ..., AN이 주어진다. 이때, 다음 쿼리를 수행하는 프로그램을 작성하시오. 1 L R X: 모든 L ≤ i ≤ R에 대해서 Ai = Ai + X를 적용한다. 2 L R: 모든 L ≤ i ≤ R에 대해서 Ai = ⌊√A www.acmicpc.net 1. 설명 길이가 $N$인 수열 $A$에 대해 3개의 쿼리를 실행해야 합니다. 이때 $N \le 100000$이고, 총 쿼리 수 $Q \le 100000$입니다. 1 L R X : $L \le i \le R$인 모든 $A_i$에 대해 $A_i = A_i + X$를 실행한다. 2 L R : $L \le i \le R$인 ..

C++/PS 2021.12.27

[BOJ/C++] 13263. 나무 자르기

문제 : https://www.acmicpc.net/problem/13263 13263번: 나무 자르기 첫째 줄에 n(1 ≤ n ≤ 100,000)이 주어진다. 둘째 줄에는 a1, a2, ..., an이, 셋째 줄에는 b1, b2, ..., bn이 주어진다. (1 ≤ ai ≤ 109, 0 ≤ bi ≤ 109) a1 = 1이고, bn = 0이며, a1 b2 > ... > bn을 만족 www.acmicpc.net 1. 설명 나무를 자를 때마다 전기톱을 충전해야 합니다. $i$번째 나무의 높이는 $a_i$이고, 전기톱을 충전하는 비용은 완전히 자른 (높이가 0인) 나무 중 가장 높은 번호를 $j$라고 할 때 $b_j$입니다. 이 때 모든 나무를 자르기 위한 총 충전 비용..

C++/PS 2021.12.22