windowAPI 7

WinApi 7강 - 꼬물꼬물 총알 만들기

지금까지 배운 내용을 사용하여 구불구불 거리는 총알을 한번 발사해 보자 1. 총알 만들기 CObject를 상속받아서 총알을 만들어 준다총알은 위로 발사되며 cos을 사용하여 구불거림을 표현한다#pragma once#include "CObject.h"class CBullet : public CObject{private: float m_fTheta; float m_fDirection;public: float GetTheta() { return m_fTheta; } void SetTheta(float _fTheta) { m_fTheta = _fTheta; }public: void update(); void render(HDC _hdc); void SetDirection(bool _up) { if (_up) ..

windowAPI 2024.11.23

WindowApi 6강 - range기반 for문의 주의점

range기반의 for문의 경우는 메모리를 참조하여 그 공간을 순회한다.하지만 vector의 경우 사이즈가 늘어나면서 capacity가 커지게 되면 새로운 메모리 공간에 할당받게 되어 메모리 주소가 달라지는 경우가 발생하기때문에 for문 도중 벡터의 크기가 늘어가게되면 시스템이 종료된다예를들으면 이러한 경우다for(auto& a : myVec){ a = 1; myVec.push_back(1);}또는 멀티쓰레드 혹은 비동기 환경에서 이러한 에러가 발생할 수 있기 때문에 이를 방지하기 위해서는 락을 걸어주거나 for문이 다 돈다음 myVec의 push_back을 보장해 주는것이 필요해 보인다 그것도 귀찮다면 인덱스 방식의 for문을 사용하면 원하는 결과는 아니겠지만 시스템 종료는 되지 않는다

windowAPI 2024.11.23

WindowAPi 5강 - SceneManager

현재 진행되고 있는 Scene을 제외한 다른 리소스들까지 미리 힙메모리에 올려두는것은 메모리 낭비가 심하기 때문에 따로 씬을 구성하고 씬마다 가지고 있는 오브젝트들을 저장한뒤 이 오브젝트들을 씬이 전환될때 파괴하고 다시 할당해 주는 형식을 작성해 보자 1. SceneManager매니저의 역할은 씬들의 초기화 및 초기 씬 선택을 진행할 것이다void CSceneManager::init() { // 씬들을 초기화 해준다 m_scenes[(UINT)SCENE_TYPE::START] = new CStart_Scene(); m_scenes[(UINT)SCENE_TYPE::START]->SetName(L"Start"); m_pCurScene = m_scenes[(UINT)SCENE_TYPE::START]; m_p..

windowAPI 2024.11.19

WinAPI 4강 - KeyManager

메세징시스템을 이용한다면 GetAsyncKeyState 함수를 사용해 키를 누르고 있는지 떼고있는지 홀드중인지의 확인이 가능하다 하지만 현재 진행중인 PeekMessage구조에서는 이 함수만으로의 정밀한 판단이 불가능하기 때문에 이 함수를 이용하며 새로운 키 매니저에 바인딩 시켜주고 상태를 따로 관리해야 한다 1. key binding 전역변수를 사용하여 WP(앞으로 축약하겠다)의 키들을 현재 내가 만든 키에 바인딩해준다이렇게 하면 좋은점은 추후 앞으로 이동을 w가 아닌 s로 바꾼다면 전역변수의 w바인딩을 s로 바꿔주면 되기 때문에 동적으로 키입력을 바꾸는 것도 용이하다 int g_arrVK[(int)KEY::LAST] = { VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT, 'Q', 'W'..

windowAPI 2024.11.19

windowAPI - 3일차 double buffering

이 방식을 사용하는 이유는 하나의 화면만으로 구성하게 된다면 깜박이는 현상이 계속 발생하기 때문이다.이를 방지하지위해 보여줄 화면과 임시 화면을 구성해 임시화면에서 지우고 그리는 것을 반복하며 현재 화면은 그린 물체만 보여주는 방식이다. 1. 중요 함수CreateCompatibleBitmap() // 비트맵과 호환되는 비트맵을 가져올수 있다CreateCompatibleDC() // 현재 DC와 호환되는 DC를 가져올수 있다BitBlt() // 현재 비트맵으로 비트맵을 복사해 준다 2. 구현 : 원래 dc를 이용하여 호환되는 비트맵과 dc를 만들어 준뒤 이를 이용해 bitmap을 복사한다// 이중 버퍼링 용도의 비트맵과 DC를 만든다.m_hBitmap = CreateCompatibleBitmap(m_hdc..

windowAPI 2024.11.18

WindowAPI 2일차 - 비동기 입력 및 싱글톤

저번에 일반적인 WindowAPI를 사용하여 사각형을 그려봤지만 이 방식은 매번 윈도우의 메세징 시스템을 이용하여 그려야 되며 InvalidateRect를 계속 호출해야 하는 상황이 발생하였다.게임에서는 이러한 메세징 시스템을 이용하지 않고 비동기 방식의 키 입력을 사용하여 주로 이를 처리한다고 한다 1. 비동기 방식으로의 전환이것을 구현하지 위해서는 SendMessage의 경우는 메세지가 있는 경우만 콜벡이 발생하므로 메세지 발생 이외의 작업을 처리하기가 어렵기 때문에 peekMessage를 사용하여 원할하게 프로그램이 진행되게 작업한다. while (true){ if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) { if (WM_QUIT == msg.message..

windowAPI 2024.11.18

WindowAPI 1일차 - 사각형 그리기

https://www.youtube.com/watch?v=MJ31abxA7A0&list=PL4SIC1d_ab-ZLg4TvAO5R4nqlJTyJXsPK&index=7위 강의를 보면서 정리중입니다. window api의 에서 알고 있어야 되는 몇가지 변수와 함수를 정리해보자//핵심 변수HWND // 현재 윈도우 창의 번호를 저장해 둔다HDC // 랜더링 할수 있는 Device IDHPEN // 펜의 색을 지정하는 Device IDHBRUSH // 브러쉬의 색을 지정하는 DeviceID//핵심함수SelectObject(HDC, ??) // HDC에 ??을 설정해 줍니다 return -> 원래 ??DeleteObject(??) // ??을 삭제해 줍니다GetStockObject(??) // 미리 생성되어 있는 ..

windowAPI 2024.11.17