목록Game Dev/윈도우 API (9)
KoreanFoodie's Study
윈도우 API 프로그래밍 10 : 백버퍼와 픽 메시지 백 버퍼는 화면에 그려지는 버퍼에 바로 렌더를 살 경우 버퍼가 지워지는 순간 또는 버퍼에 전체가 다 그려지기 전에 화면에 그려지기 전에 화면에 그려질 경우 덜 그려진 부분이 화면에서 잠깐 지워진 상태가 되기 때문에 깜빡이는 것처럼 보이는 현상이 생긴다. 이때, 백 버퍼를 생성하여 백 버퍼에 모든 내용을 그리고 백 버퍼를 화면에 렌더하는 방식으로 위의 문제를 해결할 수 있다. 백퍼퍼와 픽 메시지 기존에는 WM_TIMER를 이용하여 업데이트를 처리했지만 이는 모든 메시지 중에서 우선 순위가 가장 낮고 최대 속도가 0.01초이다. 이를 극복하고 cpu 성능을 제대로 활용하기 위해 픽 메시지를 사용한다! HDC hdc = GetDC(g_hWnd); g_hDC..
윈도우 API 프로그래밍 9 : 키매니저(키 입력 받기), bitset 예제 이번 글에서는 싱글톤 패턴을 이용해서 키 입력을 받는 방법과 간단한 bitset 메소드를 이용해 보겠다. SingletonBase.h 먼저, 싱글톤 클래스를 이용할 템플릿 클래스인 SingletonBase.h를 정의해 보았다. #pragma once /* 싱글톤 패턴 : 단일 객체 관리 방법 - 인스턴스를 호출 시 처음 호출 하는 경우 인스턴스를 생성하고 생성 된 인스턴스를 반환 한다. - 인스턴스를 호출 시 이전에 호출되어 생성이 되어 있는 경우 그 생성 되어 있는 인스턴스를 반환 한다. 템플릿(Template, 형판) : 함수 또는 클래스를 만들어 내기 위한 틀 - 정해지지 않은 자료형에 대한 선언을 템플릿을 사용하여 하고 ..
윈도우 API 프로그래밍 8 : 객체 지향적인 윈도우 API 프로그래밍 "모든 것은 객체로 이루어져 있다". 객체 지향적으로 코드를 짜면 유지 보수가 편하며 새로운 기능을 안전하고 효율적으로 구현할 수 있다. 이 글에서는 실제 기능 구현을 보며 그 부분에 대한 기초를 간략히 서술한다. 기능 예시1 . 더 자세한 내용이 궁금하시다면 직접 들어보시는 걸 추천드립니다!
윈도우 API 프로그래밍 7 : 게임 프레임워크 구성 지금은 간단한 게임이니까 WindowsProject1.cpp라는 단일 파일에 모든 기능을 구현했지만, 프로그램이 복잡해지면 사실 필요한 코드를 필요한 파일에 분할해서 구성해야 한다. 이 글에서는 이를 위한 밑작업을 어떻게 하는지를 다루고자 한다. GameNode : 먼저 스켈레톤 클래스를 만들자 #pragma once class GameNode { public: GameNode(); ~GameNode(); virtual void Init() = 0; // 순수 가상 함수 virtual void Update() = 0; virtual void Render() = 0; }; 먼저 가장 기본적으로 Init, Update, Render라는 가상 메소드를 가진..
윈도우 API 프로그래밍 6 : 간단한 UI 구현과 똥피하기 게임 예제 이전 글에 이어서 추가적인 기능을 약간 추가해 보자. 전역 변수 재설정 struct tagBox { RECTrt; floatspeed; }; vectorvecBox;// 떨어지는 렉트들의 정보 intnDelay = 50; struct tagBox를 새로 선언하여 RECT를 대체했다. 그 이유는, 각각의 상자마다 떨어지는 속도를 다르게 만들기 위해서인데, 이는 난이도나 약간의 재미 요소를 첨가하는데 사용될 수 있다. WM_TIMER : 점수 계산과 타입 수정 case WM_TIMER:// 타이머에 의해서 호출 { InvalidateRect(hWnd, NULL, true); nLevel = nScore / 100 + 1; // 포지션 위..
윈도우 API 프로그래밍 5 : 물체 떨어뜨리기 이번 글에서는 간단한 물체를 떨어뜨리는 기능을 구현하며 다른 디테일을 설명한다. WM_CREATE case WM_CREATE:// 프로그램이 실행 될 때 한번 호출 된다. (초기화) SetTimer(hWnd, 1, 10, NULL); srand(time(NULL)); break; 초기화 함수를 통해 타이머를 SET 하고, 랜덤 함수를 호출한다. WM_TIMER case WM_TIMER:// 타이머에 의해서 호출 { InvalidateRect(hWnd, NULL, true); // 포지션 위치에 따른 렉트 정보 업데이트 rtBox1 = RECT_MAKE(ptPos1.x, ptPos1.y, 50); if (nDelay == 50) { RECT rt; rt.le..
윈도우 API 프로그래밍 4 : 충돌 검사 (IntersectRect...) 이번 글에서는 도형이 다른 도형과 만났을 때 이를 어떻게 구현하고 처리하는지를 살펴본다. WM_TIMER에서 IntersectRect를 넣어보자 // 아래 두 줄은 전역변수로 선언함 enum MOVE_DIR { MOVE_LEFT, MOVE_RIGHT, MOVE_UP, MOVE_DOWN }; MOVE_DIReMoveDir; // ... case WM_TIMER:// 타이머에 의해서 호출 InvalidateRect(hWnd, NULL, true); // 포지션 위치에 따른 렉트 정보 업데이트 rtBox1 = RECT_MAKE(ptPos1.x, ptPos1.y, 100); rtBox2 = RECT_MAKE(ptPos2.x, ptPos..
윈도우 API 프로그래밍 3 : 키 입력과 게임 업데이트 이번 글에서는 WIM_KEYDOWN을 통한 키 입력에 대해 알아보도록 한다. 키 입력 처리하기 case WM_CREATE:// 프로그램이 실행 될 때 한번 호출 된다. (초기화) SetTimer(hWnd, 1, 10, NULL); break; case WM_TIMER:// 타이머에 의해서 호출 InvalidateRect(hWnd, NULL, true); break; case WM_KEYDOWN:// 키 입력이 있을 때 마다 호출 된다. switch (wParam) { // 삼항식 (조건) ? 참일 때 : 거짓일 때 case 'A': case VK_LEFT: ptPos.x -= (ptPos.x > 0) ? 1 : 0; break; case 'D': ..
윈도우 API 프로그래밍 1 : 창 생성 및 기본 세팅 먼저 비주얼 스튜디오(2019)에서 Windows 데스크탑 애플리케이션 프로젝트를 생성하자. 그럼 아래와 같은 식으로 프로젝트가 생성되는데, 이중 framework.h, WindowsProject1.cpp 파일이 자동 생성되고, 이 부분을 고치면서 기능을 구현한다. framwork.h 파일은 헤더 파일이나 매크로 선언, 변경이 거의 없는 변수 등을, WindowsProject1.cpp 파일에서는 타이머나 페인팅을 포함하고 있다. framework.h // header.h: 표준 시스템 포함 파일 // 또는 프로젝트 특정 포함 파일이 들어 있는 포함 파일입니다. // #pragma once #include "targetver.h" #define WIN..