본문 바로가기
스크래치/스크래치 피하기

똥피하기 게임 만들기 2. 충돌처리(~에 닿았는가), 사망처리

by 할거없네 2017. 11. 20.

안녕하세요. 승승이 입니다.

지난번에 만든 똥피하기에서 똥을 맞았을 때 캐릭터의 게임오버, 그리고 똥이 바닥에 들어가면 사라지기 등등의 게임의 기본적인 틀을 이어서 만들어갈 예정입니다.

게임의 요소중에서 가장 기본적인 틀 들을 만들 것인데요, 게임의 규칙과 게임오버 조건 등을 만들어 볼 수 있습니다.

이번 똥피하기 게임에서 가장 중요한 룰은 똥에 맞지 않는 것입니다. 이전 포스팅에서는 단순히 똥을 만들어 내서 떨어진다면 여기서는 그 똥을 맞으면 게임 오버가 되는 것이 핵심 요소가 됩니다. 그래서 똥에 닿았는가 아닌가를 판단하는 것이 중요한데, 게임을 단순하게 만들기위해서 일단 가장 간단한 방법으로 소개하기로 하였습니다.


1. 똥의 충돌 처리

일단 똥이 캐릭터에 맞았을 때를 판단해야 하는데요, 일단 블록중에 '~에 닿았는가'를 사용할 것입니다. 미리 말하지만 ~에 닿았는가 블록은 가능한 사용하지 않는 것을 추천하며 이번 포스팅에서는 단순히 게임 제작의 이해를 위해 쉽게 만들 땐 사용합니다. 그러나 게임이 복잡해지고 어려워지면 다른 방법을 사용해야 합니다.

~에 닿았는가 블록을 사용한다면 똥이 캐릭터에 닿았는지 확인하도록 만듭니다.



여기서 새로 추가된 블록은 Ddong_eventdelet입니다. 각각 이벤트와 삭제 조건을 담당하는 블록으로 정했습니다.

Ddong_event: 복제된 똥은 지속적으로 고양이와 닿았는지 확인하도록 무한반복에 이벤트 블록을 만듭니다.

Ddong_delete: 어떤 이유로 똥이 삭제되도록 조건을 확인하고 똥이 삭제됩니다. 이번 포스팅에서는 똥이 끝까지 떨어졌거나 게임이 오버되면 사라집니다.

 


조건은 user스프라이트에 닿았을 때입니다. 이 조건은 사실 렉을 유발하기 때문에 좋은 블록은 아닙니다. 나중에 게임이 복잡해지고 렉이 많아질 요소가 있다면 가장 먼저 수정해야 할 부분임을 상기하고 넘어가기로 합니다. 만약에 user에 닿으면 게임이 오버되고 리셋 후 다시 시작해야 합니다. 그러나 아직 게임오버 시스템을 만들지 않았으므로 똥이 게임오버 됬다고 말하고 모두 멈추는 것으로 대체를 합니다.


 

이번에 똥이 사라지는 조건 중 하나로 똥의 y좌표가 -170보다 작게 되면 사라지게 합니다. 이것은 바닥의 기준을 -170이라고 가정하여 똥이 바닥까지 가면 복제본 삭제를 수행하는 것입니다. 만약에 똥이 사라져야 하는 다른 이유들, 예를들어 게임이 다시 시작되거나, 어떤 아이템을 먹어서 모두 삭제되거나 등등이라면 이 블록에서 추가하기로 합니다.


여기까지 만들어 본 것을 테스트 해보았습니다. 똥들이 잘 떨어지고, 만약에 닿게 되면 게임오버라고 친절하게 말해줍니다.

여기까지 생각되로 만들어 졌으니, 다음 단계로 넘어갑니다.



2. 점수 시스템

이제 점수시스템을 도입해봅니다. 점수를 얻는 방법은 여러가지가 될 것입니다. 시간이 지나면 오르게 하는 간단한 방법도 있고, 똥이 바닥에 얼마나 닿아서 사라졌는지로 점수를 해도 좋습니다. 만약에 똥을 총으로 쏴죽이는 게임이 된다면 그 쏴죽인 점수로 해도 됩니다. 점수를 쌓는 방식은 만드는 사람이 정하는 것입니다. 일단은 아주 간단한 방법으로 점수는 시간이 올라가도록 만들기로 합니다.


