개발 잘해지는 닉네임
32
2019-03-14 21:57:20
10
374

게임캐릭터코딩 어떻게 해야하나요?


코딩하다 막혀서 질문드립니다


프로그램 설계실력 향상및 디자인패턴 적용을 목적으로 메이플스터리같은 2D게임을 만들고자 하고. 엔진같은거 사용안하고 그냥 순수 자바+스윙 프로그래밍으로 처음부터 끝까지 만드려고 합니다. 

이중 게임 캐릭터 설계에 막혀서 질문 드립니다. 


게임캐릭터는 점프, 이동, 공격, 줄타기, 엎드리기, 점프중 1번더 점프 등의 상태(=동작)를 갖습니다. 처음에는 아무생각없이 상태패턴으로 만드려고 했는데 점프중 공격(공격을 해도 기존에 점프하던것은 계속해서 함), 이동중 공격(그냥공격과는 달리 움직이며 할수있는 공격) 등 복합적인 상태를 가지는 경우가 있어 상태패턴으로는 안되는거 같습니다.


나름대로 열심히 머리를 굴려봤지만 깔끔한 코드가 떠오르지 않습니다.ㅠ 어떻게 설계하는게 좋을까요?
(메이플 스토리라는 게임을 안다면 딱 그거 만든다고 생각하시면 됩니다)

내용이 길어질것 같으면 "이거이거"공부하세요 와 같이 답변주시거나 블로그 링크로 답변주셔도 감사합니다.


감사합니다.

1
0
  • 답변 10

  • fender
    13k
    2019-03-14 22:00:54

    상태 머신(Finite State Machine)으로 충분히 처리되는 경우가 아닐까 싶습니다. 점프 중에 점프를 다시 한 상태와 점프를 한 번만 한 상태가 근본적으로 다를 건 없지 않을까요?

    0
  • 개발 잘해지는 닉네임
    32
    2019-03-14 22:07:47
    febder님 답글 감사합니다.
    질문에서의 설명이 조금 부족한거같아 보충드립니다.
    게임이니 거의 모든 동작이 다 애니메이션인데 점프를 한다고 하면 점프! 하고 끝이아니라 몇초에 걸쳐 점프동작을 끝을 냅니다. 예를들어 점프를 한 1초후 공격을 하게되면 점프중에 공격도하고 남은 1초의 점프도 해야하는 상황이라 상태패턴으로 안되는거 같습니다.

    0
  • 초보자바쓰
    665
    2019-03-14 22:19:53

    점프 공격을 점프 + 공격으로 하실지 별개의 새로운 동작인 점프 공격으로 하실지 정해야 할것 같은데요 후자로 하면 상태 패턴 써도 되지 않을까요 점프 공격 하는 애니메이션을 따로 만드는 것을 의미합니다 적고 보니 객체지향적이진 않네요

    0
  • aterilio
    496
    2019-03-14 22:21:49 작성 2019-03-14 22:22:15 수정됨

    상태패턴 써도 비트 연산자로 상태 추출해서 사용하면 상태가 두 개 이상이라도 상관 없지 않나요..?

    예전에 (비상업적) 프로젝트 할 때 상태값 비트 하나당 하나씩 할당해서 부여하고 체크하고 했던 것으로 기억하는데..

    0
  • 초보자바쓰님 답변 감사합니다

    점프공격이 조금애매한게... 점프가 2초라면 1.5초 점프후 공격하면 남은 0.5초 점프도 같이하게되고, 1초 점프후 공격하면 남은 1초만큼만 점프하게 됩니다ㅠㅠ 그래서 아마 안될거같은데 제가 놓치는 다른부분이있다면 말씀해주세요 감사합니다


    aterilio님 답변 감사합니다

    저도 그렇게 생각해서 만들어 봤으나 구조가 너무 복잡해져서 질문 했습니다. 사실 상태패턴도 조금 이상하게 손봐서 다중상태를 다룰수 있게해도 구현은 할 수있고 아예 상태패턴없이 boolean값만써도 만들수 있는데 괜히 설계공부 느낌 내려고하니 예쁘지 않은 코드가 조금 걸리는 느낌입니다.ㅠ 상태패턴의 장점인 명확성과 boolean플래그를 이용했을때의 장점인 다중상태처리를 동시에 잡는방법이 없을까요?

    0
  • fender
    13k
    2019-03-14 22:40:08 작성 2019-03-14 23:19:28 수정됨

    상태와 동작은 구분해서 생각할 필요가 있습니다. 캐릭터가 취할 수 있는 모든 동작을 다 상태라고 생각하면 당연히 조합이 엄청나게 늘어날 수 밖에 없습니다. 예를들어 앞으로 걸으면서 공격을 할 수도 있고 공격을 하는 상태에서 옆으로도 걸을 수 있고 등등 모두 다른 조합이 되겠죠.

    하지만 애초에 상태라는 개념을 도입하는 건 그런 모든 조합을 다 열거하는 것이 목적이 아니라 어느 것이 유효한 상태의 흐름인지 제한하기 위함입니다.

    즉, 예를들어 캐릭터가 걸을 수도 있고 높은 곳에서 떨어질 수도 있다면 당연히 떨어지는 도중엔 허공에서 걸을 수야 없으니 두 상태를 분리하는 것입니다.

    또한 걷다가 땅에 앉을 수는 있겠지만 땅에 앉아 있다가 일어서기 전에 점프를 할 수는 없겠죠. 즉 상태 머신은 그런식으로 상태 사이의 유효한 전환(transition)을 제한하는 개념입니다.

    그렇게 보면 애초에 점프를 하면서 공격을 하는 것이 상충되는 개념이 아닌 이상 굳이 두 가지를 같은 상태 머신의 다른 상태로 구분할 이유는 없다고 생각합니다.


    3
  • 개발 잘해지는 닉네임
    32
    2019-03-14 23:01:03

    fender님 답글 감사합니다.

    와.... 너무 완벽한답변 감사합니다. 책읽고 적용하려고 하니 그냥 책에나온 고대~~로 적용할 생각밖에 못했네요. 당연히 점프는 점프State 클래스에서 움직임은 움직임 State클래스에서 해야한다 생각했어요. 이상하게 질문했는데도 이렇게 완벽한 답변을 주시다니 정말 감사합니다. 물론 막상 코딩하면 또다른 문제로 막힐 수도 있겠지만, 그래도 새로운 발상의 전환이 되었습니다.(정확히는 발상의 전환도아니고 제가 너무멍청했네요..ㅠㅠ) 정말정말 감사합니다!!


    이상한 질문으로 혼란스럽게 해버린 나머지 답변해주신 분들께 정말 죄송합니다..ㅠㅠ 똑바로 질문했으면 정확히 알려주셨을텐데 너무 아무것도 모르고 질문했네요 죄송합니다

    0
  • aterilio
    496
    2019-03-14 23:03:16

    다중 상태를 다룰 수 있게 하는게 왜 패턴을 이상하게 손보는 것인지 잘 이해가...


    그런데 찾아보니 요새는 하드웨어가 발달하여 예전만큼 비트 연산을 옹호하진 않는군요.

    메모리 사용률과 속도 측면에서 예전에는 비트 연산을 더 선호했는데.. 하긴 그것도 꽤 오래전 얘기긴 하니..

    0
  • 개발 잘해지는 닉네임
    32
    2019-03-14 23:13:18

    aterilio님 답글 감사합니다.

    다중상태를 못다룬다고 생각한 이유가 캐릭터 객체가 State를 맴버변수로 갖고 여기에 다형 인스턴스가지는 식으로 상태를 나타내는데, 만약 ArrayList<State>로 다형인스턴스들을 다루게 되면 상태의 변환이 있을때 어떤식으로 전환하고 여러상태중 어떤상태를 삭제해야할지의 과정이 복잡해질거같아서입니다.

    저는 당연히 다중상태를 못다룬다고 생각했는데, 제가 어디를 잘못 생각하고 있는지 알려줄 수 있나요? 검색어라던가 블로그 주소만 주셔도 감사합니다.

    0
  • fender
    13k
    2019-03-14 23:20:27

    참고로 복잡한 캐릭터 동작을 포함하는 게임의 경우 상태 머신을 중첩하거나 여러개를 동시에 사용하는 등의 용법도 고려할 수 있습니다.

    1
  • 로그인을 하시면 답변을 등록할 수 있습니다.