주요 내용
코스: 컴퓨터 프로그래밍 > 단원 4
단원 2: 장면 관리간단한 장면 변화
윈스턴의 이야기를 그림 이야기책으로 만들고 사용자가 클릭을 통해 다음 화면으로 넘어갈 수 있게 만들어 봅시다. 제목이 있는 메인 장면으로 시작합니다.
background(235, 247, 255);
fill(0, 85, 255);
textSize(25);
text("The Story of Winston", 10, 200);
다음은 사용자가 클릭하면 이야기의 다음 부분인 윈스턴의 위대한 탄생을 볼 수 있도록 만들 겁니다. 사용자가 마우스를 클릭할 때마다 호출될
mouseClicked
함수를 정의한 후 두 번째 장면을 그리는 코드를 그곳에 넣어서 이 기능을 구현해 봅시다. 두 번째 장면을 그리기 전에 background()
를 호출해야 함을 주의하세요. 그렇지 않으면 각 장면이 겹쳐 보일 겁니다.mouseClicked = function() {
// Scene 2
background(173, 239, 255);
fill(7, 14, 145);
textSize(25);
text("Lil Winston is born!", 10, 100);
image(getImage("creatures/BabyWinston"), 80, 150);
};
다음 프로그램으로 장면이 바뀌는 것과 윈스턴이 태어나는 것을 확인해 보세요!
이제 두 번째 장면의 코드에 텍스트를 바꾸거나 이미지의 위치를 바꾸는 등의 수정을 해 보세요. 그런데 수정한 코드를 확인하려면 그때마다 클릭해서 두 번째 장면까지 가야 합니다.
너무 귀찮지 않나요? 두 번째 장면을 정확히 원하는 것으로 만들기에는 시간이 너무 오래 걸립니다. 장면이 열 개인데 열 번째 장면을 수정하려고 했다면 확인할 때마다 클릭을 열 번 해야 했을 겁니다.
그 문제를 해결하도록 하겠습니다. 물론 이 성가심을 견딜 수 있지만, 훨씬 생산적인 프로그래머가 되어 봅시다. 두 번째 장면을 수정하고 그 결과를 실시간으로 본다면 훨씬 더 생산적이지 않을까요? 이 경우 두 번째 장면의 모든 코드를 함수 안에 넣고
mouseClicked
로부터 함수를 호출한 후 디버깅할 때 해당 함수를 호출하면 문제를 쉽게 해결할 수 있습니다. 다음은 그렇게 한 결과입니다:var drawScene2 = function() {
background(173, 239, 255);
fill(7, 14, 145);
textSize(25);
text("Lil Winston is born!", 10, 100);
image(getImage("creatures/BabyWinston"), 80, 150);
};
mouseClicked = function() {
drawScene2();
};
// Scene 1
background(235, 247, 255);
fill(0, 85, 255);
textSize(25);
text("The Story of Winston", 10, 200);
drawScene2();
두 번째 장면을 함수로 만든 한, 첫 번째 장면도 함수로 만드는 것이 좋을 것입니다. 모든 코드를 묶어 호출합니다.
var drawScene1 = function() {
background(235, 247, 255);
fill(0, 85, 255);
textSize(25);
text("The Story of Winston", 10, 200);
};
이제 다음 프로그램을 실행해 보세요. 두 번째 장면을 바꿔보고 싶다면
drawScene2()
를 주석 해제하고 호출해 바꾼 것이 제대로 나오는지 확인해 보세요.이제 첫 장면과 두 번째 장면이 생겼습니다. 세 번째 장면을 보여주려면 어떻게 해야 할까요? 또는 세 번째 장면을 클릭하여 첫 번째 장면으로 되돌아 가려면 어떻게 할까요?
mouseClicked
내의 코드를 변경해서 항상 두 번째 장면을 호출하는 대신 어떤 장면을 보여줄 것인지를 조건적으로 선택할 필요가 있습니다. 즉, 특정 종류의 조건을 확인할 if문이 필요합니다. 우선 의사코드(pseudo-code) 측면에서 생각해 봅시다.// 사용자가 마우스를 클릭할 때:
// 현재 장면이 1번 장면이라면, 2번 장면으로 넘어 갑니다.
// 현재 장면이 2번 장면이라면, 3번 장면으로 넘어 갑니다.
// 현재 장면이 3번 장면이라면, 다시 1번 장면으로 넘어 갑니다.
"현재 장면"을 식별할 필요가 있어 보이네요. 이것은 숫자로 저장하는 것이 좋습니다. 전역 변수
currentScene
을 선언하고 mouseClicked
내에서 확인하도록 하겠습니다.var currentScene;
mouseClicked = function() {
if (currentScene === 1) {
drawScene2();
} else if (currentScene === 2) {
drawScene3();
} else if (currentScene === 3) {
drawScene1();
}
};
조건이 의사코드와 유사한 것 같지만 문제가 있습니다.
currentScene
을 실제 값으로 할당하지 않아 조건이 절대 참이 될 수 없게 됩니다. If문 안에서 값을 설정할 수도 있겠지만 장면을 그리는 함수에 설정하는 것이 아마도 더 나을 것입니다. 그러면 장면 그리기 함수를 호출하는 장소에 상관 없이 변수가 올바르게 설정됩니다.var drawScene1 = function() {
currentScene = 1;
...
};
var drawScene2 = function() {
currentScene = 2;
...
};
var drawScene3 = function() {
currentScene = 3;
...
};
아래 프로그램에 여태까지 한 모든 것을 합쳤습니다. 클릭해서 이야기의 시작부터 어떻게 동작하는지 살펴보세요. 원하는 대로 네 번째 장면을 추가하고 내 프로젝트로 저장해 보세요.