점수를 세는 스프라이트는 user가 하기로 했습니다. 여기서 초기값 블록에 점수 변수를 넣어서, 점수 초기값은 0점으로 시작하도록 합니다.


이제 유저 스프라이트의 무한루프 안에 점수를 올려주도록 블록을 만듭니다. 아주 쉬운 방법으로 점수가 유저의 루프 1틱당 점수 1씩 올라갑니다. 참고로 이 때 터보모드를 쓰면 점수가 엄청나게 올라갈 수 있습니다. 이럴 때는 터보모드에 상관없이 실시간으로 계산해줘야 하는데 타이머를 써야 합니다. 하지만 매우 간단하고 쉬운 게임 만들기 이므로 이런 기능은 넣지 않기로 하겠습니다. 만약에 다른 방법으로 점수를 올리고자 한다면 이 블럭을 수정해서 어떤 조건으로 점수가 오르도록 하기로 합니다.


3. 게임오버 처리

다시 돌아와서 똥이 고양이와 맞으면 게임오버가 되고 무언가 누르면 재시작을 하도록 합니다. 아까는 테스트용으로 처리해두었던 게임오버를 정식적으로 문구를 뜨게 만들고 마우스나 키보드를 누르면 재시작이 되도록 만들 예정입니다.

 

먼저  게임오버를 표시해줄 스프라이트를 만들어 줍니다. 여기서 게임오버의 조건이 만족하면 문구가 뜨고, 그렇지 않으면 숨어 있게 만들어 줄 예정입니다.


이 게임오버 스프라이트도 역시 초기값 설정 후 루프를 돕니다.

위의 블록의 수행하는 역할은 아래와 같습니다.

gameover_init: 게임오버 스프라이트에서의 초기값 설정

gameover_restart: 게임오버 조건이 되면 게임오버를 띄어주고, 마우스나 키보드 클릭 시 리스타트 되도록 함



초기값에서는 #게임오버 변수를 0으로 초기화 해주고, 게임오버가 되면 1이 되어 게임오버 처리를 해줄 것입니다. 게임이 시작하자마자 보이면 안되기 때문에 숨기기를 해 두었습니다.



이제 게임오버 되면 재시작 이벤트를 만들어 줄 차례입니다. 이 블록은 무한 반복을 하다가 게임 오버가 발생하면(#게임오버=1) 이 게임오버 표시를 보여줍니다. 그리고 마우스키나 어떤 키를 누르면 숨기고 점수를 0으로 리셋해줍니다.

게임오버 스프라이트에서 게임오버 처리를 해주면, 다른 스프라이트에서도 게임오버 될 때의 행동을 바꿔줄 차례입니다. 가령 똥들은 모두 숨겨지게 되고, 유저는 점수세기를 그만해야 합니다. 그리고 게임오버가 풀리면 점수가 0으로 리셋되고 똥들은 다시 처음부터 발생하게 합니다.


- 게임오버에 따른  스크립트 수정

게임오버 조건을 넣어주었으니, 다른 스프라이트들에도 게임오버를 위한 추가적인 기능들을 넣기로 합니다.

Ddong_event: 고양이가 똥에 닿으면 #게임오버 변수를 1로 정하여 게임오버임을 알려주는 용도로 사용됩니다.


Ddong_copy: 똥은 게임오버가 0이면(게임중)계속해서 복제됩니다. 만약에 1이 되면(게임오버) 더이상 똥을 만들어 내지 않습니다.


Ddong_delete: 똥이 사라지는 조건이 추가되어, #게임오버가 1이면(게임오버) 이미 복제된 똥들은 삭제됩니다.


user_score: 게임오버가 0이면(게임 중) 계속해서 점수를 누적시킵니다. 게임오버가 1이되면(게임오버) 더이상 점수누적하지 않습니다.





이제 똥들을 피하면 점수도 얻고 똥맞으면 게임 오버도 됩니다.

다음에는 난이도와 여러가지 아이템이나 똥의 종류들을 늘려보는 작업을 해볼까 합니다.




스크립트 확인하기:

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

댓글