c++ 按钮在cpp sfml库不响应我的鼠标输入

e0uiprwp  于 2023-01-10  发布在  其他
关注(0)|答案(1)|浏览(122)

我必须使四开游戏作为一个图形用户界面程序,所以首先我想在菜单按钮,但我不知道为什么它不填充颜色时,我的鼠标在按钮。
代码:

#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include<bits/stdc++.h>
using namespace std;
using namespace sf;
class button{
    public:
        bool isClicked=false;
        int Yposition;
        int Xposition;
        bool isMouseOn=false;
        
};
int main(){
    //Defining variables
    Vector2i mouseWindowPosition;
    //rendering window "window"
    RenderWindow window(VideoMode(800,600), "Quarto game - menu", Style::Default);
    window.display();
    //setting vsync
    window.setVerticalSyncEnabled(true);
    //loading textures
    Texture backgroundTexture;
    backgroundTexture.loadFromFile("Resources/background.png");
    //making sprites
    Sprite backgroundSprite;
    backgroundSprite.setTexture(backgroundTexture);
    backgroundSprite.setPosition(0,0);
    //making buttons and their colors
    RectangleShape playButton(Vector2f(200.f,50.f));
    playButton.setFillColor(Color(128,128,128));
    playButton.setOutlineThickness(5.f);
    playButton.setOutlineColor(Color(100,100,100));
    button play;
    //setting position of buttons
    play.Xposition=70;
    play.Yposition=200;
    //game loop
    while(window.isOpen()){
        Event event;
        playButton.setFillColor(Color(128,128,128));
        play.isMouseOn=false;
        while(window.pollEvent(event)){
            if(event.type==Event::Closed){
                window.close();
            }
        }
        //Getting mouse position
        mouseWindowPosition=Mouse::getPosition(window);
        if(mouseWindowPosition.x<=play.Xposition && mouseWindowPosition.y<=play.Yposition && mouseWindowPosition.x>=play.Xposition+200 && mouseWindowPosition.y>=play.Yposition+50){
            play.isMouseOn=true;
        }
        //Drawing to screen
        window.clear();
        window.draw(backgroundSprite);
        if(play.isClicked==false){
            playButton.setPosition(Vector2f(play.Xposition, play.Yposition));
            window.draw(playButton);
        }
        if(play.isMouseOn==true){
            playButton.setFillColor(Color(128,128,128));
        }
        window.display();
    }
}

在sfml中制作按钮有没有更好的方法?

cngwdvgl

cngwdvgl1#

按钮不能填充的直接原因是if语句中的符号颠倒了,使用下面的if语句应该可以:

//Getting mouse position
mouseWindowPosition=Mouse::getPosition(window);
if (mouseWindowPosition.x>=play.Xposition && mouseWindowPosition.y>=play.Yposition && 
mouseWindowPosition.x<=play.Xposition+200 && mouseWindowPosition.y<=play.Yposition+50){
    //your code here
}

如果您还不知道,x和y值的排列方式就像一个表格,其中正y向下,而不是笛卡尔坐标系中正y向上。
另一个问题是您正在更新填充的颜色与填充的颜色相同,因此更改该颜色将获得您所需的填充。
此外,逻辑上,您应该交换语句

if (play.isMouseOn == true)
{

}

使用语句

if (play.isClicked == false)
{
    playButton.setPosition(Vector2f(play.Xposition, play.Yposition));
    window.draw(playButton);
    window.display();

}

下面是一个工作代码,当您将鼠标悬停在填充上方时,它会将填充从灰色更改为红色:

#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <iostream>
using namespace std;
using namespace sf;
class button
{
public:
    bool isClicked = false;
    int Yposition;
    int Xposition;
    bool isMouseOn = false;
};
int main()
{
    //Defining variables
    Vector2i mouseWindowPosition;
    //rendering window "window"
    RenderWindow window(VideoMode(800, 600), "Quarto game - menu", Style::Default);
    window.display();
    //setting vsync
    window.setVerticalSyncEnabled(true);
    //loading textures
    Texture backgroundTexture;
    backgroundTexture.loadFromFile("Resources/background.png");
    //making sprites
    Sprite backgroundSprite;
    backgroundSprite.setTexture(backgroundTexture);
    backgroundSprite.setPosition(0, 0);
    //making buttons and their colors
    RectangleShape playButton(Vector2f(200.f, 50.f));
    playButton.setFillColor(Color(100, 100, 100));
    playButton.setOutlineThickness(5.f);
    playButton.setOutlineColor(Color(100, 100, 100));
    button play;
    //setting position of buttons
    play.Xposition = 70;
    play.Yposition = 200;
    //game loop
    while (window.isOpen())
    {
        Event event;
        playButton.setFillColor(Color(128, 128, 128));
        play.isMouseOn = false;
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
            {
                window.close();
            }
        }
        //Getting mouse position
        mouseWindowPosition = Mouse::getPosition(window);
        if (mouseWindowPosition.x >= play.Xposition && mouseWindowPosition.y >= play.Yposition && mouseWindowPosition.x <= play.Xposition + 200 && mouseWindowPosition.y <= play.Yposition + 50)
        {
            play.isMouseOn = true;
        }
        //Drawing to screen
        window.clear();
        window.draw(backgroundSprite);
        if (play.isMouseOn == true)
        {
            playButton.setFillColor(Color(128, 0, 0));
        }
        if (play.isClicked == false)
        {
            playButton.setPosition(Vector2f(play.Xposition, play.Yposition));
            window.draw(playButton);
            window.display();
        }
    }
}

相关问题