0 / 0 / 0
Регистрация: 22.09.2020
Сообщений: 34

Как сделать выход из функции, по нажатию на любую клавишу. С использованием SDL 1.0

08.01.2021, 15:45. Показов 18575. Ответов 1
Метки c++ (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Сделал обычный таймер с использованием SDL 1.0. Я хочу, чтобы функция прекращала работать, при нажатии на любую клавишу. Как это сделать ?
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#ifdef __cplusplus
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
#else
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
#endif
 
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
 
 
 
int Timer(SDL_Surface *screen)
{
    SDL_Surface *text_surface = NULL;
    SDL_Rect dst;
    SDL_Event event;
    SDL_Color text_color = {255,0,0};
    TTF_Font *fnt = NULL;
 
    char *text;
 
    int ms = 0, interval;
 
    int s = 0;
    int m = 0;
    int h = 0;
 
    if(TTF_Init()) return 201;
    fnt = TTF_OpenFont("CharisSILR.ttf", 29);
    if(!fnt)
    {
        TTF_Quit();
        SDL_Quit();
    }
 
    dst.x = 500/2;
    dst.y = 500/2;
    dst.w = 1;
    dst.h = 1;
 
    int b = SDL_GetTicks();
    interval = b - ms;
 
 
    while(SDL_WaitEvent(&event))
    {
 
            while(event.type != SDL_KEYDOWN)//Функция, которая должна прекращать свою работу, при нажатии на клавишу
            {
 
                SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
 
                ms = SDL_GetTicks() - interval;
                s = ms / 1000;
 
                if(s % 60 == 0 && s!=0)
                {
                    m += 1;
                    s = 0;
                    interval+=60000;
                }
 
                sprintf(text, "%02d:%02d", m, s);
                if(text_surface = TTF_RenderUTF8_Solid(fnt, text, text_color))
                {
                    SDL_BlitSurface(text_surface, NULL, screen, &dst);
                    SDL_FreeSurface(text_surface);
                    text_surface = NULL;
                }
                SDL_Flip(screen);
            }
 
    }
    return 205;
}
 
 
int main ( int argc, char** argv )
{
    SDL_Surface *screen;
    SDL_Event event;
 
    if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) return 101;
    if(TTF_Init()) return 102;
 
    screen = SDL_SetVideoMode(500, 500, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    if(!screen)
    {
        TTF_Quit();
        SDL_Quit();
        return 103;
    }
    SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
    SDL_Flip(screen);
 
    while(SDL_WaitEvent(&event))
    {
        if(event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE)
        {
 
            TTF_Quit();
            SDL_Quit();
            return 11;
        }
 
        if(event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_t)
        {
            Timer(screen);
        }
    }
 
 
    TTF_Quit();
    SDL_Quit();
    return 10;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.01.2021, 15:45
Ответы с готовыми решениями:

Закрыть программу по нажатию на любую клавишу
Uses graphabs; Begin Circle(50,50,25) End. Как сделать так, чтобы эта программа закрывалась по нажатию любой клавиши? ...

Выход из цикла по нажатию на клавишу
Необходимо выйти из цикла по нажатию на клавишу 'q'. Схема такая: repeat //Вызов процедур until (пользователь нажал клавишу q);

Переход в режим slowly после нажатию на любую клавишу при старте компьтера
Имеем мать MCP 6PB M2+ Ver 6.5 На ней необходимо перебить винду. После нажатия кнопки &quot;вкл&quot; он включается и нормально пытается...

1
0 / 0 / 0
Регистрация: 22.09.2020
Сообщений: 34
08.01.2021, 21:49  [ТС]
Проблему решил. Тему можно закрывать. Решение приложу ниже
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#ifdef __cplusplus
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
#else
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
#endif
 
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
 
 
int main ( int argc, char** argv )
{
    SDL_Surface *screen;
    SDL_Surface *text_surface = NULL;
    SDL_Rect dst;
    SDL_Color text_color = {255, 0, 0};
    SDL_Event event;
 
    TTF_Font *fnt = NULL;
 
 
    char *text;
 
    int ms = 0;
    int interval;
    int s = 0;
    int m = 0;
 
 
    if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) return 101;
    if(TTF_Init()) return 102;
 
    fnt = TTF_OpenFont("CharisSILR.ttf", 29);
    if(!fnt)
    {
        TTF_Quit();
        SDL_Quit();
    }
 
    dst.x = 500/2;
    dst.y = 500/2;
    dst.w = 1;
    dst.h = 1;
 
    screen = SDL_SetVideoMode(500, 500, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    if(!screen)
    {
        TTF_Quit();
        SDL_Quit();
        return 103;
    }
    SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
    SDL_Flip(screen);
 
    int b = SDL_GetTicks();
    interval = b - ms;
 
 
    while(m!=10)
    {
        while(SDL_PollEvent(&event))
        {
            if(event.type == SDL_KEYDOWN) return 209;
        }
 
        SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
        ms = SDL_GetTicks() - interval;
 
        s = ms / 1000;
 
        if(s % 60 == 0 && s != 0)
        {
            m += 1;
            s = 0;
            interval += 60000;
        }
 
        sprintf(text, "%02d:%02d", m, s);
        if(text_surface = TTF_RenderUTF8_Solid(fnt, text, text_color))
        {
            SDL_BlitSurface(text_surface, NULL, screen, &dst);
            SDL_FreeSurface(text_surface);
            text_surface = NULL;
        }
        SDL_Flip(screen);
    }
 
    TTF_Quit();
    SDL_Quit();
    return 10;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.01.2021, 21:49
Помогаю со студенческими работами здесь

Как сделать если нажали любую клавишу переходим в следущий метод?
Как сделать если нажали любую клавишу переходим в следущий метод?

Как сделать выход из формы по нажатию Esc?
То есть как запустить функцию выхода по нажатию Esc в программе, срабатывающею при нажатии кнопки выход (то есть мою функцию)?

Как сделать выход из консоли по нажатию Esc?
как сделать выход из консоли по нажатию Esc?

Как сделать выход из программы по нажатию клавиши F9?
Привет всем! Подскажите пожалуйста, как сделать выход из программы по нажатию клавиши f9?

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


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

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

Новые блоги и статьи
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
Dispose и Finalize в C#
stackOverflow 12.06.2025
Работая с C# больше десяти лет, я снова и снова наблюдаю одну и ту же историю: разработчики наивно полагаются на сборщик мусора, как на волшебную палочку, которая решит все проблемы с памятью. Да,. . .
Повышаем производительность игры на Unity 6 с GPU Resident Drawer
GameUnited 11.06.2025
Недавно копался в новых фичах Unity 6 и наткнулся на GPU Resident Drawer - штуку, которая заставила меня присвистнуть от удивления. По сути, это внутренний механизм рендеринга, который автоматически. . .
Множества в Python
py-thonny 11.06.2025
В Python существует множество структур данных, но иногда я сталкиваюсь с задачами, где ни списки, ни словари не дают оптимального решения. Часто это происходит, когда мне нужно быстро проверять. . .
Работа с ccache/sccache в рамках C++
Loafer 11.06.2025
Утилиты ccache и sccache занимаются тем, что кешируют промежуточные результаты компиляции, таким образом ускоряя последующие компиляции проекта. Это означает, что если проект будет компилироваться. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru