当我在 C++/SFML 中按下鼠标按钮时如何绘制球
How draw a ball when i press a mouse button in C++/SFML
我正在使用 SFML 在 C++ 中做一个游戏,我想在屏幕上绘制一个冰球,然后在按下鼠标左键时在屏幕上看到它 "walking"。但是当我按下按钮时,它并没有画出冰球。你有解决问题的答案吗?
主要:
#include <iostream>
#include <SFML/Graphics.hpp>
#include <string>
int main(int argc, char* argv[])
{
sf::RenderWindow window;
window.create(sf::VideoMode(1320, 840), "Game");
window.setFramerateLimit(60);
window.setVerticalSyncEnabled(true);
sf::Color color(255, 255, 255, 100);
sf::Time time = sf::seconds(2);
sf::Clock clock;
sf::Time time2 = clock.getElapsedTime();
std::cout << time.asSeconds() << std::endl;
std::cout << time2.asSeconds() << std::endl;
//clock.restart();
//TEXTURE
sf::Texture bgTexture;
if (!bgTexture.loadFromFile("file", sf::IntRect(0, 0, 1320, 840)))
{ std::cout << "Error: background not loaded" << std::endl; }
sf::Texture pTexture;
if (!pTexture.loadFromFile("file", sf::IntRect(0, 0, 32, 32)))
{ std::cout << "Error: player not loaded" << std::endl; }
sf::Texture ibTexture;
if (!ibTexture.loadFromFile("file"))
{ std::cout << "Error: ice-ball not loaded" << std::endl; }
//SPRITE
sf::Sprite background;
background.setTexture(bgTexture);
sf::Sprite player;
player.setTexture(pTexture);
player.setScale(2, 2);
player.setPosition(628, 388);
sf::Sprite iceBall;
iceBall.setTexture(ibTexture);
iceBall.setScale(1.5, 1.5);
//FONT
sf::Font font;
if (!font.loadFromFile("file"))
{ std::cout << "Error: font not loaded" << std::endl; }
//TEXT
sf::Text commands;
commands.setFont(font);
commands.setCharacterSize(54);
commands.setColor(sf::Color::Black);
commands.setString("D=Right \nA=Left \nW=Up \nS=DWON \n(also the arrows)");
commands.setPosition(213, 123);
while (window.isOpen()) {
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 || event.key.code == sf::Keyboard::Right)
{ player.move(10, 0); }
else if (event.key.code == sf::Keyboard::A || event.key.code == sf::Keyboard::Left)
{ player.move(-10, 0); }
else if (event.key.code == sf::Keyboard::W || event.key.code == sf::Keyboard::Up)
{ player.move(0, -10); }
else if (event.key.code == sf::Keyboard::S || event.key.code == sf::Keyboard::Down)
{ player.move(0, 10); }
}
/*if (event.type == sf::Event::MouseMoved)
{
std::cout << "X: " << event.mouseMove.x << " y: " << event.mouseMove.y << std::endl;
}*/
if (event.type == sf::Event::MouseButtonPressed) {
if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) {
std::cout << "Left mouse button pressed" << std::endl;
iceBall.setPosition(event.mouseMove.x, event.mouseMove.y);
window.draw(iceBall);
iceBall.move(event.mouseMove.x++, event.mouseMove.y++);
}
}
}
window.clear(color);
window.draw(background);
window.draw(player);
window.draw(commands);
window.display();
}
return 0;
}
让我们看看您的程序的工作流程:
- 你处理事件,根据左键状态画冰球。
- 然后,在事件处理之后,您清空屏幕并绘制更多内容。
因此,你永远不会真正展示球。
相反,按如下方式构建您的程序:
while (window.isOpen) {
sf::Event event;
while (window.pollEvent(event)) {
// Handle event & game *logic* here -- not drawing
// e.g. move entities
if (event.type == sf::Event::MouseButtonPressed && event.mouseButton.button == sf::Mouse::Left) {
iceBall.setPosition(event.mouseButton.x, event.mouseButton.y);
// CAREFUL HERE: you mixed wrong element of the union event.
}
}
// Draw everything here
window.clear();
window.draw(background);
window.draw(player);
window.draw(iceBall);
window.draw(command);
window.display();
}
补充说明:在您的代码中您使用了 event.mouseMove
而 event
的类型不是鼠标移动。这是无效的。查看 tutorial,尤其是这条注释:
Read the above paragraph once again and make sure that you fully understand it, the sf::Event union is the cause of many problems for inexperienced programmers.
我正在使用 SFML 在 C++ 中做一个游戏,我想在屏幕上绘制一个冰球,然后在按下鼠标左键时在屏幕上看到它 "walking"。但是当我按下按钮时,它并没有画出冰球。你有解决问题的答案吗?
主要:
#include <iostream>
#include <SFML/Graphics.hpp>
#include <string>
int main(int argc, char* argv[])
{
sf::RenderWindow window;
window.create(sf::VideoMode(1320, 840), "Game");
window.setFramerateLimit(60);
window.setVerticalSyncEnabled(true);
sf::Color color(255, 255, 255, 100);
sf::Time time = sf::seconds(2);
sf::Clock clock;
sf::Time time2 = clock.getElapsedTime();
std::cout << time.asSeconds() << std::endl;
std::cout << time2.asSeconds() << std::endl;
//clock.restart();
//TEXTURE
sf::Texture bgTexture;
if (!bgTexture.loadFromFile("file", sf::IntRect(0, 0, 1320, 840)))
{ std::cout << "Error: background not loaded" << std::endl; }
sf::Texture pTexture;
if (!pTexture.loadFromFile("file", sf::IntRect(0, 0, 32, 32)))
{ std::cout << "Error: player not loaded" << std::endl; }
sf::Texture ibTexture;
if (!ibTexture.loadFromFile("file"))
{ std::cout << "Error: ice-ball not loaded" << std::endl; }
//SPRITE
sf::Sprite background;
background.setTexture(bgTexture);
sf::Sprite player;
player.setTexture(pTexture);
player.setScale(2, 2);
player.setPosition(628, 388);
sf::Sprite iceBall;
iceBall.setTexture(ibTexture);
iceBall.setScale(1.5, 1.5);
//FONT
sf::Font font;
if (!font.loadFromFile("file"))
{ std::cout << "Error: font not loaded" << std::endl; }
//TEXT
sf::Text commands;
commands.setFont(font);
commands.setCharacterSize(54);
commands.setColor(sf::Color::Black);
commands.setString("D=Right \nA=Left \nW=Up \nS=DWON \n(also the arrows)");
commands.setPosition(213, 123);
while (window.isOpen()) {
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 || event.key.code == sf::Keyboard::Right)
{ player.move(10, 0); }
else if (event.key.code == sf::Keyboard::A || event.key.code == sf::Keyboard::Left)
{ player.move(-10, 0); }
else if (event.key.code == sf::Keyboard::W || event.key.code == sf::Keyboard::Up)
{ player.move(0, -10); }
else if (event.key.code == sf::Keyboard::S || event.key.code == sf::Keyboard::Down)
{ player.move(0, 10); }
}
/*if (event.type == sf::Event::MouseMoved)
{
std::cout << "X: " << event.mouseMove.x << " y: " << event.mouseMove.y << std::endl;
}*/
if (event.type == sf::Event::MouseButtonPressed) {
if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) {
std::cout << "Left mouse button pressed" << std::endl;
iceBall.setPosition(event.mouseMove.x, event.mouseMove.y);
window.draw(iceBall);
iceBall.move(event.mouseMove.x++, event.mouseMove.y++);
}
}
}
window.clear(color);
window.draw(background);
window.draw(player);
window.draw(commands);
window.display();
}
return 0;
}
让我们看看您的程序的工作流程:
- 你处理事件,根据左键状态画冰球。
- 然后,在事件处理之后,您清空屏幕并绘制更多内容。
因此,你永远不会真正展示球。
相反,按如下方式构建您的程序:
while (window.isOpen) {
sf::Event event;
while (window.pollEvent(event)) {
// Handle event & game *logic* here -- not drawing
// e.g. move entities
if (event.type == sf::Event::MouseButtonPressed && event.mouseButton.button == sf::Mouse::Left) {
iceBall.setPosition(event.mouseButton.x, event.mouseButton.y);
// CAREFUL HERE: you mixed wrong element of the union event.
}
}
// Draw everything here
window.clear();
window.draw(background);
window.draw(player);
window.draw(iceBall);
window.draw(command);
window.display();
}
补充说明:在您的代码中您使用了 event.mouseMove
而 event
的类型不是鼠标移动。这是无效的。查看 tutorial,尤其是这条注释:
Read the above paragraph once again and make sure that you fully understand it, the sf::Event union is the cause of many problems for inexperienced programmers.