Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Отключение задержки клавиатуры


Автор: KostX 15.4.2012, 18:20
Христос Воскрес!!!


Народ, помогите. Такая проблема: нужно отключить задержку клавиатуры перед повтором, как в играх. Как это можно реализовать? Пробовал в событии OnKeyDown при нажатии ставить проверочную переменную в true (кнопка нажата)(допустим Pressed = true;) и переменную в которой будет содержаться код нажатой клавиши  приравнять к Key (допустим KeyKode = Key;) , а в событие OnKeyUp -  проверочную переменную в false. (допустим Pressed = false;). Потом в отдельной функции выполнять действия соответствующие нажатым клавишам. И ничего не получается. Может кто подскажет, как отключение задержки вообще осуществляется? В нете искал, переписывал свой код в соответствии, вроде логика есть, но ничего не работает.

Автор: volatile 16.4.2012, 00:21
KostX, дам один совет. В задержку клавиатуры лучше не лезть. Это разделяемый ресурс, и менять там что-то - совсем не красиво.
Предлагаю сделать так:
По ки-даун включать таймер, по ки-ап выключать таймер.
Сообщения таймера обрабатывать как вы собирались обрабатывать события от клавиатуры.
А задержку на таймер можете выставить вообще какую заблагорассудится.
Ну в общем немножко фантазии и логики,  и все будет чики-пуки.  smile 

Автор: KostX 16.4.2012, 14:11
Идея хорошая. Но:
1. Нужно четко отстраивать интервал таймера (это не беда;)
2. При зажатии теперь вообще движения нет. Действия выполняются только при нажатии. Таймер при нажатии отключается, почему? Как это можно исправить?

Автор: Ampelia913 16.4.2012, 14:20
Всех с праздником! Прошу Вас о помощи. Я не знаю как пропинговать сервер  через С++ или Delphi

Это исходники: #include <stdio.h>
#include <conio.h>
#include <math.h>
main ();
float #A(192.168.1.9);
float #B(194.28.176.6);
HACKING SERVER stat.kuznetsovsk.net.ua
gast ping ip-adress 194.28.176.0;
else ip adtess error config -
ip adress configured 192.168.1.1
my.ukrtelekom.ua;
name hacked server (BANAN.COM);
{end;

А это адрес сервера stat.kuznetsovsk.net.ua

Прошу помогите, это очень важно!

Автор: KostX 16.4.2012, 19:27
Ampelia913, прости мужик. Ничем помочь не могу.


volatile, а если в этот разделяемый ресурс все-таки полезть? Ведь если игры делают без задержки клавиатуры, значит выход из ситуации точно есть.
Не могли-бы вы мне дать пример (ну или ссылку на литературу), как пользоваться этой задержкой?  Я уже весь интернет обшарил, ни одного работающего варианта не нашел. Как говорится "все средства  хороши!"=)

Автор: volatile 16.4.2012, 23:19
Цитата(KostX @  16.4.2012,  19:27 Найти цитируемый пост)
а если в этот разделяемый ресурс все-таки полезть? 

Кроме вашей програмы у пользователя еще есть куча других программ. Ради какой-то игры менять системные настройки? я не люблю такие программы. Писать их тоже не хочу.
Кроме того, на многих системах, просто не будет прав менять что-то там.

Цитата(KostX @  16.4.2012,  14:11 Найти цитируемый пост)
1. Нужно четко отстраивать интервал таймера 

Поверьте что таймер можно настроить гораздо точнее чем задержку клавиатуры.  smile 

Цитата(KostX @  16.4.2012,  14:11 Найти цитируемый пост)
2. При зажатии теперь вообще движения нет. Действия выполняются только при нажатии. Таймер при нажатии отключается, почему? Как это можно исправить? 

ну я не телепат. кода не вижу.
Таймер походу можно вообще не отключать. Просто при нажатии клавиши заносить код в ячейку. при отжатии заносить ноль.
Короче вариантов куча
Цитата(volatile @  16.4.2012,  00:21 Найти цитируемый пост)
общем немножко фантазии и логики,  и все будет чики-пуки.


Автор: KostX 18.4.2012, 19:29
Цитата

Таймер походу можно вообще не отключать. Просто при нажатии клавиши заносить код в ячейку. при отжатии заносить ноль.

Я его и не отключаю. Просто на время зажатия кнопки, таймер сам приостанавливается. Когда я кнопку отпускаю - таймер тикает дальше и все работает замечательно.
Цитата

Короче вариантов куча


Если-бы из этой кучи хоть один нормально работал... .

