Я работаю над игрой, и в настоящее время я работаю над частью, которая обрабатывает ввод. Здесь задействованы три класса, есть класс ProjectInstance
, который запускает уровень и прочее, есть GameController
, который будет обрабатывать ввод, и PlayerEntity
, на который будут влиять элементы управления, определенные GameController
. После запуска уровня ProjectInstance создает GameController
и вызывает метод EvaluateControls
в методе Step, который вызывается внутри игрового цикла. Метод EvaluateControls
выглядит примерно так:
void CGameController::EvaluateControls(CInputBindings *pib) {
// if no player yet
if (gc_ppePlayer == NULL) {
// create it
Handle<CPlayerEntityProperties> hep = memNew(CPlayerEntityProperties);
gc_ppePlayer = (CPlayerEntity *)hep->SpawnEntity();
memDelete((CPlayerEntityProperties *)hep);
ASSERT(gc_ppePlayer != NULL);
return;
}
// handles controls here
}
Эта функция вызывается правильно, и утверждение никогда не срабатывает. Однако каждый раз, когда вызывается эта функция, gc_ppePlayer
устанавливается в NULL. Как видите, это не локальная переменная, выходящая из области видимости. Единственное место gc_ppePlayer
, которое может быть установлено в NULL, находится в конструкторе или, возможно, в деструкторе, ни одно из которых не вызывается между вызовами EvaluateControls
. При отладке gc_ppePlayer
получает правильное и ожидаемое значение до возврата. Когда я нажимаю F10 еще раз и курсор находится на закрывающей скобке, значение меняется на 0xffffffff. Я в недоумении, как это может случиться? Кто-нибудь?