C++/Game 20

[게임 프레임워크 개발 일지] #8 편식 안 하고 뭐든 잘 먹는 Event

지난 포스팅에 이어서, return type / parameter type이 무엇이든 상관 없이 함수를 할당할 수 있는 Event를 설계할 겁니다. 정확히는, 지난 포스팅에서 std::vector를 parameter로 받는 void 함수만을 받도록 해서 구현했고 이번에는 정말 그 type이 뭐가 되든 상관 없는 Event를 구현해볼 겁니다. 미리 결론부터 봅시다. 그래서 구현 가능한가요? 일부는 예, 일부는 아니오 입니다. 다시 말하면 나름 구색은 갖출 정도로 구현은 가능하지만, 제약이 있습니다. 그럼 천천히 살펴봅시다. 제 기준이지만, 내용이 꽤 어렵습니다. 구현하고 싶은 결과물을 코드로 나타내면 이렇습니다. Event e([](int a, int b) { cout 그렇기 때문에, lambda 식은 이..

C++/Game 2022.07.24

[게임 프레임워크 개발 일지] #7 Variadic Template과 Lambda

게임 프레임워크에 한정되는 이야기는 아니지만, 개발하면서 헤매던 내용이라 정리할 겸 포스팅으로 올립니다. template은 어떤 타입이 함수나 클래스에 오더라도 대응할 수 있게 해줍니다. 그만큼 강력하고, 또 그만큼 어렵습니다. 제 게임 프레임워크에서 template을 주로 사용하는 클래스는 Entity와 Event 였습니다. Entity는 Component로 구성되어 있습니다. 벽과 상자는 모두 충돌 판정이 필요하고 (Collidable), 그릴 그래픽이 있지만 (Drawable) 벽은 이동하지 않고 상자는 플레이어가 민다든지 하는 작용으로 이동할 수도 있습니다 (Movable). 상호작용이 필요할 수도 있겠네요. (Interactable) 물론 게임마다 다르겠지만 말입니다. 괄호 속에 병기한 클래스들..

C++/Game 2022.07.20

[게임 프레임워크 개발 일지] #6 SFML의 버튼 GUI와 죽이고픈 마우스 이벤트

SFML에서는 공식적으로 제공하는 GUI가 없습니다. SFML은 멀티미디어 라이브러리지, GUI 라이브러리가 아닙니다. 물론 구글링을 조금만 해도 구현하는 예시들을 많이 찾아볼 수 있지만, 정해진 길이 없다는 것이 난처합니다. 게임을 만들다보면 으레 필수가 되는 GUI들은 여기서도 미리 구현을 해두려고 합니다. Button이나 TextInput 같은 게 있겠네요. 지난 포스트에서 긁어와서 쓴 RichText 또한 이런 부류에 해당됩니다. 이번에는 Button을 만들겠습니다. 제목에서 죽이고픈 마우스 이벤트라고 했듯이, 구현할 게 많아서 시간을 좀 오래 썼고 포스팅을 오래 안 한 이유이기도 합니다. 구현이 어려운 건 아니지만, 너무 귀찮거든요. * 글을 다 쓰고 느꼈습니다. 구현도 어렵네요. * Butto..

C++/Game 2022.05.15

[Physics] 2D 충돌 감지 구현하기 (2D Collision Detection) - Part 2

지난 번에 이어, Part 2입니다. 기본적인 구성 요소는 Part 1에서 모두 구현했기 때문에, 이번에 다룰 내용은 Part 1의 간단한 응용에 지나지 않습니다. 1. RoundRect 모서리가 둥근 사각형을 구현하기 위해서는 우리가 잘 아는, 이미 정의된 도형들로 Decomposition을 해줄 필요가 있습니다. 오늘 다룰 두 가지 도형들은 모두 이렇게 decomposition이 필요합니다. RoundRect같은 경우에는 이 과정이 매우 간단한 편에 속합니다. 사각형의 width와 height, 네 귀퉁이에 그릴 원의 반지름 r은 사용자가 결정하게끔 해줍시다. 전체 너비 및 높이의 합이 width + r, height + r이 되도록 속성을 분리해줘도 좋고, 전체 너비 및 높이를 width, heig..

C++/Game 2022.04.10

[Physics] 2D 충돌 감지 구현하기 (2D Collision Detection) - Part 1

안녕하세요.오늘은 C++로 2D 충돌 처리를 구현해봅시다.Part 1에서는 AABB, 원, 볼록 다각형을 구현해보고Part 2에서는 요걸 응용해서 RoundRect나 오목 다각형도 만들어 볼겁니다. Reference- https://gamedevelopment.tutsplus.com/series/how-to-create-a-custom-physics-engine--gamedev-12715 How to Create a Custom Physics Engine - Envato Tuts+ Game Development TutorialsThere are many reasons you might want to create a custom physics engine: first, learning and honing ..

C++/Game 2022.04.09

[게임 프레임워크 개발 일지] #5 Multi Style이 적용된 Text

SFML에서의 텍스트는 Text 클래스를 사용하면 되지만, 그대로 쓰기에는 문제점이 있습니다. 첫 번째 문제는, 스타일이나 색깔을 객체 하나 당 하나씩만 쓸 수 있다는 점입니다. 보통 여러 개의 스타일을 혼합해서 쓸 수 있게 해주는 텍스트를 RichText라고 부르는 데, SFML에는 기본적으로 이런 RichText가 존재하지 않습니다. 그러니 직접 만들어야 합니다. Text에 스타일을 하나만 적용할 수 있다고 했으니, Text 객체를 여러 개 만들어서 처리해야 합니다. 여간 귀찮은 일이 아니군요. 그래서 전지전능한 구글에 검색해서 누군가가 미리 만든 것을 github에서 찾을 수 있었습니다. source: https://github.com/skyrpex/RichText 이 RichText는 스타일과 텍..

C++/Game 2022.02.18

[게임 프레임워크 개발 일지] #4 Entity와 Component

ECS를 정석대로 구현하면, Component는 Entity의 tag 역할만 수행하고, 실제 상호작용은 System에서 이루어집니다. 다만 이러한 ECS가 나를 위한 해답이 될지는, 경우에 따라 다릅니다. 저같은 경우에도, Component에 기능을 조금 추가할 필요가 있었습니다. 처음 설계에 Renderable을 Component에 추가했기 때문에, (이게 좋지 않은 방향이어서 그랬는지는 몰라도) 그래픽 포인터를 안전하게 할당하기 위한 함수를 정의했습니다. 이번 포스팅에서는 Entity와 Component 관련 파트를 만들면서 사용한 방법을 정리하겠습니다. 처음 윈도우 창 (이하 Window)을 정의할 때는 Component로 정의했습니다. 시스템 관련으로 Component를 더 정의할 가능성이 있다고..

C++/Game 2022.02.06

[게임 프레임워크 개발 일지] #3 EventManager 설계

제가 생각한 EventManager의 구조는 이렇습니다. 1] Event Type은 sf::Event와 sf::String 두 가지이다. sf::Event는 기본적인 시스템 이벤트에, sf::String은 커스텀 이벤트에 해당합니다. 두 가지 클래스를 한 컨테이너에 넣어두기는 힘들기 때문에, 각각에 대한 컨테이너를 만들어야 했습니다. 2] Event Type에 따라 Event는 여러 개 사용할 수 있다. 하나씩만 사용했다간 분명 문제가 있을 것 같아서 컨테이너를 더 끼워넣었습니다. 각 이벤트 함수에 대한 ID는 심플하게 unsigned int로 했습니다. 그냥 int를 사용해도 됐는데, 음... 왜 이랬는지는 기억 안남. 함수 객체에 대한 ID를 생성해서 Event 객체만 제시하면 알아서 추가/삭제가 가..

