2024/01 48

[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 시간 복잡도가 소모된다. 시..

[WinAPI] 01. Windows 데스크톱 어플리케이션 메인 분석

Windows 데스크톱 어플리케이션을 실행하면 위와같은 파일이 자동 생성됩니다. 콘솔 앱과는 사뭇다른 모습이고 처음보는 함수들이 난무합니다. 심지어 main도 안보이구요. 어쨌든 이 구조가 기본 window 프로그램을 만들기위한 프레임워크입니다. 위에서부터 천천히 분석해보도록 하겠습니다. 전역변수들을 볼 수 있습니다. WCHAR은 그냥 2바이트 char 자료형을 재정의한 것 입니다. HINSTANCE 는 프로그램의 HANDLE을 의미합니다. 윈도우 운영체제에서 실행되는 프로그램을 구별하기위한 ID값인데, HINSTANCE는 Win32 프로그램이 메모리 상에 올라가있는 시작 주소 값을 저장하는 자료형입니다. 즉, HINSTANCE (핸들 인스턴스) 는 내 프로그램의 시작 주소라고 볼 수 있죠 즉, hIns..

Window API 2024.01.30

[C++] 백준 1261. 알고스팟

https://www.acmicpc.net/problem/1261 1261번: 알고스팟 첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미 www.acmicpc.net 문제 아이디어 BFS 문제의 대표격 중 하나인 미로찾기 문제입니다. 그러나 시간 제한이 1초이기 때문에 O(N^2) 인 BFS로는 풀 수 없고, O(N logN) 인 다익스트라 알고리즘을 이용해서 풀어야만 합니다. 맨 좌측 상단에서 시작해서 맨 우측 하단까지 어떻게 도달할 것인가? 에 대한 문제이고 1은 벽인데 필요하다면 벽을 부술수도 있습니다. 단, 벽을 최대한 적게 부수면..

[C++] 백준 17070. 파이프 옮기기1

1. 문제 https://www.acmicpc.net/problem/17070 2. 아이디어 다이나믹 프로그래밍으로 풀 수 있는 문제일 것 같다. 특정 좌표를 (y, x) 라고 했을 때 파이프의 우측 좌표를 기준으로 (좌측 좌표는 생각할 필요 없다.) (y, x) 에 가로로 도착할 횟수 + (y, x) 에 세로로 도착할 횟수 + (y, x) 에 대각선으로 도착할 횟수 의 합을 구하면, 해당 좌표에 도달할 수 있는 모든 경우의 수가 된다. 이 때, 벽에 막힐수도 있기에 예외처리에 신경쓴다. 3. 풀이 먼저 전역변수 목록이다. tableSize는 격자의 크기 table은 격자의 정보를 입력하는 부분 dpRight, dpDown, dpRD 는 각각 특정 좌표에 가로로 도착하는 경우, 세로로 도착하는 경우, 대..

[C++/디자인패턴] 빌더 패턴 (Builder Pattern)

1. 개요 빌더 패턴은 복잡한 객체의 생성 과정과 표현 방법을 분리하여 다양한 구성의 인스턴스를 만드는 생성 패턴입니다. 생성자에 들어갈 매개 변수를 메서드로 하나하나 받아들이고 마지막에 통합 빌드해서 객체를 생성하는 방식이죠. 예를 들어서 몬스터를 만들어낸다고 생각합시다. 몬스터는 종족, 공격력, 체력, 방어력 등 많은 매개변수를 가지고 있습니다. 이것들을 커스텀해서 생성하는 방식을 지원하는 것이 빌더 패턴입니다. 2. 예제 주석에 적힌대로 위와같은 형식으로 생성을 한다면 어떤 매개변수를 설정하는지 명확하지 않습니다. 이런 식으로 따로 생성을 위한 빌더를 정의해서 사용하면, 몬스터에 대한 청사진도 만들 수 있고, 명확하게 매개변수를 전달할수도 있습니다. 이렇게 청사진을 만들어놓고 빌드자체를 나중에 따로..

[C++/디자인패턴] 커맨드 패턴 (Command Pattern)

1. 개요 커맨드 패턴은 행동 디자인 패턴 중 하나로, 행동을 객체화 하는 것이 목표입니다. 명령을 인터페이스로 하여 하위에 구체적인 명령을 재정의합니다. 명령들을 객체로 캡슐화해서 사용할 수 있도록 하는 패턴을 뜻합니다. 2. 기본 구조 커맨드 패턴은 이벤트가 발생했을 때 실행될 기능이 다양하면서도 변경이 필요한 경우 유용합니다. 예를들어 게임에서 캐릭터에게 단축키 설정을 할 수 있는 경우가 있죠. WASD로 기본적으로 이동할 수 있지만, 사용자에 따라서 IJKL 로 이동하고 싶은 사람도 있을테니 말이죠. 또, 여러 커맨드를 조합하여 하나의 커맨드처럼 사용해야할 때, 커맨드 실행 취소 및 재실행 등의 기능을 구현해야 할 때 유용합니다. 이런 식으로 코딩하는 것을 막는 디자인 패턴이죠. 3. 예제 이렇게..