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

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

Войти
Регистрация
Восстановить пароль
 
dimcoder
Полярный
453 / 426 / 66
Регистрация: 11.09.2011
Сообщений: 1,126
#1

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

27.03.2014, 16:12. Просмотров 463. Ответов 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;
}
Спасибо!
Миниатюры
Медленная реакция программы на нажатие клавиши в игре  
Вложения
Тип файла: zip game.zip (4.9 Кб, 2 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2014, 16:12     Медленная реакция программы на нажатие клавиши в игре
Посмотрите здесь:

Нажатие клавиши C++
C++ Нажатие клавиши
запретить нажатие клавиши Win C++
C++ Реакция на нажатие клавиши
C++ Реакция на нажатие клавиш (вверх, вниз, влево, вправо)
C++ Нажатие клавиши в консоли
C++ Нажатие клавиши программно
C++ Имитировать нажатие клавиши
C++ Странная реакция на нажатие стрелки
Как послать нажатие клавиши в другое окно программы? C++
C++ Нажатие клавиши
C++ Реакция на нажатие клавиши независимо от раскладки клавиатуры

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dimcoder
Полярный
453 / 426 / 66
Регистрация: 11.09.2011
Сообщений: 1,126
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 т.к. идет приравнивание.
Короче со всем разобрался, может кому то еще поможет.
Тема закрыта.
Yandex
Объявления
28.03.2014, 09:48     Медленная реакция программы на нажатие клавиши в игре
Ответ Создать тему
Опции темы

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