Как играть в SFML с переполнением стека

Я делаю игру на C ++ с SFML. Я написал код для перемещения игрока, но когда игрок запускает игру, он начинает двигаться, но когда я оставляю кнопку, игрок возвращается в исходное положение. Вы можете мне помочь, пожалуйста?

Главный:

#include <iostream>
#include <SFML/Graphics.hpp>

int main() {

sf::RenderWindow window(sf::VideoMode(1320, 840), "Window");
window.setPosition(sf::Vector2i(150, 50));
window.setSize(sf::Vector2u(1320, 840));
window.getPosition();
window.setVerticalSyncEnabled(true);
window.setFramerateLimit(5);
window.getSize();

while (window.isOpen()) {

window.clear(sf::Color::White);

//texture
sf::Texture texture;
if (!texture.loadFromFile("/users/gaetanodonnarumma/desktop/background1.png", sf::IntRect(0, 0, 1320, 840))) {
return -1;
}

sf::Texture playerTexture;
if (!playerTexture.loadFromFile("/users/gaetanodonnarumma/desktop/quadrato-giallo.jpg", sf::IntRect(0, 0, 70, 70))) {
return -1;
}

//sprite
sf::Sprite backgroud;
backgroud.setTexture(texture);

sf::Sprite player;
double pX = 0;
double pY = 770;
player.setTexture(playerTexture);
player.setPosition(sf::Vector2f(pX, pY));
player.getPosition();

sf::Event event;

while (window.pollEvent(event)) {

if (event.type == sf::Event::Closed) {
window.close();
}

if (event.type == sf::Event::KeyPressed) {
if (event.key.code == sf::Keyboard::D) {
player.move(10.f, 0.f);
}
}

if (event.type == sf::Event::KeyPressed) {
if (event.key.code == sf::Keyboard::D) {
player.setPosition(pX + 10, 770);
}

}

if (event.type == sf::Event::KeyPressed) {
if (event.key.code == sf::Keyboard::A) {
player.move(-5.f, 0.f);
}
}
}

//draw
window.draw(backgroud);
window.draw(player);

window.display();

}

return 0;

}

3

Решение

Весь ваш код инициализации выполняется на каждом кадре. Это означает, что в каждом кадре вы создаете (и уничтожаете) нового игрока, устанавливаете его текстуру и устанавливаете его положение в [0, 770],

Переместить всю инициализацию до начала основного цикла прорисовки (до while (window.isOpen())).

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]