2013-09-22 2 views
0

저는 현재 멋진 동시성 프리미티브로 인해 게임 서버를 구현하려고합니다. 그 모든 것이 구현되어 매우 안정적으로 작동합니다. 나는 대부분 자바 배경에서 왔고 Java의 유형 계층 구조를 잊어 버리는 데 어려움을 겪고 있습니다. 위치, 속도 등과 같은 비슷한 데이터 구조를 공유하는 게임 개체 모음이 필요하지만 업데이트 메서드 내에서 모두 다른 동작을 수행하거나 다른 기능을 사용할 수있는 특수 필드가있을 수 있습니다. 처음에는 모든 공유 데이터를 포함하는 구조체가 있고 각 사용자 정의 유형은 해당 구조체를 포함합니다. 문제는 조직에 데이터 구조를 사용하는 것입니다. 나는 quadtree를 사용하여 고객에게 인근 물체의 상태에 대한 알림을 제공합니다. 이 방법으로 트리에 각 게임 객체의 내장 된 구조체에 대한 포인터를 전달할 수 있으며 모든 것이 작동합니다.오브젝트 구성 이해에 문제가 발생했습니다.

문제는 쿼드 트리를 쿼리하면 포함 된 유형에 액세스 할 수 없다는 것입니다. 내가 객체의 상태에 대한 근처의 플레이어를 업데이트하려면, 내가 쿼드 트리를 조회,하지만 그래서 예를 들어,

이제
type GameObject struct { 
    Position Point 
    Velocity Point 
    ID int32 
} 

type Client struct { 
    GameObject 
    conn net.Conn 
    // other fields 
} 

, 게임 오브젝트가 실제로 클라이언트인지 확인하는 방법은 지금이 없으며이 방법은 패킷을 보내는 연결에 액세스 할 수 있습니다.

자바에서는 기본 클래스를 생성하고 클라이언트 등을 위해 서브 클래 싱하는 데 익숙합니다. 그런 다음 instanceof을 사용하여 특수 처리가 필요한 것을 결정하고 사용자 지정 기능에 액세스 할 수 있도록합니다. 나는 다음과 같이 뭔가를 할 수 있다고 생각 :이 방법

type GameObject interface { 
    Position() Point 
    Velocity() Point 
    ID() int32 
} 

type Client struct { 
    pos Point 
    vel Point 
    id int32 
    conn net.Conn 
    // other fields 
} 

func (c *Client) Position() Point { 
    return c.pos 
} 

func (c *Client) Velocity() Point { 
    return c.vel 
} 

func (c *Client) ID() int32 { 
    return c.id 
} 

나는 클라이언트를 분리하는 타입 주장을 사용할 수 있지만, 이것은 다른 게임 오브젝트를 구현하기위한 중복 코드를 많이 이어질 것입니다. 나는 이런 식으로 일을하는 관용적 인 방법이 있다고 가정하고 내가 얻을 수있는 도움에 감사드립니다. 이것이 가파른 길일 경우 누군가가이 디자인의 추론을 이해하도록 도울 수 있습니다.

답변

0

문제와 제약에 대해 자세히 알지 못해도 문제에 답하기는 어렵지만 다음 세 가지 아이디어가 있습니다.

첫째, 아마도 GameObject 포인터가 아닌 쿼드 트리에 복합 유형을 저장할 수 있습니다.

type QuadTreeEntry struct { 
    GameOb *GameObject 
    Entity interface{} 
} 

"엔티티"는 * 클라이언트가되며 다른 모든 것은 네 쿼드 트리에 포함됩니다.

둘째, 쿼드 트리에 GameObject가 모두 필요하다고 생각할 수 있습니다. 아마 이것이 더 좋을까요?

type QuadTreeEntry struct { 
    Position Point 
    Entity interface{} 
} 

이 쿼드 트리 코드의 위치에서 얻을 간접를 제거하는 좋은 효과를 가지고 있으며, 그것은 실수의 원래 엔티티와 위치 데이터를 공유하지 않는 때문에, 당신의 쿼드 트리를 무효화하기 어렵습니다. 효율성이 너무 중요하지 않은 경우

셋째,이 작업을 수행 할 수하십시오 GameObjectGetter 것 쿼드 트리에 간다

type GameObjectGetter interface { 
    GetGameObject() *GameObject 
} 

func (c *Client) GetGameObject() *GameObject { 
    return &c.GameObject 
} 

그래서 다.

관련 문제