我正在用C ++构建一个函数,当我点击屏幕时,我可以在3D应用程序中创建一个定向光线。我正在研究一些x和y的计算,但问题是我在x和y上做std::cout
,值保持不变。如果我删除static
关键字,这可以正常工作,但我想将它保留为静态局部变量,因为我将多次使用此函数,所以究竟是什么问题或者我究竟做错了什么正在制作它一直打印出相同的值吗?
继承人的职能:
void Mouse::GetClickDirection(D3DXMATRIX projMatrix)
{
static POINT mousePoint;
GetCursorPos(&mousePoint);
ScreenToClient(hwnd, &mousePoint);
static float width = (float)backBufferWidth;
static float height = (float)backBufferHeight;
static float x = (2.0f * mousePoint.x / width - 1.0f) / projMatrix(0, 0);
static float y = (-2.0f * mousePoint.y / height + 1.0f) / projMatrix(1,1);
D3DXVECTOR3 origin(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 dir(x, y, 1.0f);
system("CLS");
std::cout << "X: " << x << std::endl;
std::cout << "Y: " << y << std::endl;
}
答案 0 :(得分:2)
这里没有理由使用静态变量。
初始化本地静态后,除非您明确为其指定新值,否则不会更新它 你正在做的是初始化,而不是分配。
如果你担心效率,那么使用本地静态很可能 - 它们至少需要初始化检查(在每个函数调用上),并且可能需要缓存未命中或两次获取价值观。
答案 1 :(得分:1)
我的猜测是你必须将变量定义和赋值分开:
static float x;
static float y;
x = (2.0f * mousePoint.x / width - 1.0f) / projMatrix(0, 0);
y = (-2.0f * mousePoint.y / height + 1.0f) / projMatrix(1,1);
因为只进行了一次初始化。
答案 2 :(得分:0)
这正是static
关键字的含义,变量只被初始化一次。从您的代码中,您的变量值仅在初始化程序中更改,初始化程序仅在每次执行程序时执行一次。由于它们依赖于参数,因此它们不能是静态的。如果要保留依赖于参数的值,则需要维护某种形式的缓存,但是,在每次调用函数时初始化变量可能会产生更大的开销。
答案 3 :(得分:0)
不要让他们static
。 static
局部变量最初初始化一次,首次调用函数时(正式地,当执行首次通过初始化程序时,但差异与此代码无关),因此在后续调用{{1} }和x
保持旧的价值观。这些都没有理由是静态的。