Сейчас я создаю функцию в C ++, которая позволит мне создавать направленный луч в моем 3D-приложении, когда я нажимаю на экран. В данный момент я работаю над вычислениями x и y, но проблема в том, что я делаю std::cout
на х и у значения остаются прежними. Если я удалю static
Ключевое слово this отлично работает, но я хочу сохранить его как статическую локальную переменную, так как я буду использовать эту функцию много раз, так в чем именно заключается проблема, или что именно я делаю неправильно, что заставляет ее выводить одно и то же значение все время ?
Вот функция:
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;
}
Это именно то, что static
ключевое слово означает, что переменная инициализируется только один раз. Из вашего кода значения ваших переменных изменяются только в инициализаторах, которые выполняются только один раз за выполнение программы. Поскольку они зависят от параметра, они не могут быть статическими. Если вы хотите сохранить значения, зависящие от параметров, вам необходимо поддерживать некоторую форму кэша, однако это может потребовать еще больших затрат, чем инициализация переменных при каждом вызове функции.
Здесь нет причин использовать статические переменные.
Как только локальная статика была инициализирована, она не обновляется, если вы явно не назначите ей новые значения.
И то, что вы делаете, это инициализация, а не назначение.
Если вы беспокоитесь об эффективности, это скорее всего Меньше Эффективно использовать локальную статику — им требуется как минимум проверка инициализации (при каждом вызове функции) и, возможно, пропадание кеша или два для извлечения значений.
Я предполагаю, что вы должны разделить определение и назначение переменной:
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);
Потому что инициализация производится только один раз.
Не делай их static
, static
локальные переменные инициализируются не более одного раза, когда функция вызывается впервые (формально, когда выполнение сначала проходит через инициализатор, но различие не имеет значения в этом коде), поэтому при последующих вызовах x
а также y
сохранить свои старые ценности. Там нет причин, чтобы они были статичными.