Форум программистов, компьютерный форум, киберфорум
SFML
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
2 / 2 / 0
Регистрация: 09.02.2020
Сообщений: 84
1

Одиночное нажатие

06.03.2020, 22:28. Показов 4784. Ответов 6
Метки c++, sfml (Все метки)

Author24 — интернет-сервис помощи студентам
Да, такие темы уже были, но ясного для себя ответа я не нашёл.
Мне нужно, чтобы при нажатии(не зажатии!) клавиши "BackSpace" спавнился объект, а если кнопку зажать - то он не должен спавниться

Мне нужно это понять ещё и для обработки нажатий кнопок мыши
C++
1
2
3
4
5
if (Mouse::isButtonPressed(Mouse::Left))
        {
            //code
 
        }
Этот вариант не подойдёт, ибо если я зажму клавишу, это действие выполнится множество раз. Я не хочу, чтобы код срабатывал, если я не отпустил кнопку.

Таймеры, или что-то подобное
C++
1
window.setVerticalSyncEnabled(1);
- не вариант(
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.03.2020, 22:28
Ответы с готовыми решениями:

Как многократнореагировать на одиночное нажатие
Проблема ясна из вопроса - если мне по одному нажатию на кнопку нужно многократно повторять...

Одиночное наследование
Нужно определить три класса: линия, луч и отрезок. Использовать наследование. Проблема...

Одиночное наследование
Помогите! Создайте класс точка, которая имеет координаты. Класс эллипсов, и класс окружностей....

Одиночное наследование
Помогите написать или хотя-бы поясните что требуется от задачи, что должно быть в функциях и в main?

6
6105 / 3460 / 1406
Регистрация: 07.02.2019
Сообщений: 8,799
06.03.2020, 23:29 2
Лучший ответ Сообщение было отмечено FeatheredVortex как решение

Решение

FeatheredVortex,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
while (window.pollEvent(event))
{
    if (event.type == sf::Event::Closed)
    {
        window.close();
    }
    else if (event.type == sf::Event::MouseButtonReleased &&
        event.mouseButton.button == sf::Mouse::Left)
    {
        //...
    }
    else if (event.type == sf::Event::KeyReleased &&
        event.key.code == sf::Keyboard::BackSpace)
    {
        //...
    }
}
1
2 / 2 / 0
Регистрация: 09.02.2020
Сообщений: 84
07.03.2020, 13:52  [ТС] 3
СПАСИБО! Уии, наконец-то нашёлся ответ. Благодарю!

Добавлено через 13 минут
Только после отпускания клавиши кнопка срабатывает мноооого раз, а это портит механику(каждое нажатие переменная переключается с true на false, с false на true)
0
6105 / 3460 / 1406
Регистрация: 07.02.2019
Сообщений: 8,799
07.03.2020, 14:31 4
Цитата Сообщение от FeatheredVortex Посмотреть сообщение
Только после отпускания клавиши кнопка срабатывает мноооого раз
Что то ты выдумываешь...

Добавлено через 3 минуты
Попробуй посмотри на вывод в консоли:
Кликните здесь для просмотра всего текста
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
#include <SFML/Graphics.hpp>
#include <iostream>
 
int main()
{
 
    sf::RenderWindow window(sf::VideoMode(800, 600), "test");
 
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
            {
                window.close();
            }
            else if (event.type == sf::Event::MouseButtonReleased &&
                event.mouseButton.button == sf::Mouse::Left)
            {
                //...
            }
            else if (event.type == sf::Event::KeyReleased &&
                event.key.code == sf::Keyboard::BackSpace)
            {
                std::cerr << "switch\n";
            }
        }
        window.clear();
        window.display();
    }
 
    return 0;
}


