일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Direct3D12
- FrameResource
- DirectX
- 절두체 컬링
- Frustum Culling
- 노멀 맵핑
- TCP/IP
- Dynamic Indexing
- 네트워크 게임 프로그래밍
- light
- 게임 프로그래밍
- 디퍼드 렌더링
- 게임 클래스
- 게임 디자인 패턴
- 조명 처리
- Render Target
- 직교 투영
- C++
- 큐브 매핑
- 동적 색인화
- gitscm
- Deferred Rendering
- InputManager
- direct3d
- effective C++
- 네트워크
- gitlab
- DirectX12
- 입방체 매핑
- 장치 초기화
- Today
- Total
코승호딩의 메모장
[Game 클래스] 본문
메인 루프(메인 쓰레드, 게임 쓰레드)란 과연 무엇일까? 게임은 응용 프로그램이 종료되지 않도록 지속적으로 무한 루프를 돌며 실행하는 구조이다. 위 구조는 렌더링이 중요한 응용 프로그램에서 동일하게 적용이 된다.
오른쪽 그림은 간단한 OpenGL 코드를 이용한 응용 프로그램이다. 이 프로그램 또한 하는 일은 하나의 점 밖에 찍고 있지 않지만 계속 루프를 돌며 종료되지 않도록 하고 있다. OpenGL에서는 흔히 GLUT라는 메인 루프를 사용하고 있으며 이 메인 루프에서는 다른 쓰레드에서 이벤트가 들어왔다는 전달을 받을 것이다. 이러한 쓰레드 들이 왼쪽 그림에 나타난 Display, Idle, Keyboard, Mouse, Special 이벤트 등의 부가적인 콜백 함수이다.
int main(int argc, char **argv)
{
// Initialize GL things
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(0, 0);
glutInitWindowSize(500, 500);
glutCreateWindow("Game Software Engineering KPU");
glewInit();
if (glewIsSupported("GL_VERSION_3_0"))
{
std::cout << " GLEW Version is 3.0\n ";
}
else
{
std::cout << "GLEW 3.0 not supported\n ";
}
// Initialize Renderer
g_Renderer = new Renderer(500, 500);
if (!g_Renderer->IsInitialized())
{
std::cout << "Renderer could not be initialized.. \n";
}
glutDisplayFunc(RenderScene);
glutIdleFunc(Idle);
glutKeyboardFunc(KeyInput);
glutMouseFunc(MouseInput);
glutSpecialFunc(SpecialKeyInput);
glutMainLoop();
delete g_Renderer;
return 0;
}
우선 가장 기본적인 메인 코드이다. 신경 쓸 부분은 glutMainLoop 부분밖에 없다. 프로그램이 종료될 때 까지 glutMainLoop가 무한으로 돌아가게 된다. 그리고 glutDisplayFunc부터 glutSpecialFunc까지는 콜백 함수이며 해당 이벤트 발생 시 내부 매개 변수가 되는 함수를 호출하게 된다. 그리고 간단하게 하기 위해서 렌더 루프나 피직스 루프는 따로 두지 않고 그냥 메인 루프 내에 모두 둘 예정이다. 현재는 g_Renderer라는 Renderer 클래스를 통해서 화면을 그리고 있는 중이다.
이번 카테고리에서는 자세한 OpenGL 사용법이나 게임 기법을 설명하는 것이 아니라 Git을 통한 형상 관리 또는 게임의 틀 구현을 목표로 하기 때문에 Renderer 클래스의 세부적인 내용은 추가하지 않도록 하겠다.
다음으로는 Game 클래스라는 것을 구현할 것인데 이 클래스는 오브젝트 클래스나 피직스 클래스와 같은 클래스들을 Game 클래스 안에 모두 넣을 것이다. 즉 모든 클래스의 기반이 되는 클래스이다. 이번 포스팅에서는 Game 클래스에 Renderer 클래스를 이동시켜 놓은 후 몇 가지 도형을 그리는 멤버 함수를 추가하도록 할 것이다.
Game 클래스 구현
#include "Renderer.h"
class GSEGame
{
public:
GSEGame(int windowSizeX, int windowSizeY);
virtual ~GSEGame();
void DrawAll();
private:
std::unique_ptr<Renderer> mRenderer;
};
우선 GSEGame 클래스를 추가하여 Renderer 타입의 멤버 포인터 변수를 하나 선언하였으며, 기존의 Renderer 변수를 GSEGame 변수가 대체하여 내부에서 멤버 변수 mRenderer의 함수를 사용하도록 변경하였다.
'게임 소프트웨어' 카테고리의 다른 글
[Object 클래스] (0) | 2023.10.04 |
---|---|
[GitLab 연동] (0) | 2023.09.25 |
[소프트웨어 공학] (0) | 2023.09.13 |
[Git을 통한 형상 관리] (0) | 2023.09.10 |