viewimage.php?id=2cb2d521e4df3d&no=24b0d769e1d32ca73fed85fa11d02831d03adb8a26938cb888b935cc3419a71aee569f5b0a53e76c14b1008e83c8b38abd920d07c9f756c816e9dbaa797e5a72c06778


1. 지형만들기 https://gall.dcinside.com/mgallery/board/view/?id=aoegame&no=6611335&t

2. 링크 움직이기 https://gall.dcinside.com/mgallery/board/view/?id=aoegame&no=6622888

3. 참피의 행동패턴 https://gall.dcinside.com/mgallery/board/view/?id=aoegame&no=6638982

4. 샌즈 오류, 그래픽의 질 상향 https://gall.dcinside.com/mgallery/board/view/?id=aoegame&no=6650423

5. 공격, 통피분신술 https://gall.dcinside.com/mgallery/board/view/?id=aoegame&no=6662892

6. 시체,이지,"큰사람" https://gall.dcinside.com/mgallery/board/view/?id=aoegame&no=6696778

7. 세계의 확장 https://gall.dcinside.com/mgallery/board/view/?id=aoegame&no=7876684

8. 룸의객체화, 지형 https://gall.dcinside.com/mgallery/board/view/?id=aoegame&no=8154389

9. 체력과 아이템슬롯 https://gall.dcinside.com/mgallery/board/view?id=aoegame&no=8190295

10. 장비 효과와 인벤토리 https://gall.dcinside.com/mgallery/board/view/?id=aoegame&no=8216383

11.소모품과 감정 두루마https://gall.dcinside.com/mgallery/board/view/?id=aoegame&no=8240084

12. 층과 층보스 시스템 https://gall.dcinside.com/mgallery/board/view/?id=aoegame&no=8816784

13. 상태이상과 함정

 

14. 갈아 엎기 https://gall.dcinside.com/mgallery/board/view/?id=aoegame&no=10005301

15. 이진공간분할 랜덤맵 생성 https://gall.dcinside.com/mgallery/board/view/?id=aoegame&no=10017975 




이번 연재는 전투의 구현이다





viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7ac5acacd840f45b03fabd2c3d7f4c0cc9e735f5e8a995fdf7





보통 2d 에서 적이 길을 찾는 알고리즘은 A* 알고리즘을 사용한다 (다익스트라를 사용하는 경우도 있다고는 한다)

하지만 갓흥 엔진 겜스에서는 굳이 에이스타 알고리즘을 구현하지 않아도 자체적으로

에이스타 알고리즘 구조체인 mp_grid를 가지고 있다

이를 사용해서 플레이어를 따라다니는 적을 구현하고자 한다

먼저 플렛폼에 길찾기 그리드인 mp_grid 구조체를 생성한다





viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7aa8c2a4d742f05c02f4b02952124c5bcaf2d7b19419a478b620




mp_grid에는 장애물을 전달해주어야 한다.

그러면 알아서 장애물을 피하는 루트를 짜주기 때문

geo_grid에서 좀더 정교하게 2배로 쪼갠다음 Land가 아닌곳을 장애물로 mp_grid에 전달한다





viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7aa8c2a4d742f05c02f4b029521248599ca03f4f728f2f2c3892




몬스터들은 생성될때 자신이 어느 플랫폼 소속인지 알려준다





viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7aa8c2a4d742f05c02f4b02952121f5998e0f2f7d03e7dc04c24




몬스터가 죽을땐 자기 소속 플랫폼에서 자기 id를 제거해

이미 존재하지 않게된 객체를 비활성화 하게 되는 참사를 막는다




viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7aa8c2a4d742f05c02f4b02952124d579ce8762276086c01a3d3





mp_grid에서 지원하는 길찾기는 말그대로 길만 찾아주는것이기 때문에

밀쳐지던가 하는 외부적 요인으로 벽을 넘어다니게 될수도 있다

그걸 막아준다.

만약 4방향이 모두 끼이게 된다면 while_cycle초과로 맵의 시작 지점으로 이동한다





viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7aa8c2a4d742f05c02f4b0295212480f9fdc7fc595351754d5b2





몬스터 끼리는 서로 부딪힐 시 서로를 밀쳐낸다






viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7aa8c2a4d742f05c02f4b02952124b5fcea9cc2696bee947f3e8





뒤졌던 통피가 부활했다

대충 not_use_dummy 폴더에 들어있던 객체 하나를 꺼내와서 재활용했다

mp_grid는 찾은 길을 path 형태로 반환하기 때문에 빈 path하나를 생성 이벤트에서 하나 선언해놓는다.

여담으로 겜스1.4에는 path 메모리가 줄줄 새는 오류가 있어서 path 쓰기 진짜 싫었는데

mp_grid 안쓰고 A*로 구현해도 어차피 path로 반환해야 된데서 걍 mp_grid씀






viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7ac5acacd840f45b03fabd2c3d7d165acbc4a46b83b16d8408



플레이어가 몬스터의 인식 범위 안에 들어오게 되면 플레이어의 위치로 이동할수 있는 최적의 경로를 구하여 이동을 시작한다

이를 30step마다 갱신해준다.




viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7aa8c2a4d742f05c02f4b0295212175c9eb59ba788e61df7f2e1




패스도 객체취급이라 해제 안하면 메모리에 남는다





viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416b5f72ea1e0610616c2aaca24fde97c1d0169fba0d8b6b8





고닉 죽이기 하려고 몰려드는 통피.gif






viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7ac5acacd840f45b03fabd2c3d754a0bcabd96c655495a98d6





이제 장식물이였던 총이 자기 역할을 할때다

총에게 필요한 변수들을 선언해준다





viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7aa8c2a4d742f05c02f4b0295212185f912c9baff7ec74f2696a





우리의 총은 자동 조준과 자동 발사 기능을 가지고 있다

그런데 이렇게 되면 적이 범위안에 들어오면 일단 쏘게 되므로 벽을 인식하지 못하고 벽 건너에 있는 몬스터를 타겟으로 발사하게 될수도있다.

이 스크립트는 타겟과 총 사이의 거리를 10개의 지점으로 나누어서 해당 지점에 벽이 있는지 검사한다






viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7ac5acacd840f45b03fabd2c3d781b5acd0b839cae8b6b9111





일단 가장 가까운 몬스터를 타겟으로 잡는다.

이 몬스터가 사거리 안에 있을 경우에는 발사하지만

사거리 안에 있지만 벽 등등으로 가로막혔을때는 다음으로 가까운 적을 타겟으로 삼는다






viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7ac5acacd840f45b03fabd2c3d2c4a5698de00ff4da504f27e




재장전 하는 동안 재장전이 얼마나 걸리는지 하얀 박스로 표시해준다





viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7aa8c2a4d742f05c02f4b02952124b569b176649226e2bd849a4




남은 잔탄량을 보여주는 UI를 만든다





viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7ac5acacd840f45b03fabd2c3d2c180dcaeb8012147096bb19



1번 스프라이트 위에는 내가 무슨 총을 장착하고 있는지 그리고

2번 스프라이트는 장탄수 만큼 y를 줄여나가며 그린다

3번 스프라이트는 탄창의 꼭대기를 표시한다




viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7aa8c2a4d742f05c02f4b02952124c5acd589058ab970b5ff523




버튼을 누르면 재장전한다




viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416b5f72ea1e0610616c2aaca76fdb92e4b083dac99597662




음 굿



viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7aa8c2a4d742f05c02f4b02952121f5e9d181079e6c1f0fb2d08




전리품을 만든다

골드는 만-두다





viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7aa8c2a4d742f05c02f4b02952124c5d9ebe88af07a8a7625880




만두는 생성될때 1~4사이의 랜덤 값을 가진다.





viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7aa8c2a4d742f05c02f4b0295212195fcc9ddd4c6f7da3a572f2




플레이어가 충분히 가깝다면 만두는 플레이어에게 끌려들어간다




viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7aa8c2a4d742f05c02f4b02952121d0fcbcaa3db39965f77206d



플레이어에게 부딪히면 내가 가진 변수를 gold량에 추가하고 삭제된다.




viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7ac5acacd840f45b03fabd2c3d2b4d5a9ad7e276fd0f259f99




경험치도 골드와 작동원리는 똑같으니 그대로 복사해준 다음 플레이어가 부딛혔을때 value를 전해주는 대상만 바꿔준다





viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416b5f72ea1e0610616c2aaca22ffbc7e4e046aafc07043fe




폐지줍기




viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7ac5acacd840f45b03fabd2c3d294b599caf4fb7c9695ff098





무기 교체를 구현하자

무기 교체를 할수 있도록 테스트용 무기를 아이템 데이터 베이스에 추가했다






viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7aa8c2a4d742f05c02f4b02952124d08c9fbf67fc5b1f2e6d852




그리고 드랍 아이템 오브젝트를 만들어준다.

대충 아이작에서 액티브 아이템 교체를 생각하면 편하다.





viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7aa8c2a4d742f05c02f4b02952124b5898f30e7d3d78b3e3395b





부딪힌동안 계속 반복적으로 무기가 교체되는걸 막기 위해 30step간의 비활성화 텀을 둔다






viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7ac5acacd840f45b03fabd2c3d29175b9fab31f5e54b2de5ce


viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7ac5acacd840f45b03fabd2c3d7a190f9defb2ea4dc5a0dc57




드랍 아이템은 새로운 아이템의 id를 가지고 있다.

드랍 아이템과 플레이어가 부딪히게 되면 드랍 아이템이 가지고 있는 새로운 아이템의 id가 플레이어의 weapon_item_slot으로 들어가게 되고

플레이어 에게 있던 기존 아이템의 id가 드랍 아이템의 new_item 슬롯으로 들어가게 된다.




viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416f3ab7aa8c2a4d742f05c02f4b02952124f5b9f5ef0a4a4ae9efd00d5




아이템 아레에 깔릴 제단






viewimage.php?id=2ab2d727e9de07a561b3d9bb0f&no=24b0d769e1d32ca73ced85fa11d02831a10d3d354cfd31ab73f939b07bc49d8e2ba39d98281c1c47d4ca6af416b5f72ea1e0610616c2aaca25ffe92b4d016dfe6ed1aaa5






무기 교체가 성공적으로 이루어 졌다.




다음 시간엔 NPC를 추가해 오겠다.