2009-11-05 4 views
15

최근에 저는 C#으로 게임을 코딩 할 때 손을 잡으려고했습니다. 나는 XNA를 사용하고 있지 않다. 처음부터 게임을 코딩했다면 더 많은 것을 배울 것이라고 생각했기 때문에 (멀티미디어 엔진을 사용하고 있지만).게임 프로그래밍 - 2 차원 게임 개체 간의 통신

2D RPG 게임을 디자인하려고합니다.하지만 게임의 기본 부분 (즉, 보일러 플레이트 코드)을 합리적으로 잘 이해하고 있으며, 내가 여기에서 어디로 가야할지 모르겠다.

2D 게임에서 다른 '지역'을 걷는 게임을 진행합니다. '포털 타일'을 치면 다음 지역으로 이동합니다.

이 지역 개체를 설정하는 방법을 이해하는 데 문제가 있습니다. 이것이 제 첫 번째 아이디어였습니다. 각 영역에는 몇 가지 컬렉션 구조가 있습니다 (예 : 가시성 쿼트 트리, 충돌 쿼드 트리, AI 엔티티 목록 등). 따라서 적의 개체를 게임에 추가한다면 가시성 쿼터 트리 인 충돌 quadtree (엔티티와 충돌 할 수 있기 때문에)와 AI 개체 목록에 추가됩니다. 영역은 업데이트 요청을 받으면 각 구조가 자신을 업데이트하도록 지시하고 엔티티가 자신을 업데이트하도록 지시합니다. 지금까지는 좋았어.

내 질문은 :이 적을 다른 물건과 통신해야한다면 어떨까요? 예를 들어, 플레이어가 특정 범위 내에 있는지 여부를 알아야 할 수도 있습니다. 또는 플레이어가 맞았는지 여부. 또는 모든 충돌 가능한 객체가 해당 영역에있는 경우 (경로 찾기가 가능할 수 있습니다).

이 문제의 첫 번째 (나쁜) 해결책은 단순히 각 엔티티에 각 컬렉션에 대한 참조를 전달하는 것입니다. 그러나 이것은 분명히 단단히 결합 된 객체를 장려하는 것이므로 좋지 않습니다.

내가 생각해 낸 두 번째 해결책은 각 엔터티가 메시지 구조를 통해 영역을 쿼리 할 수있게하는 것이 었습니다. 따라서 적군은 "내 위치의 X 거리 내에있는 각 개체의 목록을 내게주세요"라고 대답 할 수 있고 그 영역은 대답을 반환합니다. 그러나이 영역에 점점 더 많은 가능성을 코드화해야하기 때문에 점점 어려워 질 것입니다 ("자신에게 X 거리가 아닌 엔티티 목록을 제공하십시오", "나보다 낮은 건강을 가진 모든 엔티티 목록을 제공하십시오" X "등).

내가 찾고있는 것은이 객체 간 통신 문제에 대한 시간을 테스트 한 솔루션이며 기본적으로 영역을 설정하는 방법입니다. 확실하지는 않지만 메시징 시스템도 필요하다고 생각합니다.

읽어 주셔서 감사합니다.

+4

벽 무서운 – Chad

답변

4

Mediator pattern을 살펴볼 수 있습니다. 그것은 당신이 낮은 커플 링을 가질 수 있지만, 그래, 너 다른 개체 간의 통신을 촉진하기 위해 중재자 개체 (들)에 많은 코드가있다. 그러나 나는 그것이 하나 또는 다른 것 중 하나라고 생각합니다. 그리고 이것이 바람직합니다.또한 특정 업데이트 요청을 대기열에 넣거나보다 적절한시기에 요청을 처리하거나 더 많은 요청을 일괄 적으로 처리하는 등의 트릭을 수행 할 수있는 자유를 부여 할 수 있습니다. 대신에 (가상으로) 일종의 간접비.

4

나는 이런 종류의 최선의 선택은 Observer 패턴을 많이 사용하는 것이라고 생각한다 ... 이벤트를 생성하고 (일반 또는 콘크리트가 다른 디자인 폐기 방법을 결정하는 방법) 오브젝트를 필요한 것들에 가입 시키도록한다.

예를 들어 엔진은 두 엔티티가 가까이에있을 때 충돌 또는 근접 이벤트를 실행할 수 있지만 관심있는 엔티티에서만 수신합니다. 옵저버가 등록 된 조건 만 확인하도록 일부 최적화를 수행 할 수 있습니다.

이것이 게임에서 일반적인 장소인지, 실제로 어떤 게임에서도 사용 된 적이 없는지는 잘 모르겠지만 시간에 대해 충분히 생각해 왔으며 내가 가장 좋아하는 옵션입니다.

+1

그 생각의 문제는 엔진이 책임이 있다는 것입니다 발생하는 모든 일들을 감시하고 필요할 때 사건을 발사하는 것. –

3

물론 클라이언트/서버 아키텍처를 설정하는 것이 좋습니다. 그래서 서버는 모든 게임 세계 업데이트와 내부 논리를 처리 할 것이고 클라이언트는 특정 행동을 할 수만 있다면 서버에 요청할 것입니다. 그러면 서버가 응답하고 클라이언트는 게임 화면을 그려서 업데이트합니다. 비 플레이어 엔티티도 마찬가지입니다. 유일한 차이점은 클라이언트가 사람이 제어하고 다른 엔티티가 컴퓨터로 제어된다는 것입니다. 이것은 당신이 엔티티 로직으로부터 게임 월드 설정과 이벤트 및 업데이트를 분리 할 수있게합니다.

언급 한 "메시지 시스템"은 응용 프로그램 프로토콜이라고하며 복잡한 밀교 이진 시스템이거나 사람이 읽을 수있는 간단한 문자열 일 수 있습니다. 플레이어가 움직이면 서버는 클라이언트가 볼 수있는 엔티티의 목록을 서버에 보냅니다. 비 플레이어 엔티티도 같은 방식으로 작동합니다. 이는 서버에게 일을 할 수있는 권한을 요청하거나, 이전에 이동하여 엔터티의 관점에서 서버가 보낸 다른 엔티티에 대한 정보와 서버가 적절한 응답 또는 정보로 응답하는 것입니다.

소켓을 사용하여 이것을 구현하려는 경우 클라이언트가 서버가 실행중인 것과 동일한 컴퓨터에 연결했는지 또는 클라이언트가 대륙을 넘어서든 서버가 신경 쓰지 않아도되므로 고유 한 네트워크 재생이 분명히 도움이됩니다 . 이 질문에 특별히 코드로 답변하지 않았을 수도 있지만 최소한 생각을위한 음식 이었으면 좋겠어.

+1

확실히 음식에 대한 생각. :) –

2

관리를 수행하는 엔티티 위에 객체가 있으면 대개 훨씬 쉽습니다. (예 : '세계'또는 '게임'). 어떤 엔티티가 다른 엔티티와 근접한 지 쉽게 볼 수 있으며 그에 따라 이벤트 및 알림을 전송할 수 있습니다.

엔티티가 업데이트 될 때 의미있는 결정을 내리기 위해 좀 더 많은 컨텍스트가 필요한 경우, 어떤 상황에서 항상 해당 컨텍스트에서 월드 패스를 유지할 수 있습니다. 그러나 엔티티가 엔티티를 직접 걱정할 필요없이 엔티티의 분할 및 배치를 관리하도록하십시오.

(또한, 왜 쿼드 트리? 차원이 거친 격자 아마 구현하고 동등하게 유용하는 것이 훨씬 간단 할 것입니다. RPG의 경우) 텍스트의