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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
dimcoder
Полярный
462 / 434 / 68
Регистрация: 11.09.2011
Сообщений: 1,132
#1

Медленная реакция программы на нажатие клавиши в игре - C++

27.03.2014, 16:12. Просмотров 487. Ответов 1
Метки нет (Все метки)

Здравствуйте! В общем пишу небольшую игру где надо перемещаться по горизонтали главным героем. Игра предполагает быстрое перемещение туда-сюда этим главным героем и есть проблема. Если начать идти вправо и резко изменить направление движения влево, то будет задержка (довольно таки долгая). Использую kbhit() и getch(), выкладываю упрощенный код, подскажите пожалуйста что делать. На всякий случай выкладываю graphics.h, файл main.cpp и player.h (класс главного героя) в зипе. Ну и картинку для разнообразия.
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
//player.h
#ifndef PLAYER_H
#define PLAYER_H
 
class Player
{
    public:
        Player();
        
        static const int halfWidth = 20;
        static const int headRadius = 20;
        static const int bodyLength = 50;
        static const int y = bodyLength + headRadius;
        static const int speed = 5;
        
        void moveLeft();
        void moveRight();
        
        void draw();
        
    private:
        int x;          //coordinates of the head of the player
};
 
Player::Player():
    x(400)
{    
    ;
}
 
void Player::moveLeft()
{
    x -= speed;
    if (x < 20+halfWidth)
        x = 20+halfWidth;
}
 
void Player::moveRight()
{
    x += speed;
    if (x > 780-halfWidth)
        x = 780-halfWidth;
}
 
void Player::draw()
{
    rectangle(x-halfWidth, 580-bodyLength, x+halfWidth, 580);
    circle(x, 580-y, headRadius);
}
 
#endif
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
#include <graphics.h>
 
#include "player.h"
 
using namespace std;
 
int main()
{
    char ch = 0;
    
    initwindow(800, 600);
    
    Player player;
    
    while(true)
    {
        if (kbhit())
        {
            ch = getch();
            if (ch == 'a')
                player.moveLeft();
            if (ch == 'd')
                player.moveRight();
            player.draw();
        }
        cleardevice();
        player.draw();
        Sleep(1);   //это на реакцию не влияет точно
    }
    return EXIT_SUCCESS;
}
Спасибо!
0
Миниатюры
Медленная реакция программы на нажатие клавиши в игре  
Вложения
Тип файла: zip game.zip (4.9 Кб, 2 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2014, 16:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Медленная реакция программы на нажатие клавиши в игре (C++):

Реакция на нажатие клавиши - C++
Проблема такая: обрабатываю нажатие клавиши- if ((GetAsyncKeyState(VK_LEFT)!=0)&amp;&amp;(... По нажатию я изменяю значение переменной...

Реакция на нажатие клавиши независимо от раскладки клавиатуры - C++
Всем добрый день! Подскажите, пожалуйста, если необходимо, чтобы в консольном приложении происходило определенное действие при нажатии,...

Как послать нажатие клавиши в другое окно программы? - C++
как послать нажатие клавиши в другое окно программы(неактивное\активное -неважно) а еще что бы окно находило по айди а не по имени, а их...

Странная реакция на нажатие стрелки - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main() { char a; for(;;){ a=getch(); ...

Реакция на нажатие клавиш (вверх, вниз, влево, вправо) - C++
Как сделать, что бы программа откликалась на кнопки вверх, вниз, влево, вправо. // Движок для игры AA - All Action // Вложения ...

Нажатие клавиши - C++
Здравствуйте дорогие друзья, Я начинающий программист и хотел бы задать такой вопрос: Как сделать так, чтобы при нажатии на клавишу,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
dimcoder
Полярный
462 / 434 / 68
Регистрация: 11.09.2011
Сообщений: 1,132
28.03.2014, 09:48  [ТС] #2
up...

Добавлено через 2 часа 46 минут
Появился другой вопрос (в самом низу), с предыдущим разобрался использовав GetAsyncKeyState()
Кликните здесь для просмотра всего текста
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
#include <graphics.h>
#include <iostream>
 
#include "player.h"
 
using namespace std;
 
int main()
{
    char ch = 0;
    
    initwindow(800, 600);
    
    Player player;
    
    DWORD lastPressed = 0, lastPressed2 = 0, lastPressed3 = 0, buf;
    
    while(true)
    {
        if (GetAsyncKeyState(0x41) && lastPressed + 10 < (buf = GetTickCount()))   //0x41 - a
        {
            lastPressed = buf;
            player.moveLeft();
        }
        if (GetAsyncKeyState(0x44)&& lastPressed2 + 10 < (buf = GetTickCount()))   //0x44 - d
        {
            lastPressed2 = buf;
            player.moveRight();
        }
        
        if (lastPressed3 + 10 < (buf = GetTickCount()))
        {
            lastPressed3 = buf;
            cleardevice();
        }
        player.draw();
    }
    return EXIT_SUCCESS;
}
Все работает на ура но как вы видите создаются 4 доп переменные buf, lastPressed1,2,3 что бы не слишком быстро и часто реагировал. Я попытался избавится от лишнего примерно так:
C++
1
2
3
4
5
6
7
8
9
10
while(true)
    {
        if (GetAsyncKeyState(0x41) && (10+lastPressed) < (lastPressed = GetTickCount()))
            player.moveLeft();
        if (GetAsyncKeyState(0x44) && (10+lastPressed2) < (lastPressed2 = GetTickCount()))
            player.moveRight();
        if ((10+lastPressed3) < (lastPressed3 = GetTickCount()))
            cleardevice();
        player.draw();
    }

Но думаю, вдруг такая вот конструкция это Undefinded Behaviour
C++
1
(10+lastPressed) < (lastPressed = GetTickCount())
UB или не UB?

Добавлено через 11 часов 13 минут
Судя по приоритету и ассоциативности, происходят следующие действия по порядку:
1) (10+lastPressed) ---- назовем результат r1
2) GetTickCount() ---- назовем это gtc
3) lastPressed = gtc --- это r2
4) r1 < r2 ---результат получен
Это правильно или все таки можно наступить на грабли?

Добавлено через 58 минут
Цитата Сообщение от dimcoder Посмотреть сообщение
грабли
однако, да, все таки грабли. Если выражение выше false и оно в цикле, то оно и в следующий раз будет false т.к. идет приравнивание.
Короче со всем разобрался, может кому то еще поможет.
Тема закрыта.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2014, 09:48
Привет! Вот еще темы с ответами:

Нажатие клавиши - C++
Всем привет! как сделать так чтобы в окне output при нажатии Enter курсор переходил на новую строку

Нажатие клавиши - C++
Всем доброго времени суток. Кто знает как имитировать нажатие button-а? Т.е. Что бы допустим таймер посылал команду и кнопка нажималась,...

Нажатие клавиши в консоли - C++
Есть ли метод для нажатия клавиши (любой) в консоли? Т.е. нажал, к примеру, на клавишу Номе и в консоли вывело &quot;Привет&quot; и тп.

Имитировать нажатие клавиши - C++
Проблема такая, есть программа, кот запущена, с пользовательским интерфейсом. Нужно сделать для нее прогу, кот будет через допустим 2...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru