Новости

Фотки
Надписи на партах
Под гармошку
Обои для рабочего стола

Downloads
Компьютерные магазины
Фуфло

ЕЯС
НКС
ООП
СЦОД

Гостевая

Я ВКонтакте

Объектно-ориентированное программирование

Урок №4. Системный таймер.

Наверное, при создании игр часто возникают вопросы: как сделать так, чтобы объекты двигались независимо друг от друга? Как сделать, чтобы нажатия клавиш не тормозили процесс игры?

В этом нам поможет системный таймер.

Дело в том, что работа с функцией delay() неудобна. Неудобна тем, что во время выполнения этой функции, программа находится в режиме ожидания, то есть не выполняет никаких действий (хотя могла бы). И главное: программа даже не реагирует на нажатия клавиш, что особенно обидно. Ведь если при длительной паузе юзер начнём нажимать на кнопки, буфер клавиатуры может переполниться и системный блок начнёт издавать неприятные пикания.

Так вот, есть способ преодолеть эти препятствия.

По адресу 0040:006C расположен системный таймер, значение которого увеличивается на единицу через каждые 55 миллисекунд не зависимо от каких-либо событий. Такую возможность просто грех не использовать.

Значение системного времени представляет 4-хбайтовое число (тип "unsigned long").

Объявим дальний указатель и проинициализируем его значение адресом 0040:006C:

unsigned long far *SYSTIME= (unsigned long far *) 0x0040006c;

Можете даже посмотреть, как изменяется значение, расположенное по этому указателю, с помощью вот такой простенькой программки:

#include <conio.h> #include <iostream.h>
unsigned long far *SYSTIME= (unsigned long far *) 0x0040006c;

void main() {
  while (!kbhit())
    cout << *SYSTIME << "\n";
}

Следующий пример демонстрирует использование системного таймера:

#include <conio.h> #include <iostream.h>
unsigned long far *SYSTIME= (unsigned long far *) 0x0040006c;

void main() {

  unsigned long
    timeA= *SYSTIME,
    timeB= *SYSTIME,
    timeC= *SYSTIME,
    timeD= *SYSTIME;

  do {

    // символ "A" будет выводиться каждые 3 секунды
    if ((*SYSTIME - timeA) * 0.055 >= 3) {
      cout << "A";
      timeA= *SYSTIME;
    }

    // символ "B" будет выводиться каждые 10 секунд
    if ((*SYSTIME - timeB) * 0.055 >= 10) {
      cout << "B";
      timeB= *SYSTIME;
    }

    // символ "C" будет выводиться каждые полсекунды
    if ((*SYSTIME - timeC) * 0.055 >= 0.5) {
      cout << "C";
      timeC= *SYSTIME;
    }

    // символ "D" будет выводиться каждые 5 секунд
    if ((*SYSTIME - timeD) * 0.055 >= 5) {
      cout << "D";
      timeD= *SYSTIME;
    }

  } while (!kbhit());
}

То есть суть проста. Засекаем время:

unsigned long time= *SYSTIME;

Затем периодически с помощью ((*SYSTIME - time) * 0.055) определяем сколько прошло секунд. И если интервал времени истёк, то выполняем какое-то действие и засекаем время поновой.

if ((*SYSTIME - time) * 0.055 >= interval) {
  ...;
  time= *SYSTIME;
}

А вот так вот можно сделать обработку нажатий на клавиши во время какого-либо процесса:

#include <conio.h> #include <iostream.h>
unsigned long far *SYSTIME= (unsigned long far *) 0x0040006c;

void main() {

  unsigned long
    timeA= *SYSTIME,
    timeB= *SYSTIME,
    timeC= *SYSTIME,
    timeD= *SYSTIME;

  do {

    if ((*SYSTIME - timeA) * 0.055 >= 3) {
      cout << "A";
      timeA= *SYSTIME;
    }

    if ((*SYSTIME - timeB) * 0.055 >= 10) {
      cout << "B";
      timeB= *SYSTIME;
    }

    if ((*SYSTIME - timeC) * 0.055 >= 0.5) {
      cout << "C";
      timeC= *SYSTIME;
    }

    if ((*SYSTIME - timeD) * 0.055 >= 5) {
      cout << "D";
      timeD= *SYSTIME;
    }

    // если клавиша не будет нажата, то этот блок пропускается
    if (kbhit()) {
      char key= getch();
      if (key == 0)
        getch();
      else if (key == 27)
        break;
      cout << key;
    }

  } while (1);
}

То есть, здесь всё также. Буквы выводятся с заданным интервалом независимо друг от друга. Плюс ко всему, программа выводит символ, введённый пользователем с клавиатуры. И эти нажатия на клавиши совершенно не затормаживают выполнение других действий в программе.

Вот таким образом, благодаря системному таймеру, можно распараллелить процессы.

Но помните, что ровно в полночь, как только часы пробьют двенадцать, всё волшебство улетучится, а системный таймер превратится в тыкву. :)

Шучу, шучу!

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


Урок №1. Перемещение объекта.

Урок №2. Игра "Арканоид".

Урок №3. Обработка нажатий клавиш.

Урок №4. Системный таймер.

Урок №5. Немного о виртуальных функциях.

^^ наверх ^^

Дизайн: Красиков Виктор, kv630@mail.ru, ICQ - 319227
Местонахождение: Россия, респ. Бурятия, г. Улан-Удэ
Время на сервере: 14.12.19 16:49
Время в Улан-Удэ: 14.12.19 21:49
Время генерации страницы 0.004108 сек.