전체 글 169

[WinAPI] 더블 버퍼링

최근에 만들 윈도우 API 프로그램입니다. 방향키를 누르면 사각형이 이동합니다. 그런데 이동을 하면 잔상이 남는 모습을 볼 수 있습니다. 그림을 그리는 것은 모니터의 픽셀 버퍼에 원하는 값을 저장하는 형식으로 진행됩니다. 우리가 이전 버퍼를 지워주지 않았으니 이렇게 잔상이 남는 것이죠. 이런 식으로 매우 큰 흰색 사각형을 그려줘서 지워주는 건 어떨까요? 아마 매우 빠르게 깜빡 깜빡 거릴겁니다. 이게 왜 그렇냐면 그리기 버퍼를 단 1개만 사용해서 그렇습니다. 컴퓨터가 아무리 빨라도 화면에 픽셀을 하나하나 그려서 모두 그리는데 시간이 걸리겠죠? 저 코드를 넣어주면, 컴퓨터가 원하는 그림을 먼저 싹 그린 다음에 흰 색 큰 사각형을 싹 그려주고.. 를 반복합니다. 그러면 깜빡깜빡 거린다는 거죠. 깜빡이는 이유는..

Window API 2024.02.01

[WinAPI] DeltaTime

이런 오브젝트가 있다고 해봅시다. 이 오브젝트는 방향키를 누르면 상하좌우로 움직이며 그 값은 0.1 만큼 움직입니다. 그런데 이 코드에는 문제가 있죠. 바로 하드웨어 성능에 따라 초당 이동거리가 다르다는 것입니다. 이게 무슨 의미일까요? 컴퓨터 A는 계산속도가 매우 빨라서 1초에 10000번 계산합니다. 컴퓨터 B는 계산속도가 매우 느려서 1초에 100번 계산합니다. 위 코드에 의하면 컴퓨터 A에서 게임을 실행시 1초에 1000 만큼 이동하고 컴퓨터 B에서는 게임을 실행시 1초에 10 만 이동하죠. 만약, 레이싱 게임이라고 했을때 내 컴퓨터 사양이 구리다는 이유로 매번 경기에서 지면 억울할겁니다. 그렇기에 컴퓨터 사양에 구애받지 않는 상대적인 시간을 얻어야하는데 그것이 바로 델타타임 입니다. 그럼 이는 ..

Window API 2024.02.01

[수학] 벡터

1. 벡터의 정의 1) 데카르트 좌표계 (Cartesian Coordinate System) 데카르트 좌표계란 임의의 차원의 유클리드 공간을 나타내는 좌표계 중 하나입니다. 유클리드 공간은 평면과 공간을 일반화한 것으로 유클리드가 생각했던 거리, 길이, 각도를 좌표계에 도입하여, 임의 차원 공간으로 확장한 것입니다. 유클리드 공간은 유한 차원, 실수, 내적 공간으로 n차원 유클리드 공간은 실수 집합 R의 n번 곱집합이죠. 간단하게 말해서 2차원 데카르트 좌표계는 2차원 유클리드 공간에서의 좌표 평면 3차원 데카르트 좌표계는 3차원 유클리드 공간에서의 좌표 공간 이라고 할 수 있겠습니다. 이 2차원 데카르트 좌표계는 2개의 실수 집합 R을 곱집합한 원소들의 집합, RxR 로 표현할 수 있고 흔히 가로축을 ..

[C++] 백준 11062. 카드 게임

https://www.acmicpc.net/problem/11062 11062번: 카드 게임 근우와 명우는 재미있는 카드 게임을 하고 있다. N개의 카드가 일렬로 놓여 있다. 각 카드에는 점수가 적혀있다. 근우부터 시작하여 번갈아가면서 턴이 진행되는데 한 턴에는 가장 왼쪽에 있는 www.acmicpc.net 아이디어 처음에는 그리디 알고리즘 문제인줄 알고 deque를 이용해서 현재 최고 가치를 가지는 카드를 뽑는 방식을 로직을 사용했는데, 최선의 전략으로 게임이 끝났을 때, 최고 점수를 얻어야 하는 것이더라구요. 그러면 현재 최선의 선택잉 미래에는 최선이 아닐 수 있습니다. 이럴 때는 다이나믹 프로그래밍을 사용해야죠! dp[i][j] 는 i번째 카드 ~ j번째 카드가 있을 때, 근우의 최대 점수를 뜻합니..

[WinAPI] 싱글톤과 GameManager, 윈도우 해상도 설정하기

게임은 총 3개의 함수에 의해 진행됩니다. (1) 초기화 함수 (2) 업데이트 함수 (3) 렌더링 함수 초기화 함수는 게임 시작에 있어서 초기에 설정해야할 값을 정의하고, 메인 루프에서는 업데이트 함수와 렌더링 함수가 계속 실행되면서 연산 및 그리기 작업을 수행합니다. 그래서 우리는 게임을 관리할 매니저 클래스가 필요합니다. 그것을 GameManager 라고 하고, 여기서 싱글톤 패턴을 사용하게 됩니다. 아래는 싱글톤에 대해 참고할 포스팅입니다. 더보기 https://powerclabman.tistory.com/66 [C++/디자인패턴] 싱글톤 (Singletone) 개요 싱글톤 패턴은 하나의 클래스가 하나의 객체만 가지도록 하면서 이 객체에 대한 접근은 전역으로 제공하는 디자인 패턴 입니다. 게임을 만..

