<3> 문제점 해결
저번강좌에서 세가지 문제점이 있다는걸 확인했습니다. 이번에는 그 문제점들을 하나하나 해결해보도록 하겠습니다.
<3 - 1> 첫번째 문제점 해결하기 :: 공격 딜레이 설정
오브젝트를 수정해서 총알을 쏘는 딜레이를 설정해줄겁니다.
현재는 스페이스바를 누르면 1스텝마다 이벤트가 실행되어 1스텝당 총알이 한번 나가도록 되어있는데..
딜레이를 15스텝정도로 설정해서 15스텝마다 총알이 나가도록 오브젝트설계를 수정해봅시다.
비행기 오브젝트를 열어 이벤트를 추가합니다.
Create 이벤트를 선택.
총알을 쏠수있는 상태인지 아닌지를 구별하기위한 변수 하나를 선언해줄겁니다. [control]탭에있는 변수설정 액션을 넣어줍니다.
attackFlag 변수를 1로 선언해주세요!
attackFlag가 1이면 공격이 가능한 상태, 0 이면 공격이 불가능한 상태를 의미하는 변수로 사용될겁니다.
그 후 공격기능을 설계해놓은 <Space> 이벤트를 들어가서 조건문(Test Variable) 액션 을 넣어줍니다.
attack Flag 가 1 과 같을경우(equal to) 공격액션이 실행되도록 할겁니다. 위와같이 설정하면 되겠죠.
방금 추가한 조건문 액션을 미사일 생성액션 위로 올려주고, 스타트 블럭과 엔드 블럭을 넣어서 위와같이 정리해줍니다.
그 후, 알람설정 액션을 넣어줍니다.
딜레이로 설정할 시간을 넣어주세요. 15스텝으로 설정하겠습니다.
알람액션을 조건문의 실행영역에 넣어주고, 변수설정액션을 하나 넣어주세요.
attackFlag 를 0으로 설정해줍니다.
방금 넣은 변수설정액션도 위와같이 실행영역에 넣어주세요. 그런데 알람 0 이벤트를 15스텝 후 실행하도록 하는 액션을 넣어주었는데
아직 알람 0 이벤트를 만들어주지 않았습니다.
알람 0 이벤트를 추가해줍시다.
[Alarm] -> [Alarm 0] 을 선택.
알람이벤트에 변수설정액션을 넣어줍니다.
attackFlag 를 1로 설정.
자, 이제 비행기 오브젝트에 딜레이 설정이 모두 끝났습니다.
실행을 해보면 총알이 이제 일정한 딜레이를 두고 발사됩니다. 만약 딜레이를 좀더 짧게 두고싶다면, 알람액션을 편집하면 되겠죠?
설계한 내용을 정리해보면 다음과 같습니다.
(Create 이벤트) 인스턴스가 생성될 때 attackFlag 변수 가 1로 선언됩니다.
(Space 이벤트) 스페이스바 누를시 attackFlag가 '1' 이면 총알오브젝트 생성 후 attackFlag를 '0' 으로 변경한 후, 알람 0 이벤트 실행.
(Alarm 0 이벤트) 알람 0 가 발생되면 attackFlag를 '1' 로 변경합니다.
사실 설계한내용을 살펴보면 어려운 내용이 아니라는걸 알 수 있습니다.
<3 - 2> 문제점 두번째 해결하기 :: 인스턴스가 룸 밖으로 못나가게 하기
두번째 문제점, 비행기가 이동해서 룸 밖으로 나가버릴 수 있습니다.
이전에 '슈팅게임 제작 [1] 비행기 이동' 강좌에서 방문자께서 댓글로 달아주신 내용을 기반으로 오브젝트를 설계해볼겁니다.
이동을 할 때 아예 제약을 주는 방식입니다.
비행기 인스턴스의 좌표 값이 룸 외각의 좌표 안에 있을경우에만 이동이 가능하도록 하는거죠.
가장 이해하기 쉬운 방법이라 생각하고 위 방법을 사용하기로 하였습니다. 오브젝트를 설계해보면 좀더 이해가 쉬울겁니다.
일단 비행기 오브젝트의 <Left>이벤트에 들어가면 좌표점프 액션의 발동조건을 넣어줄겁니다. 이번에도 조건문 액션을 넣어줍니다.
x 값이 0 보다 클경우(greater than) 로 조건문을 만들어줍니다.
현재 x좌표에서 '-4' 만큼 좌표점프 하기 전에 일단 룸의 왼쪽 끝(룸의 왼쪽 끝 x값이 '0') 을 넘어가지 않았는지 체크합니다.
이번에는 조건문 안에 들어가는 실행영역에 액션이 하나밖에 없기때문에 스타트블럭과 엔드블럭을 생략할 수 있습니다.
이번에는 <Right> 이벤트 안에있는 좌표점프 액션에 조건문을 걸어줄겁니다.
인스턴스의 x좌표 값이 room_width 값보다 작을경우 로 설정해줍니다.
자, 여기서 여러분이 생소할만한 부분이 나오네요. 인스턴스가 내부적으로 기본으로 x, y, speed, direction.. 등의 변수를 갖고있는것처럼
'room_width' 라는 변수가 게임메이커 내부에 이미 정의되어있습니다. 이 'room_width' 는 룸의 가로 크기값을 가집니다.
좌표를 한번에 살펴보자면.. 위와 같습니다. 참고로 'room_height' 는 룸의 세로 길이값을 가집니다.
위와같이 조건문을 넣어주면 인스턴스의 x 값이 일단 룸의 맨 오른쪽 끝의 좌표 보다 작아야 이동합니다.
이번엔 <Up> 이벤트에 조건문을 넣어줍니다.
이때부턴 여러분이 직접 설계해보셔도 좋겠네요. y 값이 0 보다 클 경우로 조건문을 설정해줍니다.
추가한 조건문은 좌표점프 위로 옮겨주고..
마지막으로 <Down> 이벤트에 조건문 액션을 넣어줍니다.
y 값이 room_height 보다 작을경우로 설정.
오브젝트설계가 끝났네요. 비행기가 이제 룸 밖으로 나가지 못할겁니다.
이제 룸 밖으로 나가지 못하는 문제점도 해결되었으니.. 마지막 문제점을 해결해봅시다.
<3 - 3> 문제점 세번째 해결하기 :: 총알 인스턴스가 제거하기
마지막 문제점은 생성된 총알 인스턴스가 삭제되지않고, 룸 밖으로 계속해서 전진하고 있다는 것.
이 경우는 일단 총알 인스턴스는 계속해서 생성되는데.. 제거는 되지 않으므로 인스턴스가 쌓이면서 결국엔 렉을 유발하게됩니다.
때문에 인스턴스가 룸 밖으로 나갈경우 삭제되도록 해야합니다.
미사일 오브젝트를 열어서, 이벤트를 추가해줍니다.
[Other] -> [Outside room] 이벤트는 '룸 밖으로 나갈때' 발생되는 이벤트입니다.
인스턴스를 룸 밖으로 나갈때 제거해도록 하기위해서 이 이벤트를 추가했습니다.
이벤트에 인스턴스 제거(Destroy Instance) 액션을 넣어줍니다.
이 액션은 설정 할 내용이 없습니다. 액션이 실행되면 그냥 인스턴스가 제거되요.
이제 총알 인스턴스가 생성된 후 룸 밖으로 나갈경우 제거될겁니다!
이것으로 이번강좌에서 세가지 문제점을 모두 해결해보았는데요.. 기초강좌에서 배웠던 조건문을 상당히 많이 사용했음을 아셨을겁니다.
강좌를 나누지 않고 진행해서 상당히 오랫동안 작성했네요. 다음강좌에서는 드디어 적 오브젝트를 설계해보도록 하겠습니다.
'GMStudio > GMS 강좌' 카테고리의 다른 글
게임메이커 스튜디오 기초강좌 :: 슈팅게임 제작 [4] 적 비행기 만들기 (완성) (5) | 2015.07.26 |
---|---|
게임메이커 스튜디오 기초강좌 :: 슈팅게임 제작 [2] 비행기 공격 (0) | 2015.07.12 |
게임메이커 스튜디오 기초강좌 :: 슈팅게임 제작 [1] 비행기 이동 (2) | 2015.07.11 |
게임메이커 스튜디오 기초강좌 [12] 조건문 if (0) | 2015.06.24 |
게임메이커 스튜디오 기초강좌 [11] 변수 (0) | 2015.06.18 |