raylib:pong게임
pong게임
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판이전 판다음 판 | 이전 판 | ||
raylib:pong게임 [2023/10/02 22:23] – 스코어그리기 이거니맨 | raylib:pong게임 [2023/11/20 00:29] (현재) – 이거니맨 | ||
---|---|---|---|
줄 1: | 줄 1: | ||
~~stoggle_buttons~~ | ~~stoggle_buttons~~ | ||
+ | |||
+ | |||
+ | {{: | ||
+ | |||
pong 게임을 만들어보자 | pong 게임을 만들어보자 | ||
줄 880: | 줄 884: | ||
</ | </ | ||
- | + | ==== 2. 스코어 점수 올리기 | |
- | === 다. 스코어 점수 올리기 === | + | === 가. 개념 |
이제 스코어를 표현하는 것은 했으니 스코어 점수를 올려야 할 것이다. | 이제 스코어를 표현하는 것은 했으니 스코어 점수를 올려야 할 것이다. | ||
줄 892: | 줄 896: | ||
이러한 왼쪽과 오른쪽 벽에 대한 충돌 판정은 이전에 ball클래스에서 했었다. 따라서 ball클래스에서 왼쪽과 오른쪽 벽의 충돌 판정값을 불러와야 할 것이다. | 이러한 왼쪽과 오른쪽 벽에 대한 충돌 판정은 이전에 ball클래스에서 했었다. 따라서 ball클래스에서 왼쪽과 오른쪽 벽의 충돌 판정값을 불러와야 할 것이다. | ||
+ | === 나. enum class 작성하기 === | ||
+ | |||
+ | 공이 어디에 부딪혔는지를 판단해야 하니까, 열거형을 클래스로 만들어서 리턴해줄 값을 구성하자. | ||
+ | |||
+ | ball.h에 다음과 같이 enum class를 만들자 | ||
+ | |||
+ | <code raylib> | ||
+ | enum class ColResult | ||
+ | { | ||
+ | None, Player, Enemy | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | === 다. 점수 획득 충돌 판정하여 리턴하기 === | ||
+ | |||
+ | 기존에는 ball이 양옆에 닿으면 x_speed값을 반전시키게 하였지만, | ||
+ | |||
+ | 따라서 다음과 같이 CheckCollision()함수를 변경하면 될 것이다. | ||
+ | |||
+ | <code raylib> | ||
+ | ColResult Ball:: | ||
+ | { | ||
+ | if (x - radius <= 0) | ||
+ | return ColResult:: | ||
+ | | ||
+ | if (x + radius >= screenWidth) | ||
+ | return ColResult:: | ||
+ | |||
+ | |||
+ | if ((y - radius <= 0) or (y + radius >= screenHeight)) {speed_y *= -1;} | ||
+ | |||
+ | return ColResult:: | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | 이 값은 Update()에서 불러오는 것이므로 Ball:: | ||
+ | |||
+ | === 라. 판정값 가져와서 점수 올리기 === | ||
+ | |||
+ | 이제 판정 값을 가져왔으므로 game.cpp에서 다음과 같이 각각의 점수를 올리면 된다. | ||
+ | |||
+ | <code raylib> | ||
+ | ColResult ballResult = ball.Update(); | ||
+ | |||
+ | if (ballResult == ColResult:: | ||
+ | { | ||
+ | PlayerScore++; | ||
+ | }else if(ballResult == ColResult:: | ||
+ | { | ||
+ | EnemyScore++; | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== 3. 게임 리셋하기 ==== | ||
+ | |||
+ | === 가. 개념 === | ||
+ | |||
+ | 공이 양 옆으로 빠지면 공과 플레이어 위치를 각각 원위치로 다시 세팅해주면 된다. 플레이어와 에네미는 이미 초기화하는 함수를 만들어 두었으므로 어렵지 않다 따라서 공의 Reset 함수를 만들면 된다. | ||
+ | |||
+ | 공은 리셋될때마다 다른 방향으로 튀게 할 것이므로, | ||
+ | |||
+ | === 나. 공의 리셋함수 === | ||
+ | |||
+ | ball.h에 reset()함수를 void로 선언하자. | ||
+ | |||
+ | 이후에 ball.cpp에 다음과 같이 함수를 만든다. | ||
+ | |||
+ | <code raylib> | ||
+ | void Ball:: | ||
+ | { | ||
+ | x = screenWidth / 2; | ||
+ | y = screenHeight / 2; | ||
+ | radius = 20; | ||
+ | |||
+ | int speed_choice[2] = {-1, 1}; | ||
+ | speed_x *= speed_choice[GetRandomValue(0, | ||
+ | speed_y *= speed_choice[GetRandomValue(0, | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | GetRandomValue는 레이라이브에서 제공하는 랜더 값 리턴 함수이다. 0부터 1까지 중에서 하나를 고르게 하는 것이다. | ||
+ | 우리는 speed_choice라는 int 배열 중에서 0과 1번째 값을 랜덤하게 고르게 된다. | ||
+ | 따라서 기존의 공의 스피드를 랜덤하게 반전시킬 수 있다. | ||
+ | |||
+ | === 다. game.cpp === | ||
+ | |||
+ | Update()함수 안에 다음과 같이 수정하면 된다. | ||
+ | |||
+ | <code raylib> | ||
+ | if (ballResult == ColResult:: | ||
+ | { | ||
+ | PlayerScore++; | ||
+ | ball.Reset(); | ||
+ | player.Init(); | ||
+ | AI.Init(); | ||
+ | }else if(ballResult == ColResult:: | ||
+ | { | ||
+ | EnemyScore++; | ||
+ | ball.Reset(); | ||
+ | player.Init(); | ||
+ | AI.Init(); | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== 4. 결론 ==== | ||
+ | |||
+ | {{: | ||
+ | |||
+ | 이제 게임을 완성하였다. | ||
+ | |||
+ | 완성된 소스파일은 다음과 같다. | ||
+ | |||
+ | {{ : | ||
+ | 여기까지 만들어봤으면 기본적인 객체지향에 대하여 이해가 되었을 것이다. | ||
+ | 이후에는 [[raylib: |
raylib/pong게임.1696252984.txt.gz · 마지막으로 수정됨: 2023/10/02 22:23 저자 이거니맨