Software Development/C, C++

C언어로 게임만들기 - 5. 첫번째 게임_3)움직이는 골대 만들기

huiyu 2017. 3. 20. 22:57

이제 이번 게임의 요소 중 마지막인 골대의 구현입니다.

골대의 기능은 이렇습니다.

- 좌우로 이동(왼쪽 끝에  도착하면 우측이로 이동, 우측끝에 도착하면 좌측으로 이동)
- 일정한 시간/일정한 이동으로 이동
- 골대의 길이 조정 가능

먼저 골대의 구조체를 선언합니다.

1
2
3
4
5
6
7
8
9
typedef struct GoalPost
{
    Position position;
    int nLength;
    int nLineX[7];
    int nDist;
    clock_t moveTime;
    clock_t oldTime;
}GoalPost;
cs

-position : 골대의 기준 좌표
-nLength : 골대의  길이
-nLineX[7] : 골인 라인의 좌표(골대의 길이에  따라 골인라인 출력을 위해 배열로 선언)
-nDist:골대의 이동 거리
-moveTime,oldTime:골대의 이동 시간을 정의하기 위한 시간

이전과 마찬가지로 Init()에서 초기화 해줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
GoalPost g_Post;
 
void Init()
{
    InitFPSData(&fpsData);
    //플레이어 초기화
    ...
 
    //Ball 초기화
    ...
 
    //Goal-Post 초기화
    g_Post.position.x = 20;
    g_Post.position.y = 3;
    g_Post.nLength = 1;
    g_Post.moveTime = 100;
    g_Post.oldTime = clock();
    g_Post.nDist = 1;
 
    int nLength = g_Post.nLength * 2 + 1;
    for (int i = 0; i < nLength; i++)
    {
        g_Post.nLineX[i] = g_Post.position.x + 2 * (i + 1);
    }
}
cs

- position.x, position.y : 처음 출력될 좌표값
- nLength : 골대 기본 길이, 1
- moveTime=100, oldTime : 100ms 단위로 움직이게  설정
- nDist : 골대가 100ms마다 움직이는 거리는 1

그리고 이부분

1
2
3
4
5
int nLength = g_Post.nLength * 2 + 1;
for (int i = 0; i < nLength; i++)
{
    g_Post.nLineX[i] = g_Post.position.x + 2 * (i + 1);
}
cs

nLength가 실제 그려질 골대 길이이다.

아래와 같이 그려지는데,
"□━━━□"

가운데 한개의 골대는 기본으로 그려지고, 그 양 옆에 g_Post.nLength(1)만큼 그려주게 된다.
"□━ [━] ━□"

사이즈를 2로 늘리면 아래와 같이 된다.
"□━━ [━] ━━□"

그래서 위 코드의 for문 내용은
nLineX[i]에 계산한 골라인의 길이(3)만큼 순서대로 라인의 좌표를 넣어주고 있는 것이다.

*g_Post.position.x를 기준으로 한칸씩 옆에 값, 단 칼럼값은 2이므로 *2를 해주고 있다.


다음 Render()함수에서 골대를 그려주면 된다.

1
2
3
4
5
6
/*Draw Goal-post*/
ScreenPrint(g_Post.position.x, g_Post.position.y, "□");
int nLength = g_Post.nLength * 2 + 1;
for (int i = 0; i < nLength; i++)
    ScreenPrint(g_Post.nLineX[i], g_Post.position.y, "━");
ScreenPrint(g_Post.nLineX[nLength - 1+ 2, g_Post.position.y, "□");
cs

line 2:왼쪽 골포스트출력(position.x, position.y)
line3~line5:골대길이만큼 골라인 출력
line6:골라인다음 칼럼(+2)에 오른쪽골 포스트 출력


실행시켜 보면 골대가 잘 그려지는 것을 확인할 수 있다.


이제 이 골대를 좌우로 움직여주면 된다.
구현은 이전 공의 움직임과 같은 방식으로 처리해주면 된다.

현재 update 되는시간이 이전 update 이후 100ms가 지났을  경우,(line 9)
position.x 값에 nDist(이동거리)만큼 움직여주면 된다.(line 15)

단, 왼쪽 끝/오른 쪽 끝에 도달한 경우 방향을 바꿔준다.(line 13, line 23)

코드로 보면,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#define GAME_MAX_WIDTH 40
void Update()
{
    //공의 이동처리
    ...
 
    //골대의 
    clock_t CurTime = clock();
    if (CurTime - g_Post.oldTime > g_Post.moveTime)
    {
        int nLength = g_Post.nLength * 2 + 1;
        g_Post.oldTime = CurTime;
        if (g_Post.position.x + g_Post.nDist >= 0 && ((g_Post.nLineX[nLength - 1+ 3+ g_Post.nDist)<=GAME_MAX_WIDTH)
        {
            g_Post.position.x += g_Post.nDist;
            for(int i = 0; i < nLength; i++)
            {
                g_Post.nLineX[i] = g_Post.position.x + 2 * (i + 1);
            }
        }
        else
        {
            g_Post.nDist *= (-1);
        }
    }
}
cs


실행시켜보면 좌우로 움직이는 골대를 확인할 수 있다.


728x90