-
Java Web Game 개발 가이드(7)Java Web Game 개발 가이드 2010. 2. 3. 11:01
웹 게임의 제작기법 3
웹 게임에 있어서 필요할 만한 시스템은 많이 있겠지만 전투 시스템은 빠지지 않는 시스템 중의 하나라 할 수 있습니다. 제 영농 RPG의 경우는 전투가 필요 없지만 작물의 부대 혹은 단위 별 전투가 가능하다 가정하고 진행해 보겠습니다.
먼저 웹 게임의 특성은 Request & response 라 할 수 있는 웹의 특성을 벗어날 수 없습니다. 즉 실시간으로 응답을 서버 측에서 먼저 줄 수가 없습니다. 이 한계성은 채팅을 보면 쉽게 이해 할 수 있습니다. 채팅에서 내가 말을 쓰는 것은 요청에 해당 합니다. 나의 말을 서버 측에 전달(다른 사람에게 말을 전해달라는 요청)하지만 서버는 다른 채팅 방 사람들에게 먼저 누가 이런 말을 썼다 라는 걸 알려 줄 수가 없지요. 오로지 다른 사람들이 지금 어떤 말을 쓴 사람이 있나요? 라고 물어보는 요청을 보내야 서버는 응답을 줄 수 있습니다. 즉 이런 구조로 인해 우리가 흔히 즐기는 온라인 게임처럼 상대방이 나에게 전투시 발생하는 수많은 현재 정보를 실시간으로 줄 수가 없게 됩니다. 방법이 있다면 상대의 정보가 궁금한 나의 브라우저에서 1초도 안 되는 빠른 시간으로 연속으로 요청을 보낸다면 짧은 단위로 서버에 등록된 정보를 계속 응답 받아 화면에 보여 줄 수도 있습니다. 하지만 이런 방식은 서버에 많은 부담을 주어서 해서는 안 되는 방식입니다.
하지만 실제로 웹 채팅이 구현 되어 있고 해당 채팅의 구현 방식은 숨겨져 있거나 유료의 방식으로 오픈 되지 않은 경우가 많이 있습니다. 웹의 기본적인 속성을 알고 있다면 이 원리에서 크게 벗어나지는 않을 것이기 때문에 대부분 서버와의 통신을 ActiveX
에 의존하거나 자바 Applet
을 이용하고 혹은 AJAX
방식으로 인한 무한 요청으로 처리를 하게 됩니다.
AJAX 방식을 제외하고는 모두 ActiveX 설치와 같은 별도 모듈을 필요로 하고 AJAX 방식을 이용할 시에는 대규모 채팅, 시스템에서는 서버의 과부하가 발생 할 수 있습니다. 구현은 모두의 자유지만 웹 게임의 큰 장점인 언제 어디서나 별도의 설치가 필요 없는 게임을 모토로 한다면 채팅 전용서버를 두고 AJAX 방식으로 처리하는 것이 한 방법이 될 수 있습니다.
다시 원론으로 돌아와서 웹 게임의 전쟁 시스템은 위의 문제로 인해 한 순간의 자동전투가 되는 경우가 많다는 것입니다. 한 순간에 끝나지 않아 보여도 화면에 보여지는 것만 천천히 단계적으로 전쟁 시나리오를 보여줄 뿐 벌써 전쟁은 끝이나 있을 것입니다. 그럼 개발의 측면에서 보면 한 순간에 끝이 나버리는 전쟁에 어떤 재미를 부여 할 수 있을까요? 이는 아마도 전쟁 자체의 능력보다 전쟁을 예상대로 이루어지도록 하기 위한 사전작업과 사전작업이 적중하여 전쟁에서의 승리, 보상 물을 얻고, 전쟁을 애초에 회피하도록 하기 위한 장치를 이용해 생존 하는 등을 이용한 간접적인 재미를 추구 할 수 있을 것입니다.
일반적인 전략 시뮬레이션 장르의 웹 게임에서 채택되는 전쟁 시스템을 흉내 내어 영농 RPG의 전쟁 시스템도 구성 해 보도록 하겠습니다. 다음은 제 영농 RPG의 전쟁 시스템 구현에 따른 추상화 과정의 일부 입니다.
-
나의 작물 부대를 소대 단위 편집이 가능해야 한다.
-
나의 부대는 소대, 중대, 대대 까지 구성 가능하며 진을 구축 할 수 있다.
-
각 진형에 따른 전쟁 효과는 일종의 알고리즘에 따라 자동 전투가 진행된다.
-
각 소대에는 아이템(메뚜기 호리병, 솔잎 혹 파리 소환진) 등을 배치 할 수 있다.
-
-
나의 작물 부대는 내가 차지한 영토에서 생산된 작물을 중심으로 구성되며, 인구가 많고 소출이 많은 곳의 부대는 징집이 수월하다.
-
작물부대의 징집 시 작물의 스트레스가 올라가서 무한 징집이 불가능하다.
-
-
나의 작물을 파견시킬 때에는 내 작물 부대의 이동속도에 영향을 받으며 실제 세계의 시간으로 계산되며 적군의 움직임을 볼 수 있는 첩자 시스템이 있어야 한다.
-
감자, 고구마 같은 구를 수 있는 작물이 많을수록 이동속도가 빠르다.
-
부대의 보급부대 시스템은 같은 부대의 작물을 잡아먹으면 된다.
-
부대의 크기가 클수록 잡아먹는 보급 부대가 빨리 줄어든다.
-
-
플레이어는 진군을 회군 시킬 수 있으며 회군 시에는 더 많은 보급부대가 소모 되며, 회군 후 사기가 떨어진다.
-
공성전을 진행 할 시에는 대나무나 옥수수 등을 이용해 진을 구축 할 수 있으며 트랙터 등을 가진 적군은 이 대나무와 옥수수를 보급부대로 먹을 수 있다.
-
공성전시 수성 측은 군량미를 풀어 군을 3배까지 증원 시킬 수 있다.
-
아래의 표는 위의 기획으로 발생하는 데이터 추상화의 일부 이다.
군대 편성데이터
각 사용자의 작물들을 편성 할 수 있는 정보를 가짐.
군 이동 데이터
현재 편성된 군의 위치 상태 값, 이동 목표 값 등
군대 편성 가능 데이터
각 조직 별 군 편성 임계 치, 리더 설정 가능여부 등
레벨 링 데이터
부대별 레벨 업 시 변동 능력치 리스트, 레벨 업에 필요한 경험치
날씨 데이터
시간 대별 날씨 데이터. (현재 날씨로 대체 가능)
스킬 데이터
각 유닛이 사용할 수 있는 스킬 리스트, 현재 군 편성된 유닛 들의 스킬 리스트
이렇게 구성해 두고 보니 군대의 이동에 관한 처리가 조금 궁금해 집니다. 군이 이동을 하는 것은 실시간으로 처리가 되어야 할 것입니다. 군이 이동하는 것을 다른 플레이어가 실시간으로 판단 할 수 있어야 할 것입니다. 하지만 웹의 특성을 살펴 보았듯이 어떤 특정 활동이 일어나려면 조정하는 플레이어가 계속 이동에 관한 것을 요청해 주어야 할까요? "자 우리 병력은 지금 이동을 시작한지 3일 됐으니 현 위치를 24Km부근으로 변경해 주십시요." 라고요. 그럼 접속을 하지 않은 동안은 군이 그냥 제자리 서 있겠군요.
이런 행위는 제 3자에 의한 컨트롤이 필요해 지게 됩니다. 즉 서버에서 무한 루프를 돌며 모든 플레이어들의 군의 움직임을 컨트롤 하는 서버의 배치성 작업
이 항상 필요 해진다는 것입니다. 플레이어의 의지와는 상관 없이 접속을 종료해도 서버의 배치 프로그램은(보통 톰켓이 설치된 서버에서 설치되어 돌고 있을 것입니다.) 모든 플레이어들의 군의 움직임을 일괄적으로 계속 수정하고 있다는 것입니다. 실제로 데이터 베이스에 저장된 데이터를 이런 식으로 컨트롤 하는 것은 매우 위험한 일이지만 예를 들자면 그렇다는 말이지요.
그렇지만 이런 거창한 방법이 아닌 트릭을 사용해도 됩니다. 예를 들어 나의 건물이 완료 되기 위해서는 데이터 베이스에 작업 시작 시간과 작업에 필요한 시간이 등록 되어 있을 것이며 이를 가져올 때 계산하여 스크립트로 표현 해주게 됩니다. 하지만 완성되기 전에 접속을 끊었고 이 작업에 대해 제 3자의 간섭이 들어올 수 있을 경우. 즉 다른 플레이어가 아직 완성되지 않은 건물을 공격할 수 있다면 이 건물의 상태에 따른 정보를 실시간으로 서버 측에서 계산하고 있어야 하지만 단지 공격을 받는 플레이어의 다른 정보를 이용해 승패와 결과가 분배 된다면 건물 정보 하나 때문에 배치를 돌리지 않아도 됩니다.
하지만 아무래도 유명한 웹 게임들은 모두 실시간으로 이동하고 접속을 끊었다가 접속해 보면 아직 이동중인 부대를 중도에 귀환 시키며 그 귀환 시간 동안 침략을 오면 수성 병력이 없이 무력화 되는 등 실시간 적인 요소들을 많이 가지고 있습니다. 이런 작업을 무리 없이 소화 시키려면 꼭 서버의 배치성 일괄 작업이 필요해지게 됩니다. 물론 유명한 웹 게임들의 소스를 열어보지 않는 한 또 다른 방식으로 개발 되었을 수도 있겠지요.
한 가지 가능성 있는 팁으로는 전투 역시 이동 중에 매복에 관한 기능을 넣는다면 이동위치 값을 실시간으로 배치서버가 계산하고 있어야 하지만 매복은 필요 없고 전쟁이 일어날 시점 정보만으로 예약 배치에 등록 된다면 실시간 위치 계산을 하지 않고 서버 부담이 적은 예약 전쟁 배치 서버를 활용 할 수 있게 됩니다.
배치성 서버 프로그래밍은 쉽지 않은 작업이며 수 많은 서버 프로그래밍 기술이 뒤 따르므로 다루지 않겠습니다. 자신이 만드는 웹 게임이 실시간이 꼭 필요하다면 일단 자신이 원하는 호스팅 업체에서 서버의 배치를 돌려도 되는지부터 알아봐야 할 것입니다. 물론 스스로 서버를 사서 돌린다면 상관 없겠지만요.
구체적인 부대와 부대간의 전투효과 적용, 전투 행동력에 따른 공격과 방어, 시간의 흐름에 따른 전장 상황 변경 등 순식간에 이루어지는 전쟁 시뮬레이션 객체의 코딩 법까지는 다루지 않겠습니다.
복잡한 전장 시스템을 구현 하기 위해서는 수 많은 시행 착오가 따르겠지만 그렇기 때문에 구현에 앞서 정확한 설계와 범위를 정해 작업을 해 나가야 그 기초설계 위해서 모든 추가 기능과 전투 시스템이 완료 될 것입니다. 실제로 이런 전투의 구현이 매우 중요한 위치를 차지하는 웹 게임의 경우 가장 버그가 많고 잡기가 힘들며 방대한 소스가 존재하므로 로그를 남기기도 쉽지 않은 시스템이 됩니다.
'Java Web Game 개발 가이드' 카테고리의 다른 글
Java Web Game 개발 가이드(9) (0) 2010.02.03 Java Web Game 개발 가이드(8) (0) 2010.02.03 Java Web Game 개발 가이드(6) (0) 2010.02.03 Java Web Game 개발 가이드(5) (0) 2010.02.03 Java Web Game 개발 가이드(4) (0) 2010.02.03 -