1
Window / Smooth movement
« on: October 12, 2022, 03:42:15 pm »
Hello. I'm new to SFML and trying to move a circle without repeat delay. The problem is that circle only moves when I press the button, but it stops moving after that(ie it moves only one time, then I have to press the button again). It's weird though that if 'A' is pressed and I start moving cursor on the window the circle starts to move.
#include <SFML/Graphics.hpp>
int main()
{
sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
sf::CircleShape shape(100.f);
shape.setPosition(50.0f, 50.0f);
shape.setFillColor(sf::Color::Green);
bool flag = false;
window.setKeyRepeatEnabled(false);
while (window.isOpen())
{
sf::Event evnt;
while (window.pollEvent(evnt))
{
if (evnt.type == sf::Event::Closed) {
window.close();
}
if (evnt.type == sf::Event::Resized) {
sf::FloatRect visibleArea(0.f, 0.f, evnt.size.width, evnt.size.height);
window.setView(sf::View(visibleArea));
}
if (evnt.type == sf::Event::KeyPressed) {
if (evnt.key.code == sf::Keyboard::A) {
flag = true;
}
}
if (evnt.type == sf::Event::KeyReleased) {
if (evnt.key.code == sf::Keyboard::A) {
flag = false;
}
}
if (flag) {
sf::Vector2f movement;
movement = shape.getPosition();
movement.x += 5.0f;
movement.y += 5.0f;
shape.setPosition(movement);
}
}
window.clear();
window.draw(shape);
window.display();
}
return 0;
}
int main()
{
sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
sf::CircleShape shape(100.f);
shape.setPosition(50.0f, 50.0f);
shape.setFillColor(sf::Color::Green);
bool flag = false;
window.setKeyRepeatEnabled(false);
while (window.isOpen())
{
sf::Event evnt;
while (window.pollEvent(evnt))
{
if (evnt.type == sf::Event::Closed) {
window.close();
}
if (evnt.type == sf::Event::Resized) {
sf::FloatRect visibleArea(0.f, 0.f, evnt.size.width, evnt.size.height);
window.setView(sf::View(visibleArea));
}
if (evnt.type == sf::Event::KeyPressed) {
if (evnt.key.code == sf::Keyboard::A) {
flag = true;
}
}
if (evnt.type == sf::Event::KeyReleased) {
if (evnt.key.code == sf::Keyboard::A) {
flag = false;
}
}
if (flag) {
sf::Vector2f movement;
movement = shape.getPosition();
movement.x += 5.0f;
movement.y += 5.0f;
shape.setPosition(movement);
}
}
window.clear();
window.draw(shape);
window.display();
}
return 0;
}