작은 걸음 II — 만들며 배우기
배운 것을 묶어 작은 게임 만들기
배운 것을 묶어 작은 게임 만들기
이번에 배울 것
게임은 입력을 받아 상태를 바꾸고 그 상태를 그림으로 보여 주는 프로그램입니다. 이번은 새 문법 수업이 아니라 조립 활동입니다.
실행해 보기
예제 · example1.cpp
void small_main()
{
Window window;
window.set_title("Mini Pong");
window.open(800, 500);
double paddle_y = 210;
double ball_x = 400;
double ball_y = 250;
double ball_vx = 260;
double ball_vy = 180;
StopWatch watch;
while (window.is_open())
{
double dt = watch.elapsed();
watch.reset();
if (window.key_down(Key::Up))
paddle_y = paddle_y - 300 * dt;
if (window.key_down(Key::Down))
paddle_y = paddle_y + 300 * dt;
ball_x = ball_x + ball_vx * dt;
ball_y = ball_y + ball_vy * dt;
if (ball_y < 10)
{
ball_y = 10;
ball_vy = -ball_vy;
}
if (ball_y > 490)
{
ball_y = 490;
ball_vy = -ball_vy;
}
if (ball_x < 50 && ball_x > 30 &&
ball_y > paddle_y && ball_y < paddle_y + 80)
{
ball_x = 50;
ball_vx = -ball_vx;
play_sound(Sound::Hit);
}
if (ball_x > 790)
{
ball_x = 790;
ball_vx = -ball_vx;
}
if (ball_x < 0)
{
ball_x = 400;
ball_y = 250;
ball_vx = 260;
play_sound(Sound::Lose);
}
window.clear(Black);
window.fill_rectangle(30, paddle_y, 15, 80, White);
window.fill_circle(ball_x, ball_y, 10, Yellow);
window.show();
}
}
예제를 실행하고 방향키 위·아래로 막대를 움직이세요. 코드는 ① 시간·입력 읽기 ② 위치 바꾸기 ③ 충돌 처리 ④ 그리기 순서입니다.
충돌은 물체가 서로 닿았는지 판단하는 일입니다. 벽을 넘었을 때 방향만 바꾸지 않고 위치도 경계로 돌려놓습니다. 한 번에 전체를 고치지 말고 막대 이동 부분부터 찾으세요.
Exercise — paddle이 화면 밖으로 못 나가게
시작 코드는 첫 Pong 예제에서 paddle 이동만 분리한 것입니다. paddle_y가 0보다 작아지거나 420보다 커지지 않도록 제한하는 코드를 추가하세요. 위아래 방향키를 오래 눌러도 paddle 전체가 창 안에 남아 있어야 합니다. 확인한 제한 코드는 첫 Pong 예제에도 옮겨 사용할 수 있습니다.
연습 문제 코드 · exercise1_starter.cpp
void small_main()
{
Window window;
window.open(800, 500);
double paddle_y = 210;
StopWatch watch;
while (window.is_open())
{
double dt = watch.elapsed();
watch.reset();
if (window.key_down(Key::Up))
paddle_y = paddle_y - 300 * dt;
if (window.key_down(Key::Down))
paddle_y = paddle_y + 300 * dt;
// Keep paddle_y between 0 and 420.
window.clear(Black);
window.fill_rectangle(30, paddle_y, 15, 80, White);
window.show();
}
}
Hint
입력으로 paddle_y를 바꾼 뒤 두 개의 if로 0과 420 범위에 맞추세요.
풀이 보기
void small_main()
{
Window window;
window.open(800, 500);
double paddle_y = 210;
StopWatch watch;
while (window.is_open())
{
double dt = watch.elapsed();
watch.reset();
if (window.key_down(Key::Up))
paddle_y = paddle_y - 300 * dt;
if (window.key_down(Key::Down))
paddle_y = paddle_y + 300 * dt;
if (paddle_y < 0) paddle_y = 0;
if (paddle_y > 420) paddle_y = 420;
window.clear(Black);
window.fill_rectangle(30, paddle_y, 15, 80, White);
window.show();
}
}