Объясняю "на пальцах". FrameFunc вызывается уже в цикле (так организован HGE). Каждый раз при входе в FrameFunc ты должен получить время прошедшее с момента предыдущего вызова: dt=hge->Timer_GetDelta(); Это очень маленькая величина. Ты ее накапливаешь в каждой итерации : delay=delay+dt; И при достижении определенного значения, двигаешь фигуру вниз:
Code
// Фигура падает с задержкой
if((delay>(1.0/level)) && !IsDown )
{
(CurFig->Y)++;
channel = SQUALL_Sample_Play(sample, 0, 0, 1);
delay=0;
}
Твоя же организация цикла while во FrameFunc просто на каждой итерации игрового цикла "подвешивает" игру, поэтому и все остальное не получается. Не надо пытаться выжидать время, задерживая FrameFunc, она должна постоянно отрабатывать, а задержку введи так, как я говорю. То есть свой таймер делать не надо, он уже запускается с запуском HGE на максимально возможной скорости (или надо менять HGE_FPS). А у тебя в цикле основного таймера ты запускаешь еще свой самопальный. Логики нет.