본문 바로가기
스크래치/스크래치 런

쿠키런 같은 게임 만들기 3. 지형만들기

by 할거없네 2017. 12. 10.

이번 포스팅에서는 지형을 만들고 인식하도록 합니다.

다른 제작과정보다 상당히 난이도가 높은 부분입니다. 어디부터 손을 대야 할지 난간할 수 있습니다. 저도 이걸 만드는데 어디부터 설명을 하고 만들어야 하나 좀 고민을 했어야 했습니다. 일단 순서는 1. 땅을 만들어서 2. 인식하는 것입니다.


1. 땅 만들어 주기

일단 지형을 만들어 줄 스프라이트들을 만듭니다.


바로 이 검정색 막대기는 지형을 만들어 줍니다. 여기서 1이면 땅이고 0이면 공중으로 만들어 줍니다. 따라서 맵은 11110111... 이런식으로 숫자의 배열로 되고, 이걸 순서대로 땅으로 채워주면서 만드는 것이 이번 스크립트 제작의 목표가 됩니다.



땅을 만들어 주는 스크립트는 위와 같이 됩니다. 땅은 자신의 크기와 위치에 맞게 복제가 되고 자신의 번호에 따라서 땅이 되거나 허공이 됩니다.


먼저 땅의 크기는 가로 20픽셀의 크기로써 480크기의 무대를 채우기 위해서는 24번의 복제가 필요합니다. 각 땅은 1번부터 24번까지 부여됩니다. @번호 변수는 각자의 화면에서의 위치인 것입니다.

 

이제 카피가 되면 맨 왼쪽부터 순서대로 나열이 됩니다. 그래서 x의 좌표는 (@번호-1)*20-240 으로 가게 되는데요, 만약 @번호가 1이면 -240이 되고, 2이면 -220되고... 24가 되면 240까지 되어 무대를 끝에서 끝까지 채워줍니다. 여기서 @x_shifht는 제자리에서 이동하는 값이 됩니다. 화면이 왼쪽에서 오른쪽에서 움직이면서 땅도 움직이는 것처럼 보이게 하기 위한 임시 변수입니다.


이제 땅이 움직어야 하는데요, 현재 캐릭터가 움직인 만큼 움직였다가 -20만큼 움직이면 다시 제자리로 가는 것입니다. 그렇기 때문에 @x_shiftx_좌표가 20만큼 증가할 때마다 20을 추가시킵니다. 예를들어 1번째 땅은 -240에서 -260까지 움직이다가 다시 -240으로 이동하고 다시 반복합니다. 그러면 모든 땅은 제자리에서 -20까지만 이동할 뿐입니다.

만약에 이런 방법을 사용하지 않는다면 땅을 계속해서 복제하여 맨 오른쪽부터 왼쪽까지 계속해서 움직여주어야 합니다. 이런 방법도 나쁘지 않고 만들기는 쉬우나, 복제하기를 꾸준히 발생시켜 렉을 유발할 수 있습니다.


마지막으로 땅의 모양을 결정해줍니다. 여기서는 땅의 종류가 0, 1, 2, 3으로 4종류인데, 0이면 허공이며 1, 2, 3은 각각의 높이가 다른 땅이 됩니다.



2. 땅 인식하기

이제 땅을 만들어 주었으니 고양이가 땅을 인식해서 추락하거나 올라가거나 하도록 만들어 줍니다.


고양이 스프라이트에서 수정되는 블록은 user_inituser_ground입니다.


user_init에서는 @x_shift 변수가 160으로 결정되는데, 이 값은 뒤에 사용할 값으로 고양이의 위치만큼 땅을 인식시켜줄 x좌표라고 보시면 됩니다. , 고양이가 현재 자신이 밟고 있는 땅의 위치를 결정해주기 위한 변수입니다.


user_ground는 고양이의 땅 인식을 위한 블록입니다. 이제 지형이 갖추어 졌으니 자신의 위치의 땅이 무엇인지 알아보고 추락하거나 땅에 안전하게 착지하도록 만들어 줍니다. 먼저 현재 점프 중(@state=1)이라면 user_ground_type을 확인합니다. 이것은 점프를 하면서 아래 착지할 땅이 무엇인지 알아보는 블록으로 뒤에 설명됩니다.

만약에 점프중이 아니라면 자신의 밟고 있는 땅이 0이라면 추락하며, 그렇지 않으면 역시 땅이 무엇인지 확인합니다.



이제 지형을 확인하는 부분입니다. user_ground_type1이냐 0이냐에 따라서 행동이 달라집니다. 먼저 0이라면 지형에 상관없이 추락합니다. 그러나 0이 아니라면 지형의 위치를 확인하게 되며, 지형이 0이면 추락합니다. 현재 자신의 위치의 지형 값을 알아내는 것은 data_groun리스트이며, 이것은 자신의 x좌표값에 따라 결정됩니다.

마지막으로 user_ground블록은 땅의 높낮이에 따라서 캐릭터가 땅에 닿았는지 아닌지 알아내기 위한 블록입니다.



스크립트 확인하기:

https://scratch.mit.edu/projects/190621081/

댓글