Добавлено через 9 минут
FeatheredVortex, вот тебе еще пару вариантов обработки клавиш
Кликните здесь для просмотра всего текста
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
// проверка нажатия в течении заданного интервала
// [in] dt - интервал времени, прошедший с предыдущего вызова
// [in] key - клавиша для проверки
bool check_key_state(float dt, sf::Keyboard::Key key)
{
    static constexpr float latency_max = 0.5f;  // интервал, в течении которого нажатая клавиша не считается "зажатой"
    static bool key_state[sf::Keyboard::KeyCount]{};
    static float latency[sf::Keyboard::KeyCount]{};
 
    if (sf::Keyboard::isKeyPressed(key))
    {
        if (key_state[key]) latency[key] -= dt;
        else
        {
            key_state[key] = true;
            latency[key] = latency_max;
        }
    }
    else if (key_state[key])
    {
        key_state[key] = false;
        return latency[key] > 0;
    }
    return false;
}
// а это просто "отключение" repeat mode
// [in] key - клавиша для проверки
bool check_key_state(sf::Keyboard::Key key)
{
    static bool key_state[sf::Keyboard::KeyCount]{};
    if (sf::Keyboard::isKeyPressed(key))
    {
        if (!key_state[key])
            return key_state[key] = true;
    }
    else if (key_state[key])
    {
        key_state[key] = false;
    }
    return false;
}
1
2 / 2 / 0
Регистрация: 09.02.2020
Сообщений: 84
07.03.2020, 14:37  [ТС] 5
У тебя в коде всё прекрасно, но кода я вставляю этот отрывок в свой код, то действие выполняется множество раз
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#include <iostream>
#include <SFML/Graphics.hpp>
#include <windows.h>
using namespace sf;
using namespace std;
 
int main()
{
setlocale(LC_ALL, "Russian");
    int d, cell;
    d = 2;
    int br;
    bool mouse = false;
    int arr[9];
    int i = 9;
    for(int l = 9; l > 0; l--)
    {
        arr[l-1] = 0;
    }
    arr[0] = 0;
    float s = 14.5;
    float b = 16*s/3;
    Image image;
    Texture texture;
    Sprite sprite;
    image.loadFromFile("tic-tac-toe.png");
    texture.loadFromImage(image);
    sprite.setTexture(texture);
    sprite.setScale(s,s);
 
    Image BarImage;
    Texture BarTexture;
    Sprite BarSprite;
    BarImage.loadFromFile("bar.png");
    BarTexture.loadFromImage(BarImage);
    BarSprite.setTexture(BarTexture);
    BarSprite.setScale(s,s/2);
    BarSprite.setPosition(0,0);
 
 
 
 
RenderWindow window(sf::VideoMode(48*s, 48*s + b),"Tic-Tac-Toe", Style::Close);
Event event;
 
 
 
while (window.isOpen())
    {
 
 
    while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }
 
       // if(i == 0)
       // {
          window.clear();
        //}
 
 
      /*  if (IntRect(0, 0, 16*s, 16*s).contains(Mouse::getPosition(window)))  {cell = 0; }
        if (IntRect(16*s, 0, 16*s, 16*s).contains(Mouse::getPosition(window)))  {cell = 1; }
        if (IntRect(32*s,0, 16*s, 16*s).contains(Mouse::getPosition(window)))  {cell = 2; }
        if (IntRect(0,16*s, 16*s, 16*s).contains(Mouse::getPosition(window)))  {cell = 3; }
        if (IntRect(16*s, 16*s, 16*s, 16*s).contains(Mouse::getPosition(window)))  {cell = 4; }
        if (IntRect(32*s, 16*s, 16*s, 16*s).contains(Mouse::getPosition(window)))  {cell = 5; }
        if (IntRect(0, 32*s, 16*s, 16*s).contains(Mouse::getPosition(window)))  {cell = 6; }
        if (IntRect(16*s, 32*s, 16*s, 16*s).contains(Mouse::getPosition(window)))  {cell = 7; }
        if (IntRect(32*s, 32*s, 16*s, 16*s).contains(Mouse::getPosition(window)))  {cell = 8; }
 
 
        if (Mouse::isButtonPressed(Mouse::Left) & IntRect(0,0, 48*s, 48*s).contains(Mouse::getPosition(window)))
        {
            if(arr[cell] == 0){arr[cell] = d;}
            else {cout<<"Эта клетка занята!"<<endl;}
 
 
 
        } */
 
          for(i = i; i > -1; i--)
          {
 
 
           switch(arr[i])
           {
               case 0: sprite.setTextureRect(IntRect(0,0,16,16)); break;
               case 1: sprite.setTextureRect(IntRect(16,0,16,16)); break;
               case 2: sprite.setTextureRect(IntRect(32,0,16,16)); break;
           }
 
           switch(i)
           {
               case 0: sprite.setPosition(0,0 + b); break;
               case 1: sprite.setPosition(16*s,0 + b); break;
               case 2: sprite.setPosition(32*s,0 + b); break;
               case 3: sprite.setPosition(0,16*s + b); break;
               case 4: sprite.setPosition(16*s,16*s + b); break;
               case 5: sprite.setPosition(32*s,16*s + b); break;
               case 6: sprite.setPosition(0,32*s + b); break;
               case 7: sprite.setPosition(16*s,32*s + b); break;
               case 8: sprite.setPosition(32*s,32*s + b); break;
           }
 
window.draw(sprite);
 
          }
 
          if(i <= 0)
           {
               i = 9;
           }
if (IntRect(0, 0 + b, 16*s, 16*s).contains(Mouse::getPosition(window)))  {cell = 0; }
        if (IntRect(16*s, 0 + b, 16*s, 16*s).contains(Mouse::getPosition(window)))  {cell = 1; }
        if (IntRect(32*s,0 + b, 16*s, 16*s).contains(Mouse::getPosition(window)))  {cell = 2; }
        if (IntRect(0,16*s, 16*s + b, 16*s).contains(Mouse::getPosition(window)))  {cell = 3; }
        if (IntRect(16*s, 16*s + b, 16*s, 16*s).contains(Mouse::getPosition(window)))  {cell = 4; }
        if (IntRect(32*s, 16*s + b, 16*s, 16*s).contains(Mouse::getPosition(window)))  {cell = 5; }
        if (IntRect(0, 32*s + b, 16*s, 16*s).contains(Mouse::getPosition(window)))  {cell = 6; }
        if (IntRect(16*s, 32*s + b, 16*s, 16*s).contains(Mouse::getPosition(window)))  {cell = 7; }
        if (IntRect(32*s, 32*s + b, 16*s, 16*s).contains(Mouse::getPosition(window)))  {cell = 8; }
 
 
        /*if (Mouse::isButtonPressed(Mouse::Left) & IntRect(0,0, 48*s, 48*s).contains(Mouse::getPosition(window)))
        {
            if(arr[cell] == 0){arr[cell] = d;}
 
        } */
 
        if (event.type == sf::Event::MouseButtonReleased &&
        event.mouseButton.button == sf::Mouse::Left)
       {
         if(d == 1) {d = 2;} else{d = 1;}
         if(arr[cell] == 0){arr[cell] = d;}
 
 
       }
       if (event.type == sf::Event::MouseButtonReleased &&
                event.mouseButton.button == sf::Mouse::Left)
            {
                std::cerr << "switch\n";
            }
 
 
       /*  if (event.type == Event::KeyReleased & IntRect(0,0, 48*s, 48*s).contains(Mouse::getPosition(window)))
         if ((event.key.code == Mouse::Right))
           {
 
                        if(arr[cell] == 0)
                        {arr[cell] = d;}
                        mouse = false;
            } */
 
    /*   if(Keyboard::isKeyPressed(Keyboard::Q))
       {
           d = 1;
       }
       if(Keyboard::isKeyPressed(Keyboard::E))
       {
           d = 2;
       } */
       if(Keyboard::isKeyPressed(Keyboard::R))
       {
           for(int l = 9; l > 0; l--)
    {
        arr[l-1] = 0;
    }
    d = 1;
       }
        window.draw(BarSprite);
        window.display();
    }
 
    return 0;
}
0
6105 / 3460 / 1406
Регистрация: 07.02.2019
Сообщений: 8,799
07.03.2020, 14:44 6
Лучший ответ Сообщение было отмечено FeatheredVortex как решение

Решение

Цитата Сообщение от FeatheredVortex Посмотреть сообщение
но кода я вставляю этот отрывок в свой код
Не туда вставляешь, нужно вставлять в цикл обработки событий (начинается в стр. 52)
1
2 / 2 / 0
Регистрация: 09.02.2020
Сообщений: 84
07.03.2020, 14:54  [ТС] 7
О, спасибо, заработало!
0
07.03.2020, 14:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.03.2020, 14:54
Помогаю со студенческими работами здесь

Одиночное наследование классов.
Определите общий базовый класс Fruit описывающий некоторые характеристики фруктов. Также,...

Больше чем одиночное подключение в сокетах
Проблема в том что при конекте первом всё ок... Сервер пишет &quot;Есть конект.&quot; НО! если ещё 1...

Абстрактный класс, одиночное наследование, далее множественное
Добрый вечер! никак не могу найти информацию о том, как правильно реализуется следующее действие:...

При нажатие нажатие на надпись в HTML менялась значение переменной php
Есть код HTML &lt;div class=&quot;fl_l people_cell&quot;&gt; &lt;a class=&quot;ava&quot;...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru