이제 이번 게임의 요소 중 마지막인 골대의 구현입니다.
골대의 기능은 이렇습니다.
- 좌우로 이동(왼쪽 끝에 도착하면 우측이로 이동, 우측끝에 도착하면 좌측으로 이동)
- 일정한 시간/일정한 이동으로 이동
- 골대의 길이 조정 가능
먼저 골대의 구조체를 선언합니다.
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 |
실행시켜보면 좌우로 움직이는 골대를 확인할 수 있다.
'Software Development > C, C++' 카테고리의 다른 글
C언어로 게임만들기 - 5. 첫번째 게임_5)코드정리 (3) | 2017.03.28 |
---|---|
C언어로 게임만들기 - 5. 첫번째 게임_4)충돌처리 (1) | 2017.03.21 |
C언어로 게임만들기 - 5. 첫번째 게임_2)Ball 만들기 (0) | 2017.03.19 |
C언어로 게임만들기 - 5. 첫번째 게임_1)Player 만들기 (3) | 2017.03.19 |
C언어로 게임만들기 - 4. 코드정리(전체코드) (3) | 2017.03.18 |