전체 글

성장 과정 일기, 누군가에게 정보를 제공하기 위해서가 아닌 스스로 배운 내용을 정리하기 위해 작성하는 블로그 입니다. 잘못된 정보가 있으면 댓글로 적어주세요.
지금까지 짠 코드는 하나의 클래스와 헤더파일에 전부 몰려있기 때문에 이를 분리해서 프레임워크를 제작해보자.이것만 해도 2D 게임을 만드는 주축이 된다고 해도 무방하다.파일 구조는 다음과 같다. GraphicsGraphics 라는 클래스는 그래픽스와 관련된 모든 디바이스 를 관리하는 클래스가 될 것이다. 가장 공통적인 내용을 가지고 있을 것이다.#pragma onceclass Graphics{public: Graphics(HWND hwnd); ~Graphics(); void RenderBegin(); void RenderEnd(); ComPtr GetDevice() { return _device; } ComPtr GetDeviceContext() { return _deviceContext; }private..
행렬 기초행렬을 처음 이해할 때, 하나의 포탈이라고 이해하면 편하다. 만약 어떤 물체가 Scale이라는 행렬 포탈안에 들어가게 된다면 물체의 Scale이 조정이 되는 것이다. 만약 Rotation에 들어가게 된다면 회전을 하게되는 것이다.즉, 하나의 변화를 나타낸다 라는 개념으로 이해하면 된다.(게임에서) 행렬은 말 그대로 행(Row)과 열(Col)로 이루어진 수식을 의미한다.3개의 행이 있고 2개의 열이 있다면 3x2 행렬이라고 말한다.그리고 1행 1열 1행 2열 순으로 번호를 매긴다. 행렬에 대한 특징으로 행렬 M에 k를 곱하면 각 요소에 전부 다 k를 곱하는 특성을 가지고 있다.행렬의 덧셈 뺄셈은 각 위치끼리 더하고 빼기를 하게된다. 하지만 유의해야할 점은 행렬의 사이즈가 동일해야한다는 점이다.가장..
Constant Buffer상수 버퍼는 Vertex Shader 단계에서 변수를 사용하고 싶을 때 이용할 수 있는 녀석이다.그 전 포스팅에서 CreateGeometry 함수에서 도형에 대한 기하학정보를 하드코딩으로 정했다.근데 만약 우리가 진지한 게임을 만든다고 했을 때, 플레이어가 일일이 움직이는 것을 보정할 순 없는 노릇이다.왜냐하면 CPU에서 우리가 게임을 만든다고 하면 Update 문에서 1틱당 얼만큼의 위치 벡터를 곱해주는 형식으로 플레이어를 이동할 수 있겠지만 우리가 GPU에서 지금까지 작업하면서 했던 것중 하나는 바로 CPU의 정보를 GPU로 넘겨주는 것이었다. 그리고 우리가 작업할 때 Usage를 D3D11_USAGE_IMMUTABLE로 설정했다.이말은 즉슨, 1회성으로 CPU가 작업을 한..
이전 포스팅에서 VertexBuffer를 만들어서 건네줬는데 그 이외에 IndexBuffer도 있다.IndexBuffer에 대해 알아보자.IndexBuffer만약 우리가 사각형을 화면에 띄운다고 해보자.그러면 정점이 몇개가 필요할까? 4개가 아닌 6개가 필요하다. 그 이유는 삼각형 단위로 이루어져있기 때문이다. 그런데 지금 당장만 생각해도 되게 비 효율적일것 같다는 생각이 든다. 아무리 삼각형 단위로 계산한다고 해도 정말 큰 에셋이라면 정점이 수만가지가 될텐데 그걸 다 계산하기 쉽지않을 것이다.그래서 이럴경우를 대비해 정점마다 넘버링(인덱스)를 추가해서 관리하는 것이 IndexBuffer이다.사각형을 한번 만들어보자.필드에 정점을 아래와 같이 인덱스를 매기자. 1 3 0 2즉 012 / 123 두 개의 ..
더보기DirectX가 중요하다는 사실을 누구나 알고 있다. 어디서 중요하다고 해서 그렇든 학원에서 가르쳐주니까 그렇든 중요한 건 누구나 알고 있지만 스스로 혼자 독학하긴 쉽지 않다.그러니 나무를 보지 말고 숲을 봐야한다. DX의 경우 함수가 정말 많이 나오는데 함수가 어떤 역할을 하는지만 알고 인자 하나하나가 무엇인지 너무 고민하지 말아야 한다.  큰 틀을 공부하면 자연스레 깨달을 것이다.장치 초기화Direct3D 초기화의 시작은 Direct3D 11 장치(ID3D11Device)와 그 문백(ID3D11Device Context)를 생성하는 것이다.ID3D11Device 인터페이스는 기능 지원 점검과 자원 할당에 쓰인다.ID3D11DeviceContext 인터페이스는 렌더 대상을 설정하고, 자원을 그래픽..
랜더링에 대해 - GPU컴퓨터는 여러 부품을 가지고 있지만 그 중 3대 부품을 꼽자면 CPU, 메모리, 보조기억장치(SSD) 일 것이다. 우리가 맨 처음 운영체제를 설치하고나면 보조기억장치에 저장이 될 것이다. 그리고 컴퓨터를 실행하면 그 것을 메모리에 옮겨서 차지하게 된다. 우리가 본격적으로 프로그래밍을 통해 프로그램을 실행하면 로직은 CPU가 처리하고 그 안에 데이터를 보관 있는 것은 메모리이다. 이런 식으로 기본적으로 뭔가 진행하는데 있어서 중요한 3대 부품은 위와 같지만, 게임을 좋아하는 사람이라면 당연히 알 수 있듯이 GPU 역시 매우 중요하다.그림을 한번 바꿔서 CPU랑 GPU랑 무엇이 다르고 어떤 역할을 하는지 알아보자.근본적으로 CPU는 무언가를  "연산" 하기 위함이고 메모리는 "저장"하..
테스트 영상지금까지 약 4개월간 제작한 게임에 대한 테스트 영상이다.https://youtu.be/Ayq_w8Nptmc?feature=shared 유저는 약 1000명 까지는 무리 없이 동작하는 모습을 보였고, 아직 전투에 대한 긴박함은 없지만 RPG 게임에서의 필수적인 요소들은 전부 구현하고 최적화해봤다고 생각한다.얻은 것클라이언트 개발자로 공부를 해오면서 클라이언트를 잘 이해하기 위해서라도 서버에 대한 지식이 필수적이라는 생각이 들어, 온라인 게임을 직접 제작해 보았다. 이 과정에서 단순한 기술 시연을 위한 기능보다 네트워크, 운영체제, 데이터베이스 등 다양한 컴퓨터 과학(CS) 지식이 매우 중요하다는 것을 깨달았다. 개발은 데스크탑과 노트북을 번갈아 가며 진행했는데, 특히 노트북에서 로컬 서버와 유..
RPG 게임에서 보면 필수적으로 있는 것중 하나인 유저들간의 대화이다.대부분의 경우 채팅을 통해 의사소통을 하곤한다.따라서, 채팅을 한번 구현해보자. 채팅의 경우 서버의 역할이 따지고보면 크게 없다 그냥 어떤 플레이어가 어떤 말을 했는지 브로드캐스트 해주는 것이기 때문이다. 물론 전체채팅이나 유저가 매우 많을 경우 최적화가 반드시 필요할 것이다. 이유는 플레이어의 움직임 동기화랑 같은 맥락이다.따라서 필자는 주변에 있는 플레이어들만 대화할 수 있게 구성한다. 채팅 UI검정 배경에 채팅들이 쌓일 것이며 전송을 통해 내가 친 채팅을 보낼 수 있다.물론 InputField에 포커싱에 되어있을 경우엔 엔터를 통해서 포커싱할 수 있으며, 포커싱이 되어 있는 중에는 플레이어의 키 입력을 전부 막는다.(인벤 열기 등..
지난 포스팅에서는 퀘스트를 수락하고 진행과정을 추적하며 클리어하는 시스템을 구축해봤다.이제 퀘스트를 DB에 저장해서 플레이어가 로그인할 때, 퀘스트를 불러와보자.Quest DB 모델[Table("Quest")]public class QuestDb{ public int QuestDbId { get; set; } public int TemplateId { get; set; } public bool IsFinish { get; set; } public bool IsCleard{ get; set; } public int QuestType { get; set; } public ICollection Goals { get; set; } [ForeignKey("Player")] ..
이전 포스팅에서 더이상 컨텐츠를 개발하지 않고 마무리 하기로 했으나, Rpg 게임에서 퀘스트 시스템을 만들지 않는건 예의가 아닌것 같아 퀘스트까지만 만들기로 했다.퀘스트 시스템 흐름 분석퀘스트를 획득하는 시스템을 구상할 때 흐름을 분석해보자.클라이언트 플레이어가 퀘스트 Npc에게 퀘스트를 수락 받음.서버쪽으로 플레이어가 퀘스트를 수락했다고 보냄.실제로 그 Npc가 해당 퀘스트를 가지고 있는지 검증(위치 포함)문제가 없다면 서버쪽 플레이어에게 퀘스트를 추가.그리고 클라이언트 플레이어에게 정상적으로 퀘스트가 추가됐으니 알려줌.클라이언트 플레이어의 퀘스트 매니저에 추가하고 퀘스트 UI 등을 업데이트 해줌.요런 흐름을 가지고 있다. 그렇다면 퀘스트 진행사항을 추적하는 경우는 어떻게 할까?각 퀘스트 타입에 맞는 ..
Mintriever
어제보다 성장한 나