bash.im ithappens.me zadolba.li
3422

Разрешите расслабиться?

20 июня 2010, 10:00

Писал я как-то игру — чисто для души, проект некоммерческий. Так как в программе широко использовался объектно-ориентированный подход, то классов было море. Программа писалась уже довольно давно, и вне Студии я её не запускал, пока не надумал скомпилить и протестить релизную версию. Игра загрузилась, отрисовала карту, главного героя... который стоял, как истукан, решительно отказываясь перебирать ножками и идти, куда сказали. Подивившись, я запустил Студию, открыл проект и нажал F5 — игра запустилась, и герой бодро побежал к намеченной точке! Повторная проверка показала странную закономерность: герой соглашался выполнять указы только под бдительным надзором дебаггера Студии, вне родных стен которой он просто тихо стоял на месте.

Причина привязанности героя к дебаггеру крылась, впрочем, во вполне банальной ошибке. В конструкторе класса героя флажок Idle не был инициализирован значением false, и каждый раз, когда игра запускалась в дебаге, звёзды так удачно складывались, что на область памяти, где лежала эта переменная, приходилось нулевое значение. Когда же игру запускали в «полевых условиях», адреса менялись, и на флажок Idle попадал какой-то ненулевой мусор, который герой интерпретировал как true, то есть указание ничего не делать.