일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Generative Model
- ue5.4
- Few-shot generation
- NLP
- Stat110
- deep learning
- BERT
- 언리얼엔진
- UE5
- WinAPI
- Font Generation
- GAN
- motion matching
- CNN
- Diffusion
- multimodal
- animation retargeting
- 딥러닝
- 디퓨전모델
- cv
- 폰트생성
- RNN
- dl
- ddpm
- inductive bias
- 모션매칭
- Unreal Engine
- userwidget
- 생성모델
- WBP
- Today
- Total
목록Game Development/WinAPI (11)
Deeper Learning
언리얼 엔진을 사용하여 게임 개발을 시작하고 나서 예전 게임의 소스코드를 찾아보다가 WinAPI, DirectX 등을 사용하여 작성된 코드를 많이 보았고 언리얼 엔진을 통해 배운 게임 프레임워크 설계를 WinAPI로 해보고 싶어서 간단한 WinAPI 개발을 시작하였다. 아래 항목의 개발을 마지막으로 간단한 기능 개발을 모두 마쳤다. 이에 대해 하나씩 소개하는 포스팅을 작성하려 한다.공격속도 추가 및 적용플레이어 능력치를 향상 시켜주는 박스 오브젝트 추가적 스폰 로직 조정, 레벨 디자인Player - Enemy 오브젝트 간 충돌처리 플레이어 체력바 UI 추가게임 종료 후 Scene 생성 공격속도 추가 및 적용void CAnimator::SetDuration(const wstring& _animName,..
무료 스프라이트로 게임을 제작하다 보니까 8방향 애셋을 구하기가 쉽지 않다. 플레이어가 발사하는 투사체의 경우 만약 텍스쳐의 방향이 정해져 있다면 방향벡터에 따라 비트맵이 회전해야 자연스럽게 게임에서 표현이 가능하다.예시로 사용할 텍스쳐는 위와 같이 방향이 정해진 화살 스프라이트이다. 플레이어는 마우스 커서 방향으로 화살을 발사하기 때문에 투사체가 향하는 방향벡터를 기준으로 텍스쳐가 회전해야 화살촉 방향으로 화살이 날아가도록 세팅할 수 있다. 탄환 클래스인 Bullet과 다르게 방향성을 고려한 회전 렌더링 처리가 필요하고 애니메이션 또한 추가로 설정이 필요하고 후에 하위 클래스(속성을 가진 화살, 적을 추적하는 화살)를 만들 수 있도록 추가로 Arrow 클래스를 만들었다. class CArrow :..
WinAPI 프로젝트에 애니메이션을 넣고 플레이어의 상태를 정의하는 코드를 추가하여 공격, 이동, 유휴 애니메이션이 재생되도록 하여 조금 더 게임의 형태를 갖추게 되었다.공격속도에 따라 애니메이션의 빠르기가 달라지도록 하였고 투사체가 발사되기에 자연스러운 애니메이션 프레임에 Bullet Object를 Spawn 하도록 코드를 추가하였다. 게임을 켜두고 문제를 해결하기 위해 코딩을 오랜 시간 하다가 다시 게임을 들어가 보니 프레임이 체감될 정도로 떨어진 것을 확인하였다. 작업을 위해 새로운 씬을 세팅한 이후 메모리를 모니터링한 적이 없어 Memory Leak이 의심되었고 Visual studio의 진단도구의 Heap Profiling을 사용하여 이를 해결하였다. 진단도구 - Diagnostic Tool..
많은 게임에서 카메라는 캐릭터에 포커스 되어 있고 캐릭터를 따라 움직인다. WinAPI로 만든 현재 프로젝트에서 카메라가 없다면 현재 창의 크기보다 맵(레벨, 씬)을 더 크게 제작하는 것이 불가능하다. 전체 맵을 표현하던 창을 대신 현재 카메라가 보고 있는 영역으로 대체하는 작업이 있어야 캐릭터가 이동함에 따라 카메라가 이동하여 창 밖에 있는 맵이 창 안에 들어오도록 할 수 있다. 왼쪽 그림에서 큰 검은색 사각형이 창의 크기가 되어야 하고 캐릭터가 우측으로 이동하면 카메라도 캐릭터를 따라 우측으로(빨간 사각형) 이동하여야 한다. 시점 밖에 있던 오브젝트도 카메라가 이동함에 따라 창 안으로 들어온다. 구현 전에 이해가 필요한 부분이 있는데, 바로 카메라를 도입하는 순간 두 좌표계가 필요하다는 것이다. 먼..
이번 포스팅에서는 저번 포스팅에 이어서 Collider 클래스를 관리하는 매니저 클래스인 Collider Manger 클래스에 대해 소개하려 한다. 저번 포스팅에서 Collider 클래스를 만들어 Object의 멤버로 지정하여 Component로 이를 관리하기로 하였고 충돌 상태(Begin, Ongoing, End) 콜백함수는 Object의 충돌 로직 함수를 호출하여 Object에서 이를 처리하도록 디자인하였다. 이제 충돌 이벤트 발생을 판단하고 충돌이 이루어져야 하는 Object인지 기록하는 역할을 하는 등 게임에서 충돌과 관련된 기능을 관리하는 매니저 클래스인 Collider Manger 클래스에 대해 알아보자. 충돌 상태를 관리하고 Object 간 충돌을 판정하기 위해서는 아래 기능이 필요하다이전 ..
게임 개발에서 Collider는 핵심적인 역할을 한다. 물리적 충돌을 감지하고 그 결과를 처리하는 데 사용되는 컴포넌트로 오브젝트의 상호작용을 담당한다. 캐릭터가 바닥을 딛고 서있을지, 벽에 부딪힐지 같은 눈에 보이는 판정뿐만 아니라 카메라에 보여야 하는지, 적의 공격을 맞게 되는지 또한 Collider의 충돌 판정에 의해 결정된다.WinAPI로 게임을 본격적으로 만들기 전에 거의 모든 게임 장르에서 사용되는 필수 요소인 Collider의 구현에 대해 다뤄보려 한다. Collider.h 우선 헤더파일은 아래와 같다.#pragma onceclass CObject;class CCollider{private: static UINT g_iNextID; CObject* m_pOwner; Vec2 m_vOffse..
언리얼 엔진을 학습하면서 작은 게임을 만들 때에도 로드할 데이터가 매우 많은데 오픈월드 게임처럼 방대한 게임은 어떻게 이를 처리하는지 궁금하여 찾아본 적이 있다. 언리얼 엔진에서는 이를 레벨을 Chunk로 나누고 플레이어의 시야에 따라 이를 로드하는 레벨 스트리밍(Level Streaming) 기술을 활용하여 로딩 없는 심리스 월드를 구현할 수 있도록 하였다. 현재 WinAPI를 활용한 코드에서도 레벨(=씬)에 배치된 오브젝트가 1만개를 넘어가는데 (대부분 맵을 구성하는 타일 오브젝트) 매 Tick 마다 이를 전부 렌더링 하고 있어 프레임 드랍이 심한 상황이다. 적 오브젝트의 경우 카메라 밖에서 생성되거나, 플레이어가 멀어져 카메라 밖으로 벗어나도 정해진 State에 따라 행동을 반복해야 하기 때..
이전 포스팅에서 Core Class와 매니저 클래스에 대해 다루었다. PeekMessage2. Core Class 소개 및 전체 클래스 설계 요약 GetMessage -> PeekMessage 이전 포스팅에서 설명하였던 것처럼 메시지 루프에" data-og-host="dlaiml.tistory.com" data-og-source-url="https://dlaiml.tistory.com/entry/WinAPI-PeekMessage-Core-Class-%EC%84%A4%EA%B3%84-%EC%8A%88%ED%8C%85%EA%B2%8C%EC%9E%84" data-og-url="https://dlaiml.tistory.com/entry/WinAPI-PeekMessage-Core-Class-%EC%84%A4%EA..
한 프레임 단위로 Update, Render가 일어나는 WinAPI 프로젝트에서 객체의 생성, 삭제를 코드 순서대로 처리하려 하였으나 문제가 있다. 예를 들어 적 오브젝트를 참조하여 적의 위치를 따라 매 프레임 움직이는 투사체를 구현하였다고 해보자.체력이 0 이하로 떨어져 어떤 프레임에서 Update 처리를 하며 동적으로 할당한 적 오브젝트가 delete 되었다면 투사체에서 적 오브젝트를 참조하던 포인터는 nullptr가 되어 에러가 발생한다. 단순하게 코드의 순서를 바꾸어 객체 삭제 관련 코드를 루프의 끝에 둔다 하면 업데이트(대미지 계산 등 처리) -> 렌더링(화면에 Paint) -> 객체 삭제의 순서가 될 텐데 삭제된 객체가 렌더링 된 상태로 사용자에게 보이며 해당 객체와 관련된 업데이트가 모두 마..
Win32API를 활용해서 간단한 슈팅게임을 만드려고 한다. 1. GetMessage -> PeekMessage2. Core Class 소개 및 전체 클래스 설계 요약 GetMessage -> PeekMessage 이전 포스팅에서 설명하였던 것처럼 메시지 루프에서 메시지가 있을 때마다 이를 처리하는 현재 방식은 게임을 만들기에 적합하지 않다. 메시지가 없을 때에도 구현한 로직을 처리할 수 있도록 메시지 루프를 PeekMessage를 사용하여 변경하였다. while (true){ if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) { if (WM_QUIT == msg.message) break; // Handle..
WinAPI는 MS 윈도우 운영체제에서 사용하는 API로 C/C++로 직접 상호작용이 가능하다. VS에서 윈도우 데스크탑 애플리케이션 프로젝트를 생성하면 간단한 창을 띄울 수 있는 코드가 쓰여있는데 entry point인 wWinMain 내부의 코드들이 어떤 역할을 하는지 간단하게 정리해보려 한다. entry point cpp 파일의 코드 전체는 아래와 같으며 메인 함수인 wWinMain 내부 코드를 하나씩 분석해 보자. // win32example.cpp : Defines the entry point for the application.//#include "framework.h"#include "win32example.h"#define MAX_LOADSTRING 100// Global Variable..