Software Development/C, C++

C언어로 게임만들기 - 4. 코드정리(전체코드)

huiyu 2017. 3. 18. 20:25

이제 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, 0NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
    g_hScreen[1= CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0NULL, 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(00, (*fpsData)->fpsTextBuffer);
}
 
void DestoyFPSData(FPSData** fpsData)
{
    free((*fpsData)->fpsTextBuffer);
    free(*fpsData);
}


728x90