코승호딩의 메모장

[Game 클래스] 본문

게임 소프트웨어

[Game 클래스]

코승호딩 2023. 9. 13. 21:00

메인 루프(메인 쓰레드, 게임 쓰레드)란 과연 무엇일까? 게임은 응용 프로그램이 종료되지 않도록 지속적으로 무한 루프를 돌며 실행하는 구조이다. 위 구조는 렌더링이 중요한 응용 프로그램에서 동일하게 적용이 된다. 

오른쪽 그림은 간단한 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