이제 C언어로 게임 개발을 위한 기본적인 틀은 완성하였다.
게임 개발에 들어가기 전, 코드를 정리하자.
먼저 게임의 기본적인 구조를 갖고 있는 game.c 파일이다.
이전까지 해오던 작업에서 코드만 좀더 정리했다.
game.c
#include<stdio.h>
#include<time.h>
#include<conio.h>
#include"screen.h"
#include"fps.h"
FPSData* fpsData;
void Init()
{
InitFPSData(&fpsData);
}
void Update()
{
}
void Render()
{
ScreenClear();
DrawFPS(&fpsData);
ScreenFlipping();
}
void Release()
{
DestoyFPSData(&fpsData);
}
void WaitRender(clock_t OldTime)
{
clock_t CurTime;
while (1)
{
CurTime = clock();
if (CurTime - OldTime > 33)
break;
}
}
int GetKeyEvent()
{
if (_kbhit())
return _getch();
return -1;
}
void KeyProcess(int key)
{
switch (key)
{
case 'i':
break;
case'j':
break;
}
}
int main()
{
ScreenInit();
Init();//초기화
while (1)
{
int nKey = GetKeyEvent();
if (nKey == 'q')
break;
KeyProcess(nKey);
Update();//데이터 갱신
Render();//화면 출력
WaitRender(clock());
}
Release();//해제
ScreenRelease();
return 0;
}
다음 렌더링을 처리하는 screen.h. screen.c
sceen.h
void ScreenInit();
void ScreenFlipping();
void ScreenClear();
void ScreenRelease();
void ScreenPrint(int x, int y, char* string);
void SetColor(unsigned short color);
screen.c
#include <windows.h>
static int g_nScreenIndex;
static HANDLE g_hScreen[2];
void ScreenInit()
{
CONSOLE_CURSOR_INFO cci;
//화면 버퍼 2개를 만든다.
g_hScreen[0] = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
g_hScreen[1] = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
//커서 숨기기
cci.dwSize = 1;
cci.bVisible = FALSE;
SetConsoleCursorInfo(g_hScreen[0], &cci);
SetConsoleCursorInfo(g_hScreen[1], &cci);
}
void ScreenFlipping()
{
SetConsoleActiveScreenBuffer(g_hScreen[g_nScreenIndex]);
g_nScreenIndex = !g_nScreenIndex;
}
void ScreenClear()
{
COORD Coor = { 0,0 };
DWORD dw;
FillConsoleOutputCharacter(g_hScreen[g_nScreenIndex], ' ', 80 * 25, Coor, &dw);
}
void ScreenRelease()
{
CloseHandle(g_hScreen[0]);
CloseHandle(g_hScreen[1]);
}
void ScreenPrint(int x, int y, char* string)
{
DWORD dw;
COORD CursorPosition = { x, y };
SetConsoleCursorPosition(g_hScreen[g_nScreenIndex], CursorPosition);
WriteFile(g_hScreen[g_nScreenIndex], string, strlen(string), &dw, NULL);
}
void SetColor(unsigned short color)
{
SetConsoleTextAttribute(g_hScreen[g_nScreenIndex], color);
}
다음 fps출력을 했던 fps.h, fps.c 따로 파일을 분리했다.
fps.h
#include<malloc.h>
#include<stdio.h>
#include<time.h>
typedef struct FPSData
{
clock_t fpsCurTime, fpsOldTime;
int frameCnt;
char *fpsTextBuffer;
}FPSData;
void InitFPSData(FPSData** fpsData);
void DrawFPS(FPSData** fpsData);
void DestoyFPSData(FPSData** fpsData);
fps.c
#include"fps.h"
void InitFPSData(FPSData** fpsData)
{
(*fpsData) = (FPSData*)malloc(sizeof(FPSData));
(*fpsData)->frameCnt = 0;
(*fpsData)->fpsTextBuffer = (char*)malloc(sizeof(char) * 10);
sprintf((*fpsData)->fpsTextBuffer, "FPS:%d", (*fpsData)->frameCnt);
(*fpsData)->fpsOldTime = clock();
}
void DrawFPS(FPSData** fpsData)
{
//출력코드
(*fpsData)->frameCnt++;
(*fpsData)->fpsCurTime = clock();
if ((*fpsData)->fpsCurTime - (*fpsData)->fpsOldTime >= 1000)
{
sprintf((*fpsData)->fpsTextBuffer, "FPS:%d", (*fpsData)->frameCnt);
(*fpsData)->fpsOldTime = clock();
(*fpsData)->frameCnt = 0;
}
ScreenPrint(0, 0, (*fpsData)->fpsTextBuffer);
}
void DestoyFPSData(FPSData** fpsData)
{
free((*fpsData)->fpsTextBuffer);
free(*fpsData);
}
728x90
'Software Development > C, C++' 카테고리의 다른 글
C언어로 게임만들기 - 5. 첫번째 게임_2)Ball 만들기 (0) | 2017.03.19 |
---|---|
C언어로 게임만들기 - 5. 첫번째 게임_1)Player 만들기 (3) | 2017.03.19 |
C언어로 게임만들기 - 3. 렌더링 기능 구현 (2) | 2017.03.15 |
C언어로 게임만들기 - 2. 게임 프로그래밍 용어 (0) | 2017.03.14 |
C언어로 게임만들기 - 1. 게임 기본구조 (3) | 2017.03.14 |