2016-12-10 1 views
0

Я стараюсь, чтобы мои жетоны на настольной игре медленно падали. Прямо сейчас они падают, но они падают так быстро. Как я мог реализовать функцию таймера в моем коде? Прямо сейчас я делаю цикл, который обновляет координату y glTranslate. Но это все еще слишком быстро! верхняя y - координата y, где я нажимаю на экран, а нижний - координаты самого низкого открытого места для токена.Функция таймера GLUT

col =0; 

double bottomy = 0; 
int row = 0; 

circlex = (double)x/width ; 
circley = (double)y/height ; 

row = board.getRow(col) + 1; 
bottomy = 500 - (25*row); 

for(double topy = y ; topy <= bottomy; topy += 2){ 
    glTranslatef(circlex, circley, 0.0f); 
    circley += .0000000000000000001; 
    display(); 
}   

r = board.makeMove(col); 
+0

Не могли бы вы добавить еще немного кода? Я вижу, по крайней мере, две проблемы: 1) Если весь этот код является частью 'glutDisplayFunc', то весьма вероятно, что вы видите только конечный результат и никаких промежуточных шагов, поскольку буферы не меняются местами. 2) Если вы не сбросите матрицу модели внутри дисплея(), вы добавляете преобразования вместо замены их на текущее значение «circley». – BDL

+0

Весь этот код является частью моей функции мыши, которая используется, когда пользователи нажимают на левую кнопку для перемещения. Я думаю, что моя проблема связана с мировыми координатами для openGL. Как мне перейти на преобразование координат мыши в координаты мира? –

ответ

0

Вы можете использовать glutTimerFunc для выполнения функции на очередной период времени. Это подпись

void glutTimerFunc(unsigned int msecs, 
        void (*func)(int value), 
        value); 

Например, если ваша функция рисования была

void UpdateTokens(int time); 

Тогда вы могли бы назвать обновления каждые 0,5 секунды при помощи следующего вызова (где current_time было текущее время моделирования)

glutTimerFunc(500, UpdateTokens, current_time); 

Для более точного определения времени я бы рекомендовал вместо этого использовать <chrono> и выполнить свое время с использованием таких вещей, как std::chrono::duration с std::chrono::stead_clock.

+0

'std :: chrono :: stead_clock' должен быть' std :: chrono :: stable_clock' – plasmacel

0

Настоящая проблема заключается в том, как работает переутомление. В принципе, пользователь получает только изображение, представленное в конце основного цикла. Пока вы не вернетесь с функции мыши, на экране ничего не отображается. Вы можете решить эту проблему путем перевода работы функции дисплея и распространять перевод на несколько кадров:

глобальные переменные:

double circlex = 0, circley = 0, bottomy = 0; 
bool isfalling = false; 
int topy = 0; 

mouse_func:

if (isfalling == false) //Prevents the user from clicking during an animation 
{ 
    circlex = (double)x/width ; 
    circley = (double)y/height ; 

    int row = board.getRow(col) + 1; 
    bottomy = 500 - (25*row); 
    topy = y; 

    isfalling = true; 
} 

display_func:

if (isfalling) 
{ 
    circley += .0000000000000000001; 
    topy += 2; 

    if (topy >= bottomy) 
     isfalling = false; 
} 

glTranslatef(circlex, circley, 0.0f); 
display(); 
Смежные вопросы