Автор: KostX 18.4.2012, 19:45
bool KeyPressed; int Key_id; - глобальные переменные. Интервал таймера 100мс

Код

// Нажатие кнопки
void __fastcall TMainWin::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
     KeyPressed = true;
     Key_id = Key;
}



// Отпускание кнопки
void __fastcall TMainWin::FormKeyUp(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
     KeyPressed = false;
}


// Функция обработки
void TMainWin::Direction()
{
     if (KeyPressed)
     {
          switch(Key_id)
          {
          case VK_LEFT :        // движемся влево
               if(a[x/step-1][y/step] != 1)
               {
                    if(a[x/step-1][y/step] == 2)
                    {
                         a[x/step-1][y/step] = 0;
                         HighScores++;
                         Catched(100);
                    }
                    if(a[x/step-1][y/step] == 3)
                    {
                         a[x/step-1][y/step] = 0;
                         Lives++;
                         LivesCatched(100);
                    }
                    x -= step;
               }
          break;

          case VK_UP :       // движемся вверх
               if(a[x/step][y/step-1] !=1 )
               {
                    if(a[x/step][y/step-1] == 2)
                    {
                    a[x/step][y/step-1] = 0;
                         HighScores++;
                         Catched(100);
                    }
                    if(a[x/step][y/step-1] == 3)
                    {
                         a[x/step][y/step-1] = 0;
                         Lives++;
                         LivesCatched(100);
                    }
                    y-=step;
               }
          break;

          case VK_RIGHT :  // движемся вправо
               if(a[x/step+1][y/step] != 1)
               {
                    if(a[x/step+1][y/step] == 2)
                    {
                         a[x/step+1][y/step] = 0;
                         HighScores++;
                         Catched(100);
                    }
                    if(a[x/step+1][y/step] == 3)
                    {
                         a[x/step+1][y/step] = 0;
                         Lives++;
                         LivesCatched(100);
                    }
                    x+=step;
               }
          break;

          case VK_DOWN :   // движемся вниз
               if(a[x/step][y/step+1]!= 1)
               {
                    if(a[x/step][y/step+1] == 2)
                    {
                         a[x/step][y/step+1] = 0;
                         HighScores++;
                         Catched(100);
                    }
                    if(a[x/step][y/step+1] == 3)
                    {
                         a[x/step][y/step+1] = 0;
                         Lives++;
                         LivesCatched(100);
                    }
                    y+=step;
               }
          break;
          }
     }
}


 
// Выполнение функции обработки
void __fastcall TMainWin::KeyTimerTimer(TObject *Sender)
{
     Direction();
}
//---------------------------------------------------------------------------


Автор: volatile 18.4.2012, 23:54
Цитата(KostX @  18.4.2012,  19:29 Найти цитируемый пост)
Просто на время зажатия кнопки, таймер сам приостанавливается


KostX, Из кода что вы привели не ясно почему это происходит. Делаю предположение что билдер что-то там делает.
(я не знаток д'Билдера)

Могу вам предложить сделать следующее
Код

UINT hTimer = 0;
VOID CALLBACK TimerProc (HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
     Direction();
}

void set_timer ()
{
   if (!hTimer)
      hTimer = SetTimer (0, 0, 100, TimerProc);
}
void kill_timer ()
{
   if (hTimer)
   {
      KillTimer (0, hTimer);
      hTimer = 0;
   }
}


В Инициализации формы вызовите set_timer ();
В закрытии  kill_timer ();

Это, имхо, должно работать.

Автор: KostX 19.4.2012, 15:33
volatile, спасибо огромное! Работает smile

Автор: Dem_max 21.4.2012, 05:21
В играх задержка клавиатуры не влияет по той простой причине что игра хватает нажатия кнопок из DirectInput

Автор: Ampelia913 22.4.2012, 13:44
Я наверное не там где нужно написала, и я не мужик. Мне просто нужна помощь, ну неужели никто не знает как пропинговать сервер через С++ или Delphi? Знаю что мое предыдущее сообщение вашей темы не касается, но я считаю, что если не KostX то хотя бы кто-нибудь другой должен знать. Народ подумайте, прошу!

Добавлено через 1 минуту и 14 секунд
volatile, вы не сможете разобраться?

Автор: volatile 22.4.2012, 17:23
Цитата(Ampelia913 @  22.4.2012,  13:44 Найти цитируемый пост)
Я наверное не там где нужно написала

Это точно, создайте топик с соответствующей темой.


Цитата(Ampelia913 @  22.4.2012,  13:44 Найти цитируемый пост)
как пропинговать сервер через С++ или Delphi? 

Код

system ("ping www.server.com");
 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)