adsense



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

step 9. 적의 공격과, 적 공격/또는 적 캐릭터가 플레이어에게 충돌하는 것을 구현해 보겠습니다.

적의 공격은 오소독스하게, 방향성이 없는 이미지를 사용합니다. 앞에서 총알을 회전시키느라 이것저것 구현했던 복잡한 내용을 비교적 생략하는 셈입니다.

그렇게 이미지와 rectangle 형성을 단순화하고, 플레이어 캐릭터와 충돌한다는 정도만 Bullet 클래스와 다릅니다.
그럼 EBullet1(Enemy's Bullet 1) 클래스를 prefab에 만들고, Bullet 클래스의 내용을 복붙합니다.



이미지는 bullet_2.png 를 사용합니다. 생성자에서 총알 이미지 불러오는 부분을 수정합니다.



render에서 버퍼 이미지와 변형된 Shape를 얻는 부분, 회전을 지정하는 부분을 생략합니다.
대신 rect는 중심점인 posX, posY를 기준으로 8*8 사각형으로 단순화 했습니다.



checkHit에서 대상을 NEUROI1이 아니라 PLAYER로 바꿉니다. step4에서 플레이어 캐릭터에게 PLAYER라는 name을 지정했기 때문입니다.

플레이어에게 맞은 적 총알은 그대로 소멸하면 되므로, 총알의 남은 hp를 계산한다든가 하는 부분은 삭제합니다.
적 총알의 파괴력(hp)은 지금은 의미가 없습니다만, Player에 설정할 setHit에는 준비만 해 두고 인수는 1로 고정합니다.

※그런데 플레이어는 하나밖에 없지 않나? - 이번에는 2플레이어 동시가 가능하니까 플레이어도 복수로 들어올 가능성이 있습니다.

플레이어가 공격을 한 번 받으면 myState가 2로 되어 잠시 경직되므로, 그동안은 충돌 체크 대상에서 제외해야 합니다.
정확히는 myState가 1 이외의 경우에는 충돌하지 않습니다.
또, 현재는 설정하지 않았지만 플레이어가 불사 immortal 상태에도 충돌 대상이 되지 않습니다.
(불사라는 개념이라면, 충돌해도 플레이어는 노 데미지, 총알이나 네우로이는 소멸-같은 식으로 해야겠지만 여기서는 '맞지 않음'으로 합니다.)


이상의 내용으로 checkHit 수정을 완료했으면 Player 클래스로 가서 rect 정보와 setHit 함수를 작성합니다.

Player의 setHit는 훨씬 간단합니다.
플레이어의 경우 총알이 맞으면(setHit가 호출되면)
- 라이프가 남아 있으면 1 감소하고 스테이트를 2(쇼크)로.
- 라이프가 없으면 스테이트를 3(격추)으로.
이 내용을 그대로 코딩해주면 됩니다.

Player의 update에서 스테이트 전환 후 카운팅을 하므로 어떤 경우에도 cnt를 0으로 리셋해 줍니다.


이제 적 캐릭터가 총알을 발사해야 합니다.

플레이어의 총알은 지정된 방향으로 총알을 발사하면 됐지만 여기서는 플레이어를 겨냥해서 발사해야 됩니다.
그러므로 플레이어 정보를 읽어오고, 플레이어가 둘 이상 있다면 어느 플레이어를 향해서 발사해야 할지 정해야 합니다.

어그로 수치를 정하는 방법이라던가 거리로 정하는 방법 등이 있겠지만, 여기선 간단하게 랜덤으로.


목표가 정해졌으면 목표를 향한 각도를 구하고 (getDegree) 이 정보를 사용해서 EBullet1 을 생성합니다.

적 총알, 명중 처리, 발사 처리 모두 되었습니다.


테스트 전에 추가로 짚고 넘어갈 부분이 있는데, 기존에 Player 클래스에서 myState가 3이면 화면 아래로 떨어지고, 밖으로 나가면 플레이어 캐릭터를 소멸시켜버리게 됩니다.

그런데, 기존에 작성한 Neuroi1에서는 플레이어 객체가 항상 존재한다는 전제를 갖고 코딩했기 때문에
플레이어 캐릭터가 소멸하면 런타임 에러가 발생합니다.

플레이어 캐릭터의 정보를 Player 클래스 이외의 클래스에서 참조하는 경우는 Player 객체가 존재하는지 항상 체크할 필요가 있습니다.
step9 소스는 해당 문제점을 포함해서 수정된 것입니다.



이제 총알에도 충돌하니 적 캐릭터와도 충돌시켜 보겠습니다.
Neuroi1 클래스에 총알에 있었던 checkHit를 카피페한 후 차이점을 수정해 줍니다.
총알과 달리 플레이어와 충돌한 네우로이는 삭제하지 않으므로, 그 부분만 정정하면 됩니다.
실행결과.

이것으로 가장 기본적인 게임 구현은 대충 끝났습니다.



핑백

덧글

댓글 입력 영역


Books

Geek라이프

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

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

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

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