我正在用我的OpenGL c++做的小游戏引擎做一个小游戏。我必须使许多类,如相机,BatchRenderer,AudioEngine,ParticleEngine,水平,玩家,僵尸,人类等现在玩家必须与类互动,如相机,BatchRenderer,AudioEngine,ParticleEngine,关卡数据从水平类,僵尸,人类等,我通过引用他们中的大多数被初始化在我的主游戏类。
//在游戏主类和播放器中创建的AudioEngine和ParticleEngine需要播放声音和模拟粒子渲染播放器需要TextureID、位置、半径(大小)、旋转、深度和颜色。
Player::Player(AudioEngine& a_audioEngine, ParticleEngine& a_particleEngine
GLuint a_textureID, glm::vec2 a_position, float a_radius,
float a_rotation, float a_depth, Color a_color)
{...}//用于检查播放器是否在视线内的摄像头levelData,僵尸,人类来检查玩家的碰撞检测。
void Player::update(Camera& camera, std::vector<std::string>& levelData,
std::vector<Zombie>& zombies, std::vector<Human>& humans,
float deltaTime)在这里你可以看到传递给player类的参数太多了,将来还需要更多。但是我听到很多人说,在一个函数中有两个或三个以上的参数是不好的。在我的游戏中,有很多类需要5到6个以上的参数。
这对于游戏来说是正确的呢,还是这是一个糟糕的做法?请告诉我如何解决这个问题。
对不起,我的英语不好。非常感谢您的阅读。
发布于 2020-04-24 13:21:36
只有当你在程序中大量调用你的函数时,有太多的参数才是不好的,因为你要支付将函数的参数放到堆栈上的成本,以及函数调用的间接性。
如果你不经常调用这些函数,那么就别费心打包这些变量了。
如果您需要打包变量,只需将它们放入struct中并将单个参数传递给函数(通常是避免复制的引用)!
发布于 2020-04-24 14:15:51
在函数中有太多的参数是不好的,但它不是可伸缩的和整洁的。它给用户带来了功能上的不便,对你来说也很难维护。你不能在函数中添加或删除参数,这样做会花费很多时间。还有一件事,你也不需要做太长的struct。如果结构变得太长,拆分成有意义的结构。
发布于 2020-04-24 15:19:33
如果你真的很关心它,你可以在一个结构中传递参数。就编译器而言,它的效率丝毫不会降低。
如果您有c++17,您可以使用结构化绑定来解包结构,以提高可读性。
如果你有c++20,你可以用命名初始化来创建结构。
例如:
#include <string>
struct vec {
double x, y, z;
};
struct func_args {
int a;
std::string b;
double c;
vec x , y , z;
};
void foo(std::string const&, vec const&);
void func(func_args const& args) {
// c++17 feature - structured binding (in this case by reference)
auto& [a, b, c, x, y, z] = args;
foo(b, x);
}
// or by value...
void func(func_args&& args) {
auto [a, b, c, x, y, z] = std::move(args);
foo(b, x);
}
void test()
{
// c++20 feature (and gcc extension prior). Named initialisation.
func({ .a = 0, .b = "alien", .c = 0.0,
.x = { -1, 1, 0},
.y = { -1, 1, 0},
.z = { -1, 1, 0}});
auto const args2 = func_args {
.a = 0, .b = "alien", .c = 0.0,
.x = { -1, 1, 0},
.y = { -1, 1, 0},
.z = { -1, 1, 0}};
func(args2);
}C++每年看起来都更像javascript :)
https://stackoverflow.com/questions/61401594
复制相似问题