진이의 Developer Story

어둠의전설 서버 에뮬레이터 개발일지 (17.03.20) 본문

에뮬레이터 개발일지

어둠의전설 서버 에뮬레이터 개발일지 (17.03.20)

JIN3260 2017. 3. 20. 00:15

[본문서는 TCP/IP 서버 공부용 에뮬레이터임을 밝힙니다]

1. 해당 자료는 공유하지 않습니다.

2. 프로그래밍 공부 목적에 한해서 답변드리겠습니다.

3. 마지막으로 배포할 마음은 없습니다. 따로 메일 주지 마세요.


안녕하세요~

주말간 개발된 내용을 포스팅합니다.


서버 개발하다 보면 가끔 막막한게 모든 행동을 주변 유저들에게까지 보여줘야 한다는점인데요.


흔히 여러명에게 한번에 메시지 등을 전송하는 것을 브로드캐스트라고 합니다.

네트워크 쪽 용어로 많이 사용되고 있습니다...


학부시절 열심히 듣지 않아서 자세히는 모르지만... 브로드캐스트, 애니캐스트 등의 개념은 기억하고 있네요~ 


자바로 개발을 하다보니 객체지향위주로 적어보겠습니다...

현실의 모든 것들을 프로그래밍으로 반영하는걸 객체지향이라고(?)도 하죠.


그래서 이를 반영하기 위해서는, 설계가 탄탄해야겠구요.

물론 제가 지금 객체지향의 의미를 꺼낸 것은 당연히 위와 관련이 잇기 때문이죠.


자바에서의 강점을 살리는 방법은 다형성을 제대로 이용을 하는지가 관건인데요.

모든 클래스의 조상은 Object 클래스 이듯이. 프로그래밍에서도 이러한 점을 이용하면 굉장히 흥미롭습니다...


예로 들어서 게임내, 캐릭터, 몬스터, NPC 등이 있습니다.

이러한 것들은 대체적으로 공통점을 가지고 잇는데요. 일편적으로 단순한 예로 설명해보겠습니다.


캐릭터,몬스터,NPC 등을 클릭을 하면 이벤트가 발생하겠지요.

이러한 것들을 크게 GameObject 라는 상위 인터페이스에 상속시키는 방법이 있습니다.


인터페이스를 사용할때의 강점은 프로그래밍이 좀더 유연해지기도 하고, 개발자 간의 협업에 있어서도 필수라고 할수도 있겠습니다.


약간 이야기가 샜는데요.

캐릭터 내에서 캐릭터,몬스터,npc를 처리한다고 가정하자면요.

만약에 상위의 GameObject 라는 인터페이스나, 부모클래스를 이용하게 될경우 해당 파라메터에서는 부모클래스를 이용하여 모든 자식들을 처리할 수가 있는거죠.


그래서 프로그래밍에서는 참 설계가 중요한것같아요~

무작정하다보면 중간에 갈아엎는일이 빈번한 만큼 설계가 중요하겠습니다.


그러나 저는 지금 프로젝트를 설계하여 진행하는 것은 아니고, 역공학적으로 클라이언트를 이용하여 서버를 구축하는 일인 만큼 클라이언트의 구조도 모르기 때문에... (지금 벌써 한번 갈아엎었다고 말 못해요~~) 어쩔수 없기는 합니다 ^^


내가 채팅을 하면 화면내에 있는 모든 유저들에게 채팅메시지가 보여야 하며, 무슨 액션을 취해도 모든지 다 보여야 합니다..


그리고 화면 밖에 있던 유저들이 화면내로 들어온다면 그 유저들에게 또한 모습을 보여주어야 하구요.


이 부분이 약간 까다롭긴합니다만...

그래서 게임 월드내에 잇는 모든 오브젝트들을 해쉬맵이나 리스트에 담아 관리합니다.


누군가 로그인을 하면 해당 자료구조에 착착히 쌓이는 구조이지요.

그리고 누군가 로그아웃을 하면 그 자료구조에서 빼내는거구요.


화면내에 누군가를 알아볼때는 현재 내 캐릭터 위치에서 거리를 계산해서 유저를 가져옵니다. 이 부분은 자바의 기본적이지만 강력한 Math클래스를 이용한다면 누구든지 쉽게개발할 수 있을 것같습니다.


그럼 오늘의 개발 스크린캡쳐입니다.

캐릭터와 캐릭터간의 상호작용이죠.


첫번째 스샷은 드디어 메이븐으로 작성을 하던 프로젝트를 빌드하여 서버에 올린 스샷입니다~~~ ㅎㅎ 저렇게 쌓이는 로그를 보면 정말 뿌듯하죠.. (물론 개발용 debug이기 때문에 상당히 필요없는 내용입니다만...)


로그의 내용 상당수는 서버와 클라이언트 간에 주고받는 중요한 옵코드가 포함이 되어 있어 일부 모자이크 처리 되었습니다~


만들면서 애매 했던 부분은 버프,디버프 지속스킬인데요.

디버프스킬이 걸릴 경우 상태이상이 우측 상단에 이미지로 표시되어야 하며,

지속시간이 지날경우 풀려야 합니다.


이 경우는 자바의 스케쥴러를 활용하여 쓰레드풀에 위임하여 처리하였습니다.

더 좋은 방법이 있으신분은 언제든지 알려주시면 감사하겠습니다 (그러한 분들은 정말로 환영합니다)


주말간 잠도 줄여가며 만들었습니다만, 막상 만들고 나니까 뿌듯한거 같네요 ^^


이번 포스팅은 여기까지 하고 마치겠습니다~

그럼 모두들 새로운 주의 시작인데, 힘내세요!



Comments