C++/Game 2021.12.31

[게임 프레임워크 개발 일지] #2 SFML의 렌더링 정체와 Multi Thread

SFML 라이브러리에서 제공하는 기본적인 시스템 루프는 다음과 같습니다. 1. 대기 중인 Event Queue에서 처리할 이벤트를 하나 가져와서 처리한다. 처리할 이벤트가 없다면 2번으로 넘어간다. 2. 그래픽 렌더링을 처리한다. 3. 윈도우가 열려 있는 동안, 위 과정을 반복한다. 여기서 이벤트를 갖고 오기 위해 사용하는 메서드가 pollEvent입니다. waitEvent는 현재 처리할 이벤트가 없는 경우, 이벤트가 발생할 때까지 대기하는 반면, pollEvent는 처리할 이벤트가 없다면 기다리지 않고 넘어갑니다. 문제가 발생하는 지점도 비슷합니다. 이벤트를 빠르게 처리했거나 처리할 이벤트가 없다면, 바로 2번으로 넘어가 렌더링을 수행할 수 있습니다. 다만 처리할 이벤트가 너무 많은 경우에는 렌더링으로..

C++/Game 2021.12.17

[게임 프레임워크 개발 일지] #1 Roadmap

몇 달쯤 전부터 게임 엔진을 만들어야겠다는 생각을 하게 되었습니다. 말은 게임 엔진이지만, 사실 그리 거창한 건 아니라서 물음표를 붙였어요. * 2022-02-13 수정 : 그리고 프레임워크라고 보는 게 맞겠다는 생각에 제목을 다 수정했지. 글은 귀찮으니 수정 안함 으레 게임 엔진이라고 하면 Unity나 Unreal Engine을 떠올리기 마련인데, 지금 구상 중인 게임 기획은 상용 엔진에서 구현하기엔 무리가 있더군요. Unreal Engine은 사실 3D 게임을 위한 엔진입니다. 아직 우리 팀은 제작 팀이라기보다 생초짜 두 명이 재밌는 거 해보겠다고 뭉친 게 전부인지라, 3D를 할 깜냥도 안 되고, Unreal을 써야겠다고 느낄만한 기획도 해 본적이 없습니다. Unity Engine은 기본은 3D이지만..

C++/Game 2021.12.16