adsense



[JAVA/slick2d] 2D 슈팅게임 위치즈 스크램블 제작강좌 -step 5-

step 5. 플레이어의 총알을 생성해 보겠습니다.

일단 GameScene에서 2플레이어를 열었다면 그건 잠시 주석처리해서 막아두고..

prefab에 Bullet 클래스를 생성합니다.



일단은 단순히 직진하여 화면 밖으로 나가면 소멸하는, 그런 것으로 해 보겠습니다.
※Bullet 클래스 하나로 플레이어의 총알과 적의 총알을 겸하는 것도 가능하지만 코드가 복잡해지니, 이 클래스는 오로지 플레이어의 총알에만 사용하겠습니다.

총알은 속도(speed)와 방향(degree) 정보가 필요합니다.
또, 이것을 생성하는 시점에서 지정해줘야 하니 speed와 degree를 받아들이는 생성자를 추가해야 합니다.
그리고 생성자에 총알 이미지를 가져오도록 하면 됩니다.
zorder는 플레이어와 같은 4로 합니다.



setCenterOfRotation은 회전 시 회전축을 설정해 줍니다. 0~1.0f 사이의 값을 지정해줄 수가 있고, 가로/세로폭 * 중심축비값이 회전축이 됩니다.
즉, 0.5f, 0.5f 를 설정해주면 가로세로 모두 정 중앙이 회전축이 됩니다.
(※아마 0보다 작거나 1.0f보다 큰 값을 가정하면 그림의 바깥쪽에 회전축이 설정될..것 같습니다.)

새로운 총알 이미지는 지금까지와는 달리 '방향'이 존재합니다. 총알이 발사되는 방향에 맞춰 회전시켜 줄 것입니다.
게임 좌표상에서 0도가 수직 위를 가리키므로 총알의 기본 이미지도 수직 위를 바라보게 합니다.



이제 render에서는 해당 이미지를 발사 방향-degree-에 맞춰 회전시켜 그려주고,



update에서는 Player 클래스의 MyMove에서처럼 getNextPos를 사용해 이동시켜주면 됩니다.





이제 총알을 발사해 보겠습니다.
Player 클래스의 MyMove에서 if(shootBuff==GameScene.CONTROL_SHOOT){} 부분입니다.

발사 버튼이 눌려 있다면, 새로운 Bullet 객체를 만들고 scene에 addChild 해 줍니다.

단, 매 프레임마다 총알을 발사하면 엄청난 연사가 되니, 적정한 간격으로 발사하게 해 줄 필요가 있습니다.

조건은
- 한 번만 눌렀다 떼도 발사될 것.
- 누르고 있으면 적당한 간격으로 발사될 것.

shootCnt를 설정하고, 이 값이 0일 때만 발사가 가능하도록 합니다. 정확히는 발사 시퀀스가 시작됩니다.
shootBuff==GameScene.CONTROL_SHOOT 이고, shootCnt==0 일 경우, shootCnt=1; 로 발사 시퀀스 시작을 알립니다.

MyMove도 루프에 들어 있으므로 shootCnt>0 이면 발사 시퀀스 진행 중임을 알 수 있습니다.
shootCnt==1일 때 총탄을 생성하고,
shootCnt를 1씩 증가시키다 8이 되면 0으로 리셋합니다.

shootCnt가 0이 되면 다시 shootBuff==GameScene.CONTROL_SHOOT&&shootCnt==0 의 조건이 성립하면 또 발사 시퀀스가 시작됩니다.
한 번 발사하고 shootCnt가 8이 되기 전까지는 발사되지 않으므로 8 값을 조절해 총알이 발사되는 간격을 만들 수 있습니다.
8보다 크게 하면 느리게, 작게 하면 빠르게 발사됩니다.



이제 게임을 실행하고 스페이스 키를 누르면 총알이 발사됩니다.



※GameScene의 enter에서 2P캐릭터 생성하는 부분의 주석을 풀어 2P 캐릭터를 등장시켜보면, 2P 캐릭터도 게임패드의 버튼으로 총알을 발사할 수 있습니다. 2P 캐릭터를 따로 만들어줘야 했다면 이렇게 쉽게 처리하기 어려웠을겁니다.

다음은 총알이 적 캐릭터에 명중했는가 판단해야 합니다만, 아직 적 캐릭터를 만들지 않았으므로 보류하기로 하고,


그 대신 이번 스텝에서 다른 소스들에 몇 가지 추가 수정된 부분을 짚고 넘어가겠습니다.

Player에서는
사격에 연동해서 사격 애니메이션을 보여줄 수 있도록 anim 값의 처리가 몇 군데 변경되었습니다.
Slick2D에서 바로 중심점 좌표로 그리는 명령어가 있어서 그리기(render) 부분을 간단하게 변경했습니다.

BasicScene에서는 pause 기능을 추가했습니다.
isPause 값과 setPause, isPaused함수를 사용하면 BasicScene의 update가 수행되지 않습니다. 따라서 하위 오브젝트의 update도 호출되지 않습니다.
단, render는 pause와 상관없이 호출되기 때문에(안 그러면 pause 시에 검은 화면이 됩니다)
render에서 값이 변경되는 처리가 있을 경우 완전히 pause 상태가 되지 않습니다.

이것을 이용해서 GameScene에서는 숫자 1 키를 눌러 Pause를 on off 할 수 있게 했습니다.



핑백

덧글

댓글 입력 영역


Books

Geek라이프

메가 드라이브 퍼펙트 카탈로그
마에다 히로유키 저/조기현 역

미소녀 일러스트 테크닉
B-은하, pen스케, 카와이 저/정유진 역

핵심강좌! Cocos2d-x
이재환 저

피규어의 교과서 레진 키트 & 도색 입문 편
후지타 시게토시 저/김정규 역
예스24 | 애드온2
일본서적 전문사이트 NEPIC