gpt4 book ai didi

c++ - 组织客户端-服务器游戏中的代码

转载 作者:可可西里 更新时间:2023-11-01 16:12:56 27 4
gpt4 key购买 nike

背景:我帮助开发了一款多人游戏,主要使用 C++ 编写,使用标准的客户端-服务器架构。服务端可以自己编译,客户端和服务端一起编译,可以托管游戏。

问题

游戏将客户端和服务器代码合并到同一个类中,这开始变得非常麻烦。

例如,以下是您可能会在普通类(class)中看到的一些小示例:

// Server + client
Point Ship::calcPosition()
{
// Do position calculations; actual (server) and predictive (client)
}

// Server only
void Ship::explode()
{
// Communicate to the client that this ship has died
}

// Client only
#ifndef SERVER_ONLY
void Ship::renderExplosion()
{
// Renders explosion graphics and sound effects
}
#endif

还有标题:

class Ship
{
// Server + client
Point calcPosition();

// Server only
void explode();

// Client only
#ifndef SERVER_ONLY
void renderExplosion();
#endif
}

如您所见,仅在编译服务器时,预处理器定义用于排除图形和声音代码(这看起来很难看)。

问题:

保持客户端-服务器架构中的代码井井有条和整洁的一些最佳实践是什么?

谢谢!

编辑:也欢迎使用良好组织的开源项目示例:)

最佳答案

我会考虑使用 Strategy design pattern由此,您将拥有一个具有客户端和服务器通用功能的 Ship 类,然后创建另一个类层次结构,称为 ShipSpecifics 之类的东西,它将是 Ship 的一个属性。 ShipSpecifics 将使用服务器或客户端具体派生类创建并注入(inject) Ship。

它可能看起来像这样:

class ShipSpecifics
{
// create appropriate methods here, possibly virtual or pure virtual
// they must be common to both client and server
};

class Ship
{
public:
Ship() : specifics_(NULL) {}

Point calcPosition();
// put more common methods/attributes here

ShipSpecifics *getSpecifics() { return specifics_; }
void setSpecifics(ShipSpecifics *s) { specifics_ = s; }

private:
ShipSpecifics *specifics_;
};

class ShipSpecificsClient : public ShipSpecifics
{
void renderExplosion();
// more client stuff here
};

class ShipSpecificsServer : public ShipSpecifics
{
void explode();
// more server stuff here
};

Ship 和 ShipSpecifics 类将位于客户端和服务器通用的代码库中,而 ShipSpecificsServer 和 ShipSpecificsClient 类显然将分别位于服务器和客户端代码库中。

用法可能如下所示:

// client usage
int main(int argc, argv)
{
Ship *theShip = new Ship();
ShipSpecificsClient *clientSpecifics = new ShipSpecificsClient();

theShip->setSpecifics(clientSpecifics);

// everything else...
}

// server usage
int main(int argc, argv)
{
Ship *theShip = new Ship();
ShipSpecificsServer *serverSpecifics = new ShipSpecificsServer();

theShip->setSpecifics(serverSpecifics);

// everything else...
}

关于c++ - 组织客户端-服务器游戏中的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11821723/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com