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

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

Восстановить пароль Регистрация
 
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
27.03.2014, 16:12     Медленная реакция программы на нажатие клавиши в игре #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++ Нажатие клавиши
C++ Реакция на нажатие клавиши
C++ Реакция на нажатие клавиш (вверх, вниз, влево, вправо)
C++ Нажатие клавиши в консоли
C++ Странная реакция на нажатие стрелки
Как послать нажатие клавиши в другое окно программы? C++
C++ Нажатие клавиши

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
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     Медленная реакция программы на нажатие клавиши в игре
Ответ Создать тему
Опции темы

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