ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 게임개발 1-많이 쓰는 기능들
    게임개발 2021. 2. 27. 10:39

    헤더

     

    일단 windows.h는 무조건 넣는다. 아래의 필수 함수들 중에서 대부분이 windows.h에 있는 함수들이다.

    물론 입출력용으로 cstdio나 iostream을 안넣으면 망한다.

    그래픽을 신경쓴다면 색을 넣기 위해 conio.h도 넣도록 하자.

    그 외 필요한 기능을 넣어주면 된다(내가 쓰는 visual studio에는 bits/stdc++.h가 없다)

     

    필수

    이미 있는 함수들

    1. Sleep()

    말 그대로 잠시 주무시는 것이다. 이 동안은 아무 것도 하지 않는다. 너무 빨리 지나가버리면 볼 수가 없기 때문에 약간의 딜레이가 필요한 순간은 분명히 온다.

    Sleep(1000)의 경우 1000ms를 주무신다.

     

    2. system("cls")

     

    화면을 모조리 지워버리는 함수이다. 이를 외우기 귀찮았기에 clear()라는 1줄짜리 함수를 만들어서 사용하고 있다.

     

    void clear(){

    system("cls");

    }

     

    3. _getch();

     

    char형 변수 하나를 반환한다. 인수는 없고, 그냥 입력받는 함수이다. 다만 단순한 scanf와의 차이점은, 입력된 문자가 화면에 표시되지 않는다는 점이다. 캐릭터를 왼쪽으로 움직이려고 'a'를 눌렀는데, 화면에 'a'가 뜬다고 생각해보면, 굉장히 거슬리는 일이 될 것이다. 이 외에도 기능은 많다. press any key to start라는 문구를 띄운 뒤에 이 함수 한 번만 실행해주면 아무 키나 누를 때까지 기다린다. 전까지는 앞에 언더바가 없었는데 최근에 바뀌었는지 언더바가 없으면 에러가 나서 지금까지 만든 모든 게임을 수정해야 했던 비화가 있다.

     

    따로 정의가 필요한 함수들

    1. gotoxy(int x,int y)

     

    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    void gotoxy(int x, int y) {
    static COORD CP;
    CP.X = x;
    CP.Y = y;
    SetConsoleCursorPosition(hOut, CP);
    }

     

    몇 줄 안되는 거 위에 추가만 해주면 된다. 애초에 보드판 상황이 바뀌었다고 싹다 갈아엎고 다시 출력하면 렉이 겁나게 걸리므로 커서를 옮겨서 그 칸만 바꾸는 바람직한 행동을 하자.

     

    준필수

     

    게임제작에 무조건 필요한 것은 아니지만 웬만한 게임에서 내가 쓰는 함수들이다.

    1. oneprint()

    string str = "";
    void oneprint() {
    for (int i = 0; str[i]; i++) {
    printf("%c", str[i]);
    Sleep(20);
    }
    }

     

    str이라는 string을 정의하고 한 글자씩 출력해 준다. 0.02초라는 수치는 대충 정한 것이고, 원하는 대로 바꾸거나 아예 인수로 받아도 무방하다. 지금 생각해보면 str도 인수로 받으면 더 좋긴한데 이걸 바꾸려면 지금까지 만든 게임들을 전부 갈아엎어야 하므로 접도록 하자. 뭔가 한글자씩 나오면 그냥 뚝 하고 나오는거보다 퀄이 좋아보인다(고 개인적으로 느낀다)

    2. 커서 없애기

    CONSOLE_CURSOR_INFO CurInfo;

    CurInfo.dwSize=1;

    CurInfo.bVisible=FALSE;

     

    함수 이름이 있는 건 아니고 main함수 처음에 저 3줄만 추가해주면 된다. 커서를 없애는 기능인데, gotoxy문을 실행한 후에 그 위치에 커서가 남으면 상당히 거슬린다. 그래서 커서가 안보이면 좀더 화면이 깔끔해진다.

     

    3. _kbhit()

     

    키보드가 눌렸는지를 판단해주는 함수이다. 이 함수가 굉장히 _getch()와 연결고리가 많은데, 실시간으로 변동되지는 않는 게임(예를 들자면 지뢰찾기나 턴제 게임 등)에서는 실시간으로 키보드를 눌렀는지 판단할 필요가 없다. 다만 실시간적인 변동이 필요한 게임에서 필요한 함수이다. 예를 들어 방향키를 눌러 캐릭터를 조종한다고 하자. 여기서 방향키를 누르지 않더라도 다른 것들은 움직이고 있어야 하는데(몬스터 등), 다음과 같이 만약 누르지 않았다면 그냥 진행시키고, 눌렀다면 그 키를 입력받는 것이 가능하다.

    if(_kbhit()){

    ch=_getch();

    /*

    ch에 따른 다양한 명령들...

    */

    }

    4. 글자 색 변경


    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);

    저 7 자리에 7 대신 다른 숫자를 넣으면 글씨의 색이 바뀐다.뒤 8비트를 기준으로 글씨 색이 정해진다.총 8비트 중 앞 4비트는 글씨 배경색, 뒤 4비트는 글씨 자체의 색을 의미한다.이 4비트 중 첫 비트는 글씨의 밝기(1이면 글씨가 더 밝아진다), 뒤의 3비트는 각각 R(빨강), G(초록), B(파랑)을 의미한다.만약 어떤 공간을 일정한 색으로 채우고 싶다면, gotoxy를 통해 그곳으로 이동한 뒤에 글씨 배경색을 바꾸고, 공백을 출력해주면 된다.

    댓글

Designed by Tistory.