전체 글 39

[Win32API] GetAsyncKeyState() 와 키 입력 받기 (2)

https://soonang2.tistory.com/28 [Win32API] GetAsyncKeyState() 와 키 입력 받기 (1) 이번에는 가상 키 값과 키보드 입력을 받는 방법에 대해서 알아보겠습니다. _getch() 함수는 가장 마지막에 입력한 값만 받을 수 있으므로, 대각선 이동을 구현할 수 없습니다. switch(wParam) / case WM_ soonang2.tistory.com 이전 포스팅을 보고 오시는 것을 추천드립니다. 이번 포스팅에 해당되는 코드는 아래 git에서 확인 가능하다. https://github.com/nr97819/Win32_ASTR_Lecture/tree/Lecture-12 (강의 13으로 교체 필요) void CCore::update() { Vec2 vPos = g..

[Win32API] Rendering과 Double Buffering

화면을 흰 색으로 clear 시키려면, 멤버 변수로 갖고 있던 m_ptResolution.x / m_ptResolution.y 값을 쓰면 되지만, Rectangle() 함수의 경우, 테두리 1px을 검은색으로 그리게 되므로, 이 1px을 무시하고 그리도록 해야 한다. // 화면 Clear Rectangle(m_hDC, -1, -1, m_ptResolution.x + 1, m_ptResolution.y + 1); Rectangle과 같은 도형 그리기 함수들은, 도형이 전체적으로 다 그려진 채로 렌더링 되지만, 여러 개의 도형들을 그리는 경우, 따로 따로 그려지게 되고, 이 과정에서 깜빡임 현상이 심해지게 된다. 이에 Double Buffering 기법을 이용하여 해결해보도록 한다. 메인 HDC인 m_hDC..

[Win32API] GetAsyncKeyState() 와 키 입력 받기 (1)

이번에는 가상 키 값과 키보드 입력을 받는 방법에 대해서 알아보겠습니다. _getch() 함수는 가장 마지막에 입력한 값만 받을 수 있으므로, 대각선 이동을 구현할 수 없습니다. switch(wParam) / case WM_KEYDOWN을 통한 가상 키 값에 따른 분기로 입력받는 방식은 비동기 구현이 어렵습니다. CKeyMgr와 같이 별도의 클래스로 분리하여 비동기로 구현하기 위해서는 새로운 방법이 필요합니다. 이번 포스팅에 해당되는 코드는 아래 git에서 확인 가능하다. https://github.com/nr97819/Win32_ASTR_Lecture/tree/Lecture-12 GitHub - nr97819/Win32_ASTR_Lecture: Win32_ASTR_Lec Win32_ASTR_Lec. C..

[Win32API] 오브젝트 이동 : 시간 동기화 (2)

https://soonang2.tistory.com/26 1000) // 1초 경과시 진입 { iPrevCount = iCurCount; callCount = 0; } // Manager 클래스들 일괄 Update CTimeMgr::GetInst()->Update(); // 매 프레임마다 TimerMgr이 업데이트 되도록 update(); // Manager 클래스들 일괄 Render render(); } (2) QPC를 이용해서 새로 구현한 코드 코드의 내용을 미리 보자면, 아래와 같다. CTimeMgr.h 코드 #pragma once class CTimeMgr { SINGLE(CTimeMgr); private: // Frame Per a Secound (FPS) // = (1 / Delta Time)..

[Win32API] 오브젝트 이동 : 시간 동기화 (1)

모든 컴퓨터는 각각 성능이 다 다르다. 이는 즉, CPU의 연산 처리 속도에 차이가 있다는 뜻으로, PeekMessage()의 if문에 걸리지 않아서 else() { }로 분기되어서 core->Progress()가 호출되는 속도가 "실행하는 컴퓨터의 성능에 따라서 달라진다"는 뜻이다. 그렇게 되면, 더 좋은 컴퓨터를 가지고 있다는 이유만으로 개발자의 의도와 상관없이 더욱 빠른 속도로 게임을 플레이 해야만 하는 상황이 발생할 수도 있다. 이럴 때에 필요한 것이 시간 동기화이다. 말 그대로, 현실 세계의 시간과 inGame의 프레임을 동기화 시켜서, PC의 성능에 따라서 게임 속도가 결정되도록 두는 것이 아닌, 모두가 현실세계의 일정한 시간의 흐름을 기반으로 게임 플레이가 가능해져서 각기 다른 PC에서도 모..

[Win32API] GetTickCount64를 이용한 호출 횟수 및 프레임 체크

int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { ... MSG msg; while (true) { if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) break; if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } else { CCore::GetInst()->progress(); } } return (..

[Win32API] GetDC() ~ ReleaseDC() 함수

GetDC() 함수의 경우, case WM_PAINT: 에서 무효화 영역을 해제하는 역할까지 겸하는 BeginPaint()와는 다르게 오롯이 그림을 그리기만 할 목적으로 HDC(m_hdc) 객체, 즉, 그림을 그릴 스케치북과도 같은 판이 필요할 때 이용한다. (주로 타 함수로 분리해서 작업하는 경우, GetDC()를 쓰게 된다.) class CCore { SINGLE(CCore); private: HWNDm_hWnd;// 메인 윈도우 핸들 HDC m_hDC;// 메인 윈도우에 Draw 할 DC public: int init(HWND _hWnd, POINT _ptResolution); void progress(); }; CCore::~CCore() { // static으로 싱글톤 처리된 Core 종료 시점..

[Win32API] BeginPaint()와 무효화 영역의 관계

BeginPaint()는 메시지를 처리하는 WndProc()의 case WM_PAINT: 에서만 쓸 수 있는 전용 함수이다. 왜냐하면, BeginPaint()로 얻고, EndPaint()로 해제하는 이 과정에서 Window 창의 무효화 영역이 해제됐다고 알리는 역할이 있기 때문이다. 우리가 case WM_PAINT: 를 진입하는 주 원인 자체가, 무효화 영역이 발생하여서 이를 다시 그리기 위한 목적이었는데, 그렇기에 BeginPaint() ~ EndPaint() 과정에서 무효화 영역이었던 것을 해제시키는 역할이 들어있는 것이고, 이를 WM_PAINT 케이스에서만 사용하여야만 하는 것이 된다. (정확히는 EndPaint()로 해제하는 시점에서, 무효화 영역이 모두 사라졌다고 알림이 가게 되는 것이다.) c..

🔥 JSP 기본 정리 - #5 Servlet Mapping

▶ 이번 포스팅은 Servlet을 외부에서 요청하기 쉽도록 특정 문자를 이용해서 맵핑하는 방법에 대해서 입니다. 🔑 목차 🎉 1. Servlet Mapping 이란? 🎉 2. Web.xml 파일을 통한 Mapping (고전 방법) 🎉 3. Java Annotation을 통한 Mapping (최신 방법) ▶ 이전 파트에서 알아보았듯이 JSP 만으로 웹 프로그램을 만들 수 있고, Servlet 만으로 웹 프로그램을 만들 수 있고, 둘을 모두 사용해서 만들 수도 있다. (권장 방법) ▶ View와 같은 부분은 JSP를 사용해서 만들고, Controller, model과 같은 부분들은 Servlet을 사용해서 만든다. 🚩 1. Servlet Mapping 이란? ▶ Servlet을 Web container에 넣..

🔥 Spring Framework - #2 개발 환경 구축

▶이 포스팅에서는 Spring 구축에 필요한 개발 환경에 대해서 다뤄보겠습니다. 🔑 목차 🎉 1. Java 설치 및 환경변수 설정 👉 생략 (이 포스팅에서는 Java 1.8 사용) 🎉 2. IDE (Eclipse) 설치 👉 생략 🎉 3. Spring 개발 환경 설명 . . . 🚩 3. Spring 개발 환경 설명 ▶ 스프링을 이용한 애플리케이션 구축에 필요한 개발 환경에 대해 학습해보자. ① JVM (Java Virtual Machine) : 자바로 만들어진 프로그램이 실행되는 것 (Java 언어로 된 파일이 실제로 실행하는 매체 (실제로는 Javac)) ② API (Application Programming Interface) : 자바의 실제 기능들이 구현되어 있다. ③ JRE (Java Runtime..