Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.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++ C++;/SFML错误C2248非可复制运算符_C++_Sfml - Fatal编程技术网

C++ C++;/SFML错误C2248非可复制运算符

C++ C++;/SFML错误C2248非可复制运算符,c++,sfml,C++,Sfml,我是一个初学者,我尝试使用SFML库,但我的代码有问题 #pragma region include #include <SFML/Graphics.hpp> #include <iostream> #include <string> #include <cstdlib> #pragma endregion include sf::RenderWindow fenetre(sf::RenderWindow*); sf::RectangleSha

我是一个初学者,我尝试使用SFML库,但我的代码有问题

#pragma region include
#include <SFML/Graphics.hpp>
#include <iostream>
#include <string>
#include <cstdlib>
#pragma endregion include


sf::RenderWindow fenetre(sf::RenderWindow*);
sf::RectangleShape rectDraw(sf::RectangleShape*);
sf::CircleShape cercleDraw(sf::CircleShape*);
void CentreCercle(sf::CircleShape *cercle, int*, int*);
void fermetureFenetre();

void main()
{
#pragma region variables
sf::RenderWindow window; 
fenetre(&window);

sf::RectangleShape rect; 
rectDraw(&rect);;

sf::CircleShape cercle; 
cercleDraw(&cercle);

int xCentreCercle;
int yCentreCercle;
CentreCercle(&cercle, &xCentreCercle, &yCentreCercle);

float speed = 1;

sf::Vector2i positionSouris;
#pragma endregion variables

while(window.isOpen())
{
#pragma region fenOpen
    sf::Event event;        
    while(window.pollEvent(event))
    {
        if(event.type == sf::Event::Closed)
            window.close();
    }
#pragma endregion fenOpen

#pragma region KeyboardRectangle
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
    rect.move(0, -speed);
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
    rect.move(0, speed);
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
    rect.move(-speed, 0);
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))   
    rect.move(speed, 0);
#pragma endregion KeyboardRectangle

#pragma region KeyboardCercle
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Z))
    cercle.move(0, -speed);
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::S))
    cercle.move(0, speed);
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Q))
    cercle.move(-speed, 0);
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
    cercle.move(speed, 0);
#pragma endregion KeyboardCercle

#pragma region MouseCercle
    if(sf::Mouse::isButtonPressed(sf::Mouse::Left))
    {
        bool boucle = true;
        sf::Vector2f position = cercle.getPosition();
        xCentreCercle = cercle.getPosition().x + cercle.getRadius();
        yCentreCercle = cercle.getPosition().y+ cercle.getRadius();

        float rayon = cercle.getRadius();

        positionSouris = sf::Mouse::getPosition(window);
        int xSouris = positionSouris.x;
        int ySouris = positionSouris.y;

        float resultat = (xCentreCercle-xSouris)*(xCentreCercle-xSouris)+(yCentreCercle-ySouris)*(yCentreCercle-ySouris);



        if(sqrt(resultat)<= rayon)
        {
            int diffX;
            int diffY;      

            diffX = xSouris-cercle.getPosition().x;
            diffY = ySouris-cercle.getPosition().y;

            while(boucle == true)
            {
                positionSouris = sf::Mouse::getPosition(window);
                xSouris = positionSouris.x;
                ySouris = positionSouris.y;


                cercle.setPosition(xSouris - diffX, ySouris - diffY);

                window.draw(rect);
                window.draw(cercle);
                window.display();
                window.clear();

                if (sf::Mouse::isButtonPressed(sf::Mouse::Left) == false)
                    boucle = false;
            }
        }
    }
    if(sf::Mouse::isButtonPressed(sf::Mouse::Right) && sf::Keyboard::isKeyPressed(sf::Keyboard::C))
    {
        positionSouris = sf::Mouse::getPosition(window);
        int xSouris = positionSouris.x;
        int ySouris = positionSouris.y;
        cercle.setPosition(xSouris, ySouris);
    }
    #pragma endregion MouseCercle

#pragma region Mouserectangle
if(sf::Mouse::isButtonPressed(sf::Mouse::Left))
{
    bool boucle = true;
    sf::Vector2f position = rect.getPosition();
    sf::Vector2f taille = rect.getSize();

    int xMax = position.x + taille.x;
    int xMin = position.x;
    int yMax = position.y + taille.y;
    int yMin = position.y;

    positionSouris = sf::Mouse::getPosition(window);
    int xSouris = positionSouris.x;
    int ySouris = positionSouris.y;

    if(xSouris > xMin && xSouris < xMax && ySouris > yMin && ySouris < yMax)
    {
        int diffX;
        int diffY;

        diffX = xSouris-xMin;
        diffY = ySouris-yMin;

        while(boucle == true)
        {
            positionSouris = sf::Mouse::getPosition(window);
            xSouris = positionSouris.x;
            ySouris = positionSouris.y;

            rect.setPosition(xSouris - diffX, ySouris - diffY);
            window.draw(rect);
            window.draw(cercle);
            window.display();
            window.clear();

            if (sf::Mouse::isButtonPressed(sf::Mouse::Left) == false)
                boucle = false;
        }
    }
}
if(sf::Mouse::isButtonPressed(sf::Mouse::Right)&& sf::Keyboard::isKeyPressed(sf::Keyboard::R))
{
    positionSouris = sf::Mouse::getPosition(window);
    int xSouris = positionSouris.x;
    int ySouris = positionSouris.y;
    rect.setPosition(xSouris, ySouris);
}
#pragma endregion MouseRectangle

    window.draw(rect);
    window.draw(cercle);
    window.display();
    window.clear();
}
}

void fenetre(sf::RenderWindow &window)
{
window.create(sf::VideoMode(800,600),"Tuto SFML");
window.setPosition(sf::Vector2i(50,50));
window.setFramerateLimit(60);
}

void fermetureFenetre(sf::RenderWindow &window)
{
    sf::Event event;        
    while(window.pollEvent(event))
    {
        if(event.type == sf::Event::Closed)
            window.close();
    }
}

void rectDraw(sf::RectangleShape &rect)
{
rect.setSize(sf::Vector2f(200, 100));
rect.setPosition(10, 10);
rect.setFillColor(sf::Color(250, 100, 150));

}

void cercleDraw(sf::CircleShape &cercle)
{
cercle.setFillColor(sf::Color(100,250,50));
cercle.setRadius(50);
cercle.setPosition(0, 0);
}

void CentreCercle(sf::CircleShape &cercle, int &xCentreCercle, int 
&yCentreCercle)
{
xCentreCercle = cercle.getPosition().x + cercle.getRadius();
yCentreCercle = cercle.getPosition().y+ cercle.getRadius();
}
#布拉格区域包括
#包括
#包括
#包括
#包括
#pragma端区包括
sf::RenderWindow fenetre(sf::RenderWindow*);
sf::RectangleShape rectDraw(sf::RectangleShape*);
sf::CircleShape cercleDraw(sf::CircleShape*);
空心中心圆(sf::圆形*圆形,整数*,整数*);
void fermetureFenetre();
void main()
{
#pragma区域变量
sf::RenderWindow窗口;
费内特(窗户);
sf::矩形形状矩形;
rectDraw(&rect);;
sf::圆形细胞;
cercleDraw(&cercle);
int Xcentercle;
内中心圆;
中心圆(&cercle,&XCENTERCERCLE,&Y中心圆);
浮动速度=1;
sf::Vector2i位置souris;
#pragma端域变量
while(window.isOpen())
{
#布拉格马地区分诺普酒店
sf::事件;
while(window.pollEvent(事件))
{
如果(event.type==sf::event::Closed)
window.close();
}
#布拉格端区开放
#pragma区域键盘矩形
如果(sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
直线移动(0,-速度);
如果(按下sf::键盘::isKeyPressed(按下sf::键盘::Down))则为else
直线移动(0,速度);
如果(sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
直线移动(-speed,0);
如果(sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
直线移动(速度,0);
#pragma endregion键盘矩形
#布拉格区域键盘
如果(sf::Keyboard::isKeyPressed(sf::Keyboard::Z))
移动(0,-速度);
如果(sf::Keyboard::isKeyPressed(sf::Keyboard::S))
移动(0,速度);
else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Q))
cercle.move(-speed,0);
如果(sf::Keyboard::isKeyPressed(sf::Keyboard::D))则为else
移动(速度,0);
#布拉格端区键盘
#布拉格区域鼠标圆
if(sf::Mouse::isButtonPressed(sf::Mouse::Left))
{
bool-boucle=true;
sf::Vector2f position=cercle.getPosition();
xcentercle=cercle.getPosition().x+cercle.getRadius();
y中心圆=cercle.getPosition().y+cercle.getRadius();
float人造丝=cercle.getRadius();
positionSouris=sf::鼠标::获取位置(窗口);
int xSouris=positionSouris.x;
int ySouris=位置SOURIS.y;
浮点结果=(Xcentercle xSouris)*(Xcentercle xSouris)+(Ycentrecelle ySouris)*(Ycentrecelle ySouris);
if(sqrt(resultat)xMin&&xSourisyMin&&ySouris
这个程序只用于用键盘或鼠标移动矩形或圆形。 当所有的程序都在主函数中时,我没有任何问题,但我希望在将来进行培训时使用子程序和类,但我有以下错误

在搜索之后,我认为问题来自函数'sf::RenderWindow',但是初学者我不明白如何解决这个问题


谢谢你的帮助!:)

问题在于@Jepessen提到,声明中的返回类型基本上是sf::RenderWindow,参数的类型是Pointer sf::RenderWindow:

sf::RenderWindow fenetre(sf::RenderWindow*);
void fenetre(sf::RenderWindow &window)
{
   // Code
}
// Declaration, on top of your program
    void fenetre(sf::RenderWindow&);
// Definition, at the bottom
    void fenetre(sf::RenderWindow &window)
    {
       // Code
    }
然后定义函数时,返回void,参数为引用sf::RenderWindow:

sf::RenderWindow fenetre(sf::RenderWindow*);
void fenetre(sf::RenderWindow &window)
{
   // Code
}
// Declaration, on top of your program
    void fenetre(sf::RenderWindow&);
// Definition, at the bottom
    void fenetre(sf::RenderWindow &window)
    {
       // Code
    }
要解决此问题,请将fenetre void声明的返回类型设置为void,因为实际上根本没有返回值,并将参数引用为sf::RenderWindow:

sf::RenderWindow fenetre(sf::RenderWindow*);
void fenetre(sf::RenderWindow &window)
{
   // Code
}
// Declaration, on top of your program
    void fenetre(sf::RenderWindow&);
// Definition, at the bottom
    void fenetre(sf::RenderWindow &window)
    {
       // Code
    }

问题在于@Jepessen提到,声明中的返回类型基本上是sf::RenderWindow,参数的类型是Pointer sf::RenderWindow:

sf::RenderWindow fenetre(sf::RenderWindow*);
void fenetre(sf::RenderWindow &window)
{
   // Code
}
// Declaration, on top of your program
    void fenetre(sf::RenderWindow&);
// Definition, at the bottom
    void fenetre(sf::RenderWindow &window)
    {
       // Code
    }
然后定义函数时,返回void,参数为引用sf::RenderWindow:

sf::RenderWindow fenetre(sf::RenderWindow*);
void fenetre(sf::RenderWindow &window)
{
   // Code
}
// Declaration, on top of your program
    void fenetre(sf::RenderWindow&);
// Definition, at the bottom
    void fenetre(sf::RenderWindow &window)
    {
       // Code
    }
要解决此问题,请将fenetre void声明的返回类型设置为void,因为实际上根本没有返回值,并将参数引用为sf::RenderWindow:

sf::RenderWindow fenetre(sf::RenderWindow*);
void fenetre(sf::RenderWindow &window)
{
   // Code
}
// Declaration, on top of your program
    void fenetre(sf::RenderWindow&);
// Definition, at the bottom
    void fenetre(sf::RenderWindow &window)
    {
       // Code
    }

fenetre
在定义和声明时具有不同的签名。我建议你在使用函数定义之前先把它放进去,如果你不想把它们放在不同的文件中的话,它就不那么容易出错(如果你想发布函数定义,这是正确的)