Window API 2024.02.01

[WinAPI] 게임을 위한 메인 루프 만들기

https://powerclabman.tistory.com/77 [WinAPI] hWnd 윈도우 핸들, hDC hWnd 핸들 윈도우란 뭔가? 윈도우의 핸들은 운영체제의 커널 오브젝트를 사용하기 위해 필요한 장치라고 볼 수 있습니다. 우리가 프로그램으로 만든 윈도우는 고유 식별 id가 있습니다. 이런 고유 powerclabman.tistory.com 이전 포스팅에서 말했듯 GetMessage는 게임 루프를 돌리는데 적합하지 않습니다. 게임은 보통 1초에 60번의 업데이트 및 렌더링을 제공해야하는데, GetMessage의 경우 메시지 큐에서 메시지를 꺼내고, 어떤 메시지인지 확인하는 과정이 시간이 생각보다 많이 걸리기 때문이죠. 더하여 메시지 큐에 메시지를 넣어주지 않으면 무한정 대기하는 참사가 일어납니다...

Window API 2024.01.31

[수학] 함수에 대해서

함수 수학에서 함수는 어떤 집합의 각 원소를 다른 집합의 유일한 원소에 대응시키는 이항 관계를 뜻합니다. 한 변수의 값에 따라 다른 한 변수의 값이 정해질 때, 후자는 전자의 함수가 된다. 라고 말할 수 있죠 함수가 되기 위해서는 몇 가지 조건을 만족해야 합니다. 1) 함수가 성립되기 위한 조건 (1) 집합 X, Y가 있을 때 집합 X의 한 원소 x가 집합 Y의 원소에 유일하게 대응해야 한다. (2) 집합 X의 모든 원소가 집합 Y의 원소와 대응해야 한다. 2) 함수가 아닌 대응 관계 (1) 집합 X의 어떤 한 요소가 집합 Y의 원소와 대응하지 않을 때 함수라고 부르지 않는다. (2) 집합 x의 한 원소가 집합 Y의 2개 이상의 원소와 대응할 때 함수라고 부르지 않는다. 3) 함수에 관련된 주요 용어 (..

[WinAPI] hWnd 윈도우 핸들, hDC

hWnd 핸들 윈도우란 뭔가? 윈도우의 핸들은 운영체제의 커널 오브젝트를 사용하기 위해 필요한 장치라고 볼 수 있습니다. 우리가 프로그램으로 만든 윈도우는 고유 식별 id가 있습니다. 이런 고유 식별 id를 HWND로 관리하고 있다고 보시면 됩니다. 객체가 메모리단에 잡히긴 했는데 우리가 함부로 접근할 수 없습니다. 윈도우는 운영체제가 관리하는 객체이기 때문이죠. 그래서 우리는 hwnd라는 id를 통해서 윈도우를 간접적으로 다뤄야만 하는 것입니다. 윈도우에서 동작하는 프로그램을 만들기 위해서는 무조건 hwnd를 다뤄야만 합니다. 화면에 그림을 그리는 것 또한 hwnd에 접근해서 그려줘야만 하죠 이런 식으로 말이죠. 추가적으로 윈도우 프로그래밍을 할 때는 이 H 자료형 시리즈가 중요합니다. HPEN HDC..

Window API 2024.01.31

[C++] 백준 13334. 철로

https://www.acmicpc.net/problem/13334 13334번: 철로 입력은 표준입력을 사용한다. 첫 번째 줄에 사람 수를 나타내는 양의 정수 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 n개의 각 줄에 정수 쌍 (hi, oi)가 주어진다. 여기서 hi와 oi는 −100,000,000이상, 100,000,0 www.acmicpc.net 1. 문제 2. 아이디어 이 문제는 기본적으로 스위핑 알고리즘을 사용해서 풀이합니다. 스위핑 알고리즘은 뜻 그대로 휩쓸고 지나가며 문제를 해결하는 방식으로, 특정 기준에 따라 정렬한 후 순서대로 처리하는 알고리즘입니다. 그러므로 스위핑 알고리즘의 복잡도는 O(N log N + N) = O(N log N) 의 복잡도를 가집니다. 즉, 이 문제는 선..

[C++] 15903번. 카드 합체 놀이

https://www.acmicpc.net/problem/15903 15903번: 카드 합체 놀이 첫 번째 줄에 카드의 개수를 나타내는 수 n(2 ≤ n ≤ 1,000)과 카드 합체를 몇 번 하는지를 나타내는 수 m(0 ≤ m ≤ 15×n)이 주어진다. 두 번째 줄에 맨 처음 카드의 상태를 나타내는 n개의 자연수 a1, www.acmicpc.net 1. 문제 2. 아이디어 기본적으로 그리디 알고리즘이다. 가장 작은 카드를 더해서 카드 뭉치를 업데이트해주면 된다. 그러면 가장 작은 요소로 배열을 정렬해서 하는 방법이 있는데, 이는 조금 문제가 있다. 왜냐면, 업데이트 + 정렬 + 업데이트 + 정렬은 생각보다 비용이 크기 때문이다. 정렬의 경우 아무리 빨라봐야 평균 n log n 시간 복잡도가 소모된다. 시..