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

SDL и задержка движения персонажа при зажатии клавиши - C++

Восстановить пароль Регистрация
 
melodicwing
0 / 0 / 0
Регистрация: 31.01.2014
Сообщений: 7
05.02.2014, 03:32     SDL и задержка движения персонажа при зажатии клавиши #1
Всем доброго времени суток.
Изучаю библиотеку SDL и возникла такая проблема: при зажатии клавиши (например, что бы персонаж шел в сторону), текстура персонажа сначала двигается на один шаг в нужном направлении, потом идет задержка порядка секунды и после нее начинается непрерывное движение. Можно ли как-то убрать эту задержку?
Вот как я отлавливаю нажатие клавиши:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
while (SDL_PollEvent(&event))
        {
            //Если нажали клавишу
            if (event.type == SDL_KEYDOWN)
            {
                switch (event.key.keysym.sym)
                {
                case SDLK_UP: draqon4ik.move(UP); break;
                case SDLK_RIGHT: draqon4ik.move(RIGHT); break;
                case SDLK_DOWN: draqon4ik.move(DOWN); break;
                case SDLK_LEFT: draqon4ik.move(LEFT); break;
                }
            }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
05.02.2014, 14:17     SDL и задержка движения персонажа при зажатии клавиши #2
с SDL не знаком, но у меня вопрос ?
почему у вас обработка в цикле, это так в примерах по обработке событий показано ?
melodicwing
0 / 0 / 0
Регистрация: 31.01.2014
Сообщений: 7
05.02.2014, 15:01  [ТС]     SDL и задержка движения персонажа при зажатии клавиши #3
Да, так показано в примерах.
К том же, если изменить while на if, то (по крайней мере внешне) ничего не поменяется. Задержка все так же есть.
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
05.02.2014, 15:37     SDL и задержка движения персонажа при зажатии клавиши #4
Вероятно тормаза из-за загрузки

C++
1
draqon4ik.move()
Какие тут действия происходят. (код??)
admsasha
12 / 12 / 4
Регистрация: 11.06.2011
Сообщений: 202
05.02.2014, 15:49     SDL и задержка движения персонажа при зажатии клавиши #5
SDL_KEYDOWN - реагирует на событие нажатие клавиши вниз. Если нажать в любом редакторе кнопку и удержать её, точно так же будет. Чтобы получить то, что вы хотите, можно проверять состояние нужной клавиши, через SDL_GetKeyState(NULL)
melodicwing
0 / 0 / 0
Регистрация: 31.01.2014
Сообщений: 7
06.02.2014, 11:09  [ТС]     SDL и задержка движения персонажа при зажатии клавиши #6
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
void DRAQON::move(int dir)
{
    //изменяем stop на false (для правильной отрисовки анимации)
    this->changeStop(false);
 
    //если меняем направление движения - сбрасываем кадр
    if (dir != this->dir) { this->frames = 0; this->reset = false; }
 
    //длина смещения
    int val = 3;
 
    //сохраняем направление
    this->dir = dir;
    
    switch (dir)
    {
    case UP:
        this->y -= val;
        if (this->y < 0) this->y = 0;
        break;
    case RIGHT:
        this->x += val;
        if (this->x+96 > 640) this->x = 640-96;
        break;
    case DOWN:
        this->y += val;
        if (this->y+96 > 480) this->y = 480-96;
        break;
    case LEFT:
        this->x -= val;
        if (this->x < 0) this->x = 0;
        break;
    }
}
Добавлено через 20 минут
Пока что сделал такой вариант. Задержка пропала, но есть "фальшивые срабатывания", когда зажимаешь в одну сторону, потом в другую (одновременно нажаты две клавиши), а потом отпускаешь первую клавишу, срабатывает SDL_KEYUP и на какой-то момент происходит задержка.
Спасибо за совет по поводу SDL_GetKeyState. Вечером попробую и отпишусь о результатах
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
//Пока пользователь не захотел выйти
    while (quit == false)
    {
        //Если есть события для обработки
        while (SDL_PollEvent(&event))
        {
            //Если нажали клавишу
            if (event.type == SDL_KEYDOWN)
            {
                if (event.key.keysym.sym == SDLK_UP ||
                    event.key.keysym.sym == SDLK_RIGHT ||
                    event.key.keysym.sym == SDLK_DOWN ||
                    event.key.keysym.sym == SDLK_LEFT)
                    draqon4ik.changeStop(false);
            }
            if (event.type == SDL_KEYUP)
            {
                if (event.key.keysym.sym == SDLK_UP ||
                    event.key.keysym.sym == SDLK_RIGHT ||
                    event.key.keysym.sym == SDLK_DOWN ||
                    event.key.keysym.sym == SDLK_LEFT)
                    draqon4ik.changeStop(true);
            }
 
            //Если пользователь пытается закрыть приложение
            if (event.type == SDL_QUIT)
            {
                //Завершить программу
                quit = true;
            }
        }
 
        SDL_RenderClear(ren);
 
        //отрисовываем фон
        //...
 
        if (!draqon4ik.isStop())
            switch (event.key.keysym.sym)
            {
            case SDLK_UP: draqon4ik.move(UP); break;
            case SDLK_RIGHT: draqon4ik.move(RIGHT); break;
            case SDLK_DOWN: draqon4ik.move(DOWN); break;
            case SDLK_LEFT: draqon4ik.move(LEFT); break;
            }
 
        draqon4ik.draw(ren);
 
        //Обновить экран
        SDL_RenderPresent(ren);
    }
Добавлено через 18 часов 59 минут
Итого, вот конечный вариант, как у меня сейчас сделано:
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
    //Пока пользователь не захотел выйти
    while (quit == false)
    {
        //Если есть события для обработки
        while (SDL_PollEvent(&event))
        {
            //Если пользователь пытается закрыть приложение
            if (event.type == SDL_QUIT)
            {
                //Завершить программу
                quit = true;
            }
        }
 
        if (keys[SDL_SCANCODE_UP] || keys[SDL_SCANCODE_RIGHT] || keys[SDL_SCANCODE_DOWN] || keys[SDL_SCANCODE_LEFT])
        {
            draqon4ik.changeStop(false);
        }
        else draqon4ik.changeStop(true);
 
        SDL_RenderClear(ren);
 
        //отрисовываем фон
        //...
        
        if (!draqon4ik.isStop())
        {
            if (keys[SDL_SCANCODE_UP]) draqon4ik.move(UP);
            if (keys[SDL_SCANCODE_RIGHT]) draqon4ik.move(RIGHT);
            if (keys[SDL_SCANCODE_DOWN]) draqon4ik.move(DOWN);
            if (keys[SDL_SCANCODE_LEFT]) draqon4ik.move(LEFT);
        }
 
        draqon4ik.draw(ren);
 
        //Обновить экран
        SDL_RenderPresent(ren);
    }
и до этого в самом верху после инклюдов:
C++
1
const Uint8* keys = SDL_GetKeyboardState(NULL);
Yandex
Объявления
06.02.2014, 11:09     SDL и задержка движения персонажа при зажатии клавиши
Ответ Создать тему
Опции темы

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