Форум программистов, компьютерный форум CyberForum.ru

Фикс скорости Игры - C++

Восстановить пароль Регистрация
 
Refery
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 16
11.12.2012, 12:40     Фикс скорости Игры #1
Здравствуйте ув. программеры.

Очень прошу помочь с подключением таймера для фиксирования скорости передвижения объектов в игре (пишу с помощью openGL.
т.к. в зависимости от мощности компа скорость поворота (допустим космического кораблика) будет разной на разных компах. Слышал что это как-то можно исправить с мопощью отслеживания прошедшего времени с момента нажатия на клавишу управления.
Например при зажатии клавиши для поворота на 500 миллисекунд объект (кораблик) должен повернуться на 180 градусов. и соответственно при 250 мс на 90, и т.п.

привожу задействованные в данном процессе отрывки кода:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <cstring>
#include <windows.h>        // Заголовочный файл для Windows
#include <stdio.h>          // Заголовочный файл для стандартного ввода/вывода
#include <stdlib.h>
#include <glut.h>           // Заголовочный файл для библиотеки OpenGL32
#include <glaux.h>          // Заголовочный файл для библиотеки GLaux
#include <math.h> 
#include "SOIL.h"               //библиотека для загрузки png  как текстуры в openGL с альфа каналом.
 
...................................................
 
enum {left, right, up, probel, one, two, three, four, five, six};   //for ship contol
 
class CSpace
{
    GLfloat zRot,               //поворот кораблика стрелками
........................................
public:
........................................
    GLvoid control(GLint button)
    {
        switch (button)
        {
        case left:                      // <------вот ЗДЕСЬ хотелось бы пофиксить с помощью таймера
            zRot+=2.5f;                 //поворот влево
            if(zRot>=360.0f) zRot -= 360.0f;    //сброс угла
            if(zRot<0.0f) zRot += 360.0f;       //сброс угла
            break;
        case right: 
            zRot-=2.5f;      
            if(zRot>=360.0f) zRot -= 360.0f;
            if(zRot<0.0f) zRot += 360.0f; 
            break;
        default:
            break;
        }
    }
};
 
GLvoid StartGameSettings()          //for crate objects
{
    Shuttle.SetPosition(ship);
}
 
 
int WINAPI WinMain(  ............... )        // Состояние отображения окна
{
StartGameSettings();
.................................
while( !done )                // Цикл продолжается, пока done не равно true
    {
        done = true;          
                if(keys[VK_ESCAPE])        // Было ли нажата клавиша ESC?
                {
                    done = true;      // ESC говорит об останове выполнения программы
                }
                DrawGLScene();        // Рисуем сцену
                SwapBuffers( hDC );    // Меняем буфер (двойная буферизация)
 
                /* from here place will start description for keyboard  */
 
                if (keys[VK_LEFT])     // если нажата клавиша стрелка влевао, то...
                {
                    Shuttle.control(left);
                }
                if (keys[VK_RIGHT])     
                {
                    Shuttle.control(right);
                }
.................................................................................
                
            }
        }
    }
    return ( msg.wParam );              // Выходим из программы
}
Буду благодарен, если покажите пример на основе моего кода.
Желательно как можно подробней, и понадобятся ли какие нибудь дополнительные заголовочные файлы?
Заранее спасибо!

Добавлено через 1 минуту
типы GLfloat = float
GLint = int
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2012, 12:40     Фикс скорости Игры
Посмотрите здесь:

вопрос по скорости ком порта C++
Сравнение скорости C++
Программа замера скорости C++
Фикс ошибок C++
измерение скорости работы блока программы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
extenup
53 / 53 / 3
Регистрация: 12.11.2011
Сообщений: 109
11.12.2012, 13:20     Фикс скорости Игры #2
Я в своей игре сделал метод корректировки скорости всех элементов игры. Для этого надо узнать за какое время прошла очередная итерация цикла, а за тем обрабатывать это время так-чтобы каждому эл-ту игры прибавилась или вычитать скорость. Сделать скорость каждого эл-та игры зависимой от очередной итерации цикла.

Тогда игра будет всегда идти с одинаковой скоростью, даже если комп тормозит, либо слишком слабый, либо слишком мощный.

Кстати в конце цикла хорошо останавливать поток на 1 миллисекунду (что-то типа Sleep(1)). done = true; лучше вынести за цикл. Зачем её каждый её раз инициализировать?

Это должно выглядеть примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    bool bDone = false;
 
    while(!bDone)
    {
        int nTime = GetTickCount(); // Текущее время
 
        // Код игрового цикла...
 
        nTime = GetTickCount() - nTime; // Время за которое прошла очередная итерация
               
        // В этом методе/функции надо увеличить или уменьшить
        // скорость элементов игры
        CorrectTheSpeed(nTime);
 
        Sleep(1);
    }
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
11.12.2012, 13:22     Фикс скорости Игры #3
Есть два диаметрально различающихся решения:
1) Вычислять время, прошедшее между кадрами и с учётом этого времени вычислять "приращения" для перемещений и прочего. Т.е. на слабой машине выполнится одно перемещение на 10 мм, а на быстрой машине выполнится пять перемещений, но по 2мм каждое (условно говоря).
2) Фиксировать частоту кадров (это гораздо проще). Ты вычисляешь, сколько времени ушло на отрисовку одного кадра. Сравниваешь затраченное время с заданной единицей времени (например 1/60 секунды) и, если затраченное время меньше, то усыпляешь игру на доли секунды, не получишь эту 1/60 секунды.

Второй вариант проще закодировать

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//цикл игры
while(...)
{
    DWORD startTime = GetTickCount();
 
    ...
    // Визуализация и прочее
    ...
 
    DWORD endTime = GetTickCount();
 
    DWORD oneFrameTime = 1000 / 50; // 50 кадров в секунду, чтобы с целыми числами работать
    DWORD sleepTime = endTime - startTime;
    if( sleepTime >= oneFrameTime )
         continue; // Отрисовка заняла больше 1/50 секунды. Игра будет "подтормаживать"
    else
       ::Sleep( oneFrameTime - sleepTime );
}
Refery
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 16
11.12.2012, 15:39  [ТС]     Фикс скорости Игры #4
спасибо ребят, буду тестировать)
Yandex
Объявления
11.12.2012, 15:39     Фикс скорости Игры
Ответ Создать тему
Опции темы

Текущее время: 03:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru