Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SFML-pollEvent双运行鼠标单击_C++_Loops_Sfml - Fatal编程技术网

C++ SFML-pollEvent双运行鼠标单击

C++ SFML-pollEvent双运行鼠标单击,c++,loops,sfml,C++,Loops,Sfml,我的主要观点如下: #include <SFML/Graphics.hpp> #include <iostream> #include "okno.h" using namespace sf; int main() { // Create the main window RenderWindow app(VideoMode::getDesktopMode(), "Okno" ,Style::Fullscreen); app.setKeyRep

我的主要观点如下:

#include <SFML/Graphics.hpp>
#include <iostream>
#include "okno.h"

using namespace sf;

int main()
{
    // Create the main window

    RenderWindow app(VideoMode::getDesktopMode(), "Okno" ,Style::Fullscreen);
    app.setKeyRepeatEnabled(false);
    okno aplikacja(app);


    // Start the game loop
    while (app.isOpen())
    {
        // Process events
        Event event;
        event.type=Event::JoystickButtonPressed;
      event.mouseButton.button = Mouse::Right;
        while (app.pollEvent(event))
        {

            // Close window : exit
            if (event.type == Event::Closed)
                app.close();

            if( event.type == Event::KeyPressed && event.key.code == Keyboard::Escape )
                app.close();
        }
        aplikacja.click_przyciski(event);







     aplikacja.obsluga_przyciskow();
      event.type=Event::JoystickButtonPressed;
      event.mouseButton.button = Mouse::Right;

     aplikacja.rysuj();
     aplikacja.menu=true;
       event.type=Event::JoystickButtonPressed;
      event.mouseButton.button = Mouse::Right;

            //sleep(seconds(5));

        // Update the window
        //app.display();
    }

    return EXIT_SUCCESS;
}
#include "okno.h"

#include <iostream>

using namespace std;
int wyswietlanie =0;
okno::okno(RenderWindow &app): window(app)
{
    textures[0].loadFromFile("grafika/tlo.png");
    textures[1].loadFromFile("grafika/logo.png");
    textures[2].loadFromFile("grafika/siatka.png");
    textures[3].loadFromFile("grafika/button_start.png");
    textures[4].loadFromFile("grafika/button_informacje.png");
    textures[5].loadFromFile("grafika/button_wyjscie.png");
    textures[6].loadFromFile("grafika/button_cofnij.png");
    czcionka.loadFromFile("czcionki/czcionka_1.ttf");
    for (int j=0;j<i;j++)
        sprites[j].setTexture(textures[j]);
        float x,y;
        x=window.getView().getSize().x;
        y=window.getView().getSize().y;
        tekst.setString("Projekt wykonal : \n    Wojciech Sorota.");
        tekst.setCharacterSize(30);
        tekst.setPosition(x/10,y/10);
        tekst.setColor(sf::Color::Red);
        tekst.setFont(czcionka);
        sprites[0].setScale(x/sprites[0].getTextureRect().width,y/sprites[0].getTextureRect().height);
        sprites[1].setPosition(x/2 - sprites[1].getTextureRect().width/2,y/2 - sprites[1].getTextureRect().height/2);
        sprites[3].setPosition(x/10,y/10);
        sprites[2].setScale(x/2/sprites[2].getTextureRect().width,y/2/sprites[2].getTextureRect().height);
        sprites[2].setPosition(x/8,y/4);
        sprites[4].setPosition( x/10+ sprites[3].getPosition().x + x/ 15,y/10 );
        sprites[5].setPosition(  x/10 +sprites[4].getPosition().x +x/15,y/10);
        sprites[6].setPosition(x/10 + tekst.getPosition().x + tekst.getGlobalBounds().width,y/10);
        menu=true;
}
okno::~okno()
{}
void okno::rysuj()
{
      this->rysuj_intro();

      this->rysuj_menu();

}
void okno::start_gra()
{

}
void okno::click_przyciski(Event &event)
{
    if(event.type == Event::MouseButtonReleased && event.mouseButton.button == Mouse::Left)

{

        if(click_sprite(sprites[3]))
            start_gra();

        else if(click_sprite(sprites[5]))
                    window.close();
                  else if( click_sprite(sprites[4]))
        wyswietl_info(event);

}

}
void okno::wyswietl_info(Event &event)
{
{

    while(1)
        {
    if(sf::Mouse::isButtonPressed(sf::Mouse::Left) && click_sprite(sprites[6]))
    {
          event.type=Event::JoystickButtonPressed;
          event.mouseButton.button = Mouse::Right;
    return;

    }


     window.clear();
         window.draw(sprites[0]);
         window.draw(sprites[2]);
         window.draw(sprites[6]);

         window.draw(tekst);
         obsluga_przyciskow();
         window.display();

}
}}
bool okno::click_sprite(Sprite a)
{
    // transform the mouse position from window coordinates to world coordinates
    sf::Vector2f mouse = window.mapPixelToCoords(sf::Mouse::getPosition(window));
    // retrieve the bounding box of the sprite
    sf::FloatRect bounds = a.getGlobalBounds();
    // hit test
    if (bounds.contains(mouse))
    {
        return true;
    }
    return false;
}
void okno::obluga_cofnij()
{

}
void okno::obsluga_przyciskow()
{

if(mysz_nad_sprite(sprites[3]))
        sprites[3].setColor(sf::Color(100,100,100));
            else
                 sprites[3].setColor(sf::Color(255,255,255));

if(mysz_nad_sprite(sprites[4]))
        sprites[4].setColor(sf::Color(100,100,100));
            else
                 sprites[4].setColor(sf::Color(255,255,255));
if(mysz_nad_sprite(sprites[5]))
        sprites[5].setColor(sf::Color(100,100,100));
            else
                 sprites[5].setColor(sf::Color(255,255,255));
if(mysz_nad_sprite(sprites[6]))
        sprites[6].setColor(sf::Color(100,100,100));
            else
                 sprites[6].setColor(sf::Color(255,255,255));

}
bool okno::mysz_nad_sprite(Sprite a)
{
    sf::Vector2f mouse = window.mapPixelToCoords(sf::Mouse::getPosition(window));
    if (a.getGlobalBounds().contains(mouse))
        return true;
    return false;
}
void okno::rysuj_intro()
{
        if (wyswietlanie == 0)
            {
                for ( int n=0;n<=254;n++)
                {
                    window.clear();
                    sprites[0].setColor(sf::Color(255, 255, 255, n));
                    sprites[1].setColor(sf::Color(255,255,255,n));
                    sleep(milliseconds(n/15));
                    window.draw(sprites[0]);
                    window.draw(sprites[1]);
                    window.display();
                }

                for (int  n=254;n>=0;n--)
                {
                    window.clear();
                    sprites[1].setColor(sf::Color(255, 255, 255, n));
                    sleep(milliseconds(n/15));
                    window.draw(sprites[0]);
                    window.draw(sprites[1]);
                    window.display();
                }
                wyswietlanie++;
            }


}

  void okno::rysuj_menu()
  {
       window.clear();

       if (wyswietlanie==1)
           for ( int n=0;n<=254;n++)
               {
                    window.clear();
                    sprites[2].setColor(sf::Color(255,255,255,n));
                    window.draw(sprites[0]);
                    window.draw(sprites[2]);
                    window.draw(sprites[3]);
                    window.draw(sprites[4]);
                    window.draw(sprites[5]);
                    window.display();
                    if (n==254)
                    wyswietlanie++;
                    window.clear();
                }

         window.draw(sprites[0]);
         window.draw(sprites[2]);
         window.draw(sprites[3]);
         window.draw(sprites[4]);
         window.draw(sprites[5]);
         window.display();
}
#包括
#包括
#包括“okno.h”
使用名称空间sf;
int main()
{
//创建主窗口
RenderWindow应用程序(VideoMode::getDesktopMode(),“Okno”,样式::全屏);
app.setKeyRepeatEnabled(假);
okno aplikacja(应用程序);
//开始游戏循环
while(app.isOpen())
{
//处理事件
事件;
event.type=event::JoystickButtonPressed;
event.mouseButton.button=鼠标::右键;
while(app.pollEvent(事件))
{
//关闭窗口:退出
if(event.type==event::Closed)
app.close();
if(event.type==event::KeyPressed&&event.key.code==Keyboard::Escape)
app.close();
}
aplikacja。单击_przyciski(事件);
aplikacja.obsluga_przyciskow();
event.type=event::JoystickButtonPressed;
event.mouseButton.button=鼠标::右键;
aplikacja.rysuj();
aplikacja.menu=true;
event.type=event::JoystickButtonPressed;
event.mouseButton.button=鼠标::右键;
//睡眠(5秒);
//更新窗口
//app.display();
}
返回退出成功;
}
类okno.cpp如下所示:

#include <SFML/Graphics.hpp>
#include <iostream>
#include "okno.h"

using namespace sf;

int main()
{
    // Create the main window

    RenderWindow app(VideoMode::getDesktopMode(), "Okno" ,Style::Fullscreen);
    app.setKeyRepeatEnabled(false);
    okno aplikacja(app);


    // Start the game loop
    while (app.isOpen())
    {
        // Process events
        Event event;
        event.type=Event::JoystickButtonPressed;
      event.mouseButton.button = Mouse::Right;
        while (app.pollEvent(event))
        {

            // Close window : exit
            if (event.type == Event::Closed)
                app.close();

            if( event.type == Event::KeyPressed && event.key.code == Keyboard::Escape )
                app.close();
        }
        aplikacja.click_przyciski(event);







     aplikacja.obsluga_przyciskow();
      event.type=Event::JoystickButtonPressed;
      event.mouseButton.button = Mouse::Right;

     aplikacja.rysuj();
     aplikacja.menu=true;
       event.type=Event::JoystickButtonPressed;
      event.mouseButton.button = Mouse::Right;

            //sleep(seconds(5));

        // Update the window
        //app.display();
    }

    return EXIT_SUCCESS;
}
#include "okno.h"

#include <iostream>

using namespace std;
int wyswietlanie =0;
okno::okno(RenderWindow &app): window(app)
{
    textures[0].loadFromFile("grafika/tlo.png");
    textures[1].loadFromFile("grafika/logo.png");
    textures[2].loadFromFile("grafika/siatka.png");
    textures[3].loadFromFile("grafika/button_start.png");
    textures[4].loadFromFile("grafika/button_informacje.png");
    textures[5].loadFromFile("grafika/button_wyjscie.png");
    textures[6].loadFromFile("grafika/button_cofnij.png");
    czcionka.loadFromFile("czcionki/czcionka_1.ttf");
    for (int j=0;j<i;j++)
        sprites[j].setTexture(textures[j]);
        float x,y;
        x=window.getView().getSize().x;
        y=window.getView().getSize().y;
        tekst.setString("Projekt wykonal : \n    Wojciech Sorota.");
        tekst.setCharacterSize(30);
        tekst.setPosition(x/10,y/10);
        tekst.setColor(sf::Color::Red);
        tekst.setFont(czcionka);
        sprites[0].setScale(x/sprites[0].getTextureRect().width,y/sprites[0].getTextureRect().height);
        sprites[1].setPosition(x/2 - sprites[1].getTextureRect().width/2,y/2 - sprites[1].getTextureRect().height/2);
        sprites[3].setPosition(x/10,y/10);
        sprites[2].setScale(x/2/sprites[2].getTextureRect().width,y/2/sprites[2].getTextureRect().height);
        sprites[2].setPosition(x/8,y/4);
        sprites[4].setPosition( x/10+ sprites[3].getPosition().x + x/ 15,y/10 );
        sprites[5].setPosition(  x/10 +sprites[4].getPosition().x +x/15,y/10);
        sprites[6].setPosition(x/10 + tekst.getPosition().x + tekst.getGlobalBounds().width,y/10);
        menu=true;
}
okno::~okno()
{}
void okno::rysuj()
{
      this->rysuj_intro();

      this->rysuj_menu();

}
void okno::start_gra()
{

}
void okno::click_przyciski(Event &event)
{
    if(event.type == Event::MouseButtonReleased && event.mouseButton.button == Mouse::Left)

{

        if(click_sprite(sprites[3]))
            start_gra();

        else if(click_sprite(sprites[5]))
                    window.close();
                  else if( click_sprite(sprites[4]))
        wyswietl_info(event);

}

}
void okno::wyswietl_info(Event &event)
{
{

    while(1)
        {
    if(sf::Mouse::isButtonPressed(sf::Mouse::Left) && click_sprite(sprites[6]))
    {
          event.type=Event::JoystickButtonPressed;
          event.mouseButton.button = Mouse::Right;
    return;

    }


     window.clear();
         window.draw(sprites[0]);
         window.draw(sprites[2]);
         window.draw(sprites[6]);

         window.draw(tekst);
         obsluga_przyciskow();
         window.display();

}
}}
bool okno::click_sprite(Sprite a)
{
    // transform the mouse position from window coordinates to world coordinates
    sf::Vector2f mouse = window.mapPixelToCoords(sf::Mouse::getPosition(window));
    // retrieve the bounding box of the sprite
    sf::FloatRect bounds = a.getGlobalBounds();
    // hit test
    if (bounds.contains(mouse))
    {
        return true;
    }
    return false;
}
void okno::obluga_cofnij()
{

}
void okno::obsluga_przyciskow()
{

if(mysz_nad_sprite(sprites[3]))
        sprites[3].setColor(sf::Color(100,100,100));
            else
                 sprites[3].setColor(sf::Color(255,255,255));

if(mysz_nad_sprite(sprites[4]))
        sprites[4].setColor(sf::Color(100,100,100));
            else
                 sprites[4].setColor(sf::Color(255,255,255));
if(mysz_nad_sprite(sprites[5]))
        sprites[5].setColor(sf::Color(100,100,100));
            else
                 sprites[5].setColor(sf::Color(255,255,255));
if(mysz_nad_sprite(sprites[6]))
        sprites[6].setColor(sf::Color(100,100,100));
            else
                 sprites[6].setColor(sf::Color(255,255,255));

}
bool okno::mysz_nad_sprite(Sprite a)
{
    sf::Vector2f mouse = window.mapPixelToCoords(sf::Mouse::getPosition(window));
    if (a.getGlobalBounds().contains(mouse))
        return true;
    return false;
}
void okno::rysuj_intro()
{
        if (wyswietlanie == 0)
            {
                for ( int n=0;n<=254;n++)
                {
                    window.clear();
                    sprites[0].setColor(sf::Color(255, 255, 255, n));
                    sprites[1].setColor(sf::Color(255,255,255,n));
                    sleep(milliseconds(n/15));
                    window.draw(sprites[0]);
                    window.draw(sprites[1]);
                    window.display();
                }

                for (int  n=254;n>=0;n--)
                {
                    window.clear();
                    sprites[1].setColor(sf::Color(255, 255, 255, n));
                    sleep(milliseconds(n/15));
                    window.draw(sprites[0]);
                    window.draw(sprites[1]);
                    window.display();
                }
                wyswietlanie++;
            }


}

  void okno::rysuj_menu()
  {
       window.clear();

       if (wyswietlanie==1)
           for ( int n=0;n<=254;n++)
               {
                    window.clear();
                    sprites[2].setColor(sf::Color(255,255,255,n));
                    window.draw(sprites[0]);
                    window.draw(sprites[2]);
                    window.draw(sprites[3]);
                    window.draw(sprites[4]);
                    window.draw(sprites[5]);
                    window.display();
                    if (n==254)
                    wyswietlanie++;
                    window.clear();
                }

         window.draw(sprites[0]);
         window.draw(sprites[2]);
         window.draw(sprites[3]);
         window.draw(sprites[4]);
         window.draw(sprites[5]);
         window.display();
}
#包括“okno.h”
#包括
使用名称空间std;
int wyswietlanie=0;
okno::okno(渲染窗口和应用程序):窗口(应用程序)
{
纹理[0].loadFromFile(“grafika/tlo.png”);
纹理[1].loadFromFile(“grafika/logo.png”);
纹理[2].loadFromFile(“grafika/siatka.png”);
纹理[3].loadFromFile(“grafika/button_start.png”);
纹理[4].loadFromFile(“grafika/button_informacje.png”);
纹理[5].loadFromFile(“grafika/button_wyjscie.png”);
纹理[6].loadFromFile(“grafika/button_cofnij.png”);
loadFromFile(“czcionki/czcionka_1.ttf”);
对于(intj=0;jrysuj_intro();
此->rysuj_菜单();
}
void okno::start_gra()
{
}
void okno::单击_przyciski(事件和事件)
{
if(event.type==event::MouseButtonReleased&&event.mouseButton.button==Mouse::Left)
{
如果(单击精灵(精灵[3]))
启动_gra();
else if(单击精灵(精灵[5]))
window.close();
else if(单击精灵(精灵[4]))
wyswietl_信息(事件);
}
}
无效okno::wyswietl_信息(事件和事件)
{
{
而(1)
{
如果(sf::Mouse::isButtonPressed(sf::Mouse::Left)&&单击精灵(精灵[6])
{
event.type=event::JoystickButtonPressed;
event.mouseButton.button=鼠标::右键;
回来
}
window.clear();
window.draw(精灵[0]);
窗口绘制(精灵[2]);
窗口绘制(精灵[6]);
窗口绘制(tekst);
obsluga_przyciskow();
window.display();
}
}}
布尔奥克诺::点击精灵(精灵a)
{
//将鼠标位置从窗口坐标转换为世界坐标
sf::Vector2f mouse=window.mappixeltoords(sf::mouse::getPosition(window));
//检索精灵的边界框
sf::FloatRect bounds=a.getGlobalBounds();
//命中测试
if(bounds.contains(鼠标))
{
返回true;
}
返回false;
}
void okno::obluga_cofnij()
{
}
void okno::obsluga_przyciskow()
{
if(mysz_nad_精灵(精灵[3]))
精灵[3].setColor(sf::Color(100100));
其他的
精灵[3].setColor(sf::Color(255255));
if(mysz_nad_精灵(精灵[4]))
精灵[4].setColor(sf::Color(100100));
其他的
精灵[4].setColor(sf::Color(255255));
if(mysz_nad_精灵(精灵[5]))
精灵[5].setColor(sf::Color(100100));
其他的
精灵[5].setColor(sf::Color(255255));
if(mysz_nad_精灵(精灵[6]))
精灵[6].setColor(sf::Color(100100));
其他的
精灵[6].setColor(sf::Color(255255));
}
波尔·奥克诺:我的精灵(精灵a)
{
sf::Vector2f mouse=window.mappixeltoords(sf::mouse::getPosition(window));
if(a.getGlobalBounds().contains(鼠标))
返回true;
返回false;
}
void okno::rysuj_简介()
{
如果(wyswietlanie==0)
{
对于(int n=0;n=0;n--)
{
window.clear();
精灵[1].setColor(sf::Color(255,255,255,n));
睡眠(毫秒(n/15));
window.draw(精灵[0]);
窗口绘制(精灵[1]);
window.display();
}
wyswietlanie++;
}
}
void okno::rysuj_菜单()
{
window.clear();
如果(wyswietlanie==1)
对于(int n=0;nSFML事件处理
事件的处理方式应如下所示:

sf::Event event;

while (app.pollEvent(event))
{
    // handle each event you want
    switch (event.type) 
    {
    case sf::Event::Closed:
        closed(event);
        Exit();
        break;
    case sf::Event::KeyPressed:
        keyPressed(event);
        break;
    case sf::Event::KeyReleased:
        keyReleased(event);
        break;
    case sf::Event::MouseButtonPressed:
        mouseButtonPressed(event);
        break;
    case sf::Event::MouseButtonReleased:
        mouseButtonReleased(event);
        break;
    case sf::Event::MouseMoved:
        mouseMoved(event);
        break;
    /* ...many more events exist */
    default:
        cerr << "unhandle event of type: " << event.type << endl;
        break;

    }

}
正如@Hiura所提到的,您不能将事件类型分配给
sf::event
,然后在
pollEvent
方法中重用它,更准确地说,这里的问题更多的是
event.mouseButton.button=Mouse::Right;
部分。这部分是因为类存储了它的事件参数(、键等)这部分是因为这不是sf::Event类的预期用途

你的代码 请用英语编码,永远,你永远不知道什么时候你需要分享一段代码。我这么说不是因为我是一个以英语为中心的人,事实上,我是一个法裔加拿大人

现在,让我们具体看一下您提供的代码。

    // Process events
    Event event;

    // these are problematic, you shouldn't do that.
    //event.type=Event::JoystickButtonPressed;
    //event.mouseButton.button = Mouse::Right;

    while (app.pollEvent(event))
    {
        // using a switch or else if here would lower code repetition
        // and useless check.

        // Since both cases do the same thing, you could have just merge them.
        // Close window : exit
        if ((event.type == Event::Closed) 
           || (event.type == Event::KeyPressed 
               && event.key.code == Keyboard::Escape ))
        {
            app.close();
        }
        else if (event.type == Event::MouseButtonReleased 
                  && event.mouseButton.button == Mouse::Left)
        {
            // this should really go here
            aplikacja.click_button(event); // thanks Google Translation
        }

    }

    // Why? Why do you send the last event from your event loop to that?
    //aplikacja.click_przyciski(event);
这里有些不必要的调整只是为了好玩:

bool okno::click_sprite(Sprite sprite) // remember, meaningful names
{
    // transform the mouse position from window coordinates to world coordinates
    sf::Vector2f mouse = window.mapPixelToCoords(sf::Mouse::getPosition(window));

    // see how it's clearer and I just removed 7-8 LOC and the comments
    // are now unnecessary here. The if clause was redundant since the contains
    // method already returns a bool value.
    return sprite.getGlobalBounds().contains(mouse);
}

我不打算通读全部代码,但您已经接近使用SFML的应用程序了。有一些很好的教程,SFML源代码非常清楚,请参阅和,以了解有关如何使用SFML每个部分的更多信息。

您不应该执行
事件。type=event::JoystickButtonPressed;
事件的其他作业。这不是SFML使用事件的方式。请再次阅读教程,尤其是。