Вам необходимо переместить чек !pressed
внутрь блока if
, а не в сам if
:
if (keys['O'] & 0x80) {
if (!pressed) {
renderer.TogglePostProcessing();
pressed = true;
}
}
else
pressed = false;
В исходном коде:
if (keys['O'] & 0x80 && !pressed)
{
renderer.TogglePostProcessing();
pressed = true;
}
else
pressed = false;
Пока удерживается 'O'
, вы постоянно переключаете pressed
вперед и назад и, таким образом, переключаете рендерер:
Pass # 1: pressed==false
, то есть (keys['O'] & 0x80 && !pressed) == true
, поэтому рендерерпереключается, и pressed
устанавливается в true.
Pass # 2: pressed==true
, поэтому (keys['O'] & 0x80 && !pressed) == false
, поэтому pressed
устанавливается в false.
Pass # 3: pressed==false
, так (keys['O'] & 0x80 && !pressed) == true
, так что рендерер переключается, а pressed
устанавливается в true.
И так до тех пор, пока вы в конечном итоге не отпустите 'O'
...
В новомcode, pressed
устанавливается в true только тогда, когда keys['O'] & 0x80
впервые оценивается как true, и остается установленным в true, пока keys['O'] & 0x80
не оценивается как false.Затем переключается один раз, когда keys['O'] & 0x80
снова оценивается как true.И так далее ...