저는 현재 멋진 동시성 프리미티브로 인해 게임 서버를 구현하려고합니다. 그 모든 것이 구현되어 매우 안정적으로 작동합니다. 나는 대부분 자바 배경에서 왔고 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
}
나는 클라이언트를 분리하는 타입 주장을 사용할 수 있지만, 이것은 다른 게임 오브젝트를 구현하기위한 중복 코드를 많이 이어질 것입니다. 나는 이런 식으로 일을하는 관용적 인 방법이 있다고 가정하고 내가 얻을 수있는 도움에 감사드립니다. 이것이 가파른 길일 경우 누군가가이 디자인의 추론을 이해하도록 도울 수 있습니다.