Software Development/C, C++

C언어로 게임만들기 - 5. 첫번째 게임_2)Ball 만들기

huiyu 2017. 3. 19. 19:51

이제 Player는 완성됐고, player에서 발사하는 ball을 만들면 된다.
ball의 구현은 간단하다. 

처음 대기상태(isReady=1)로 만든 후, 발사(f키)를 하게 되면 상태 변경(isReady=0).
isReady가 0일 때, 현재 player 좌표를 기준으로 y--를 통해 위로 올라가는 모습을 구현하면 된다.


먼저 ball 자료구조를 만든다.

1
2
3
4
5
6
7
8
9
typedef struct Ball
{
    int isReady;
    Position position;
    clock_t moveTime;
    clock_t oldTime;
}Ball;

Ball g_Ball;
cs

-isReady : 볼의 상태, (0:발사상태, 1:대기상태)
-position : 볼의 현재 좌표
-moveTime : move되는 시간 간격 지정(100ms)
-oldTime : 마지막 움직인 시간(이 시간을 기준으로 움직이게 된다)
*(CurTime-oldTime>moveTime)-> 이동 알고리즘 정의


Init() 내부에서 ball 변수 초기화
isReady는 발사 전 대기상태이므로 1, position은 현재 player의 위치 좌표를 넣어준다.
moveTime은 100ms

1
2
3
4
5
//Ball 초기화
g_Ball.isReady = 1;
g_Ball.position.x = g_Player.position.x;
g_Ball.position.y = g_Player.position.y - 1;
g_Ball.moveTime = 100;
cs


볼의 움직임 처리

isReady가 0일 때(발사 했을 경우), 시간을 체크한다. 
현재 시간(CurTime)이 이전 업데이트 된 시간(g_Ball.oldTime)의 차가 moveTime(100ms)가 되었을 경우 움직이는 알고리즘 적용.

*움직이는 알고리즘
position.y--;를 통해 상단으로 올라가는 공을 구현한다.(line 11~12)
공이 0보다 작아졌을 경우는 다시 상태 초기화.(Player위치로 이동-line 16~18)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void Update()
{
    //공의 이동처리
    clock_t CurTime = clock();
    if (g_Ball.isReady == 0)
    {
        if ((CurTime - g_Ball.oldTime) > g_Ball.moveTime)
        {
            if (g_Ball.position.y > 0)
            {
                g_Ball.position.y--;
                g_Ball.oldTime = CurTime;
            }
            else
            {
                g_Ball.isReady = 1;
                g_Ball.position.x = g_Player.position.x;
                g_Ball.position.y = g_Player.position.y - 1;
            }
        }
    }
}
cs


Render

볼을 화면에 그려준다. 볼의 현재  position을 기준으로 출력.

1
ScreenPrint(g_Ball.position.x, g_Ball.position.y, "◎");
cs


KeyboardProcess

k키가 눌렸을 때 현재 player좌표로 볼의 position을 설정해주고, isReady=1을 넣어준다.

1
2
3
4
5
6
7
8
9
10
    case'k':
        if (g_Ball.isReady)
        {
            g_Ball.position.x = g_Player.position.x;
            g_Ball.position.y = g_Player.position.y - 1;
            g_Ball.oldTime = clock();
            g_Ball.isReady = 0;
        }
        break;
    }
cs

또한 j,l키로 이동중에 볼이 아직 발사되지 않았을 경우 플레이어를 따라갈 수 있도록 아래와 같이 추가한다.

1
2
3
4
5
if (g_Ball.isReady)
{
    g_Ball.position.x = g_Player.position.x;
    g_Ball.position.y = g_Player.position.y - 1;
}
cs

여기까지가 ball의 구현, 실행시키면 아래와 같이 확인할 수 있다.


728x90