Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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++ 使用复制构造函数后未渲染SDL纹理_C++_Class_Rendering_Sdl_Copy Constructor - Fatal编程技术网

C++ 使用复制构造函数后未渲染SDL纹理

C++ 使用复制构造函数后未渲染SDL纹理,c++,class,rendering,sdl,copy-constructor,C++,Class,Rendering,Sdl,Copy Constructor,我正在用SDL制作一个基本程序来渲染图形。我有两个类处理渲染: 纹理类(加载和渲染SDL_纹理) 还有一个Button类(该类可以更容易地在与按钮状态相关联的不同纹理之间切换。每个对象在按钮中应该有3个纹理对象) 声明: //Class for buttons and chips class Button { public: //Initializes internal variables Button();

我正在用SDL制作一个基本程序来渲染图形。我有两个类处理渲染:

纹理类(加载和渲染SDL_纹理)

还有一个Button类(该类可以更容易地在与按钮状态相关联的不同纹理之间切换。每个对象在按钮中应该有3个纹理对象)

声明:

        //Class for buttons and chips
    class Button
    {
    public:
        //Initializes internal variables
        Button();

        //Handles mouse events
        void handleEvent(SDL_Event* e);

        //Render buttons
        void render();

        //Sets top left position
        void setPosition(int x, int y);

        //Gets image dimensions
        void setWidth(int w);
        void setHeight(int h);

        //Set button status
        void setButtonAction(buttonAction action);

        //Get button status
        buttonStatus getButtonStatus();

        //Perform button action !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!FIXME::HAVEN'T DEFINED!!!!!!!!!!!!!!!!!!!!!!!!!!!!1!!
        void activateButton(buttonAction action);

        void setTextures(LTexture out, LTexture over, LTexture down);


    private:
        //Top left position
        SDL_Point mPosition;

        //Currently used global image
        buttonStatus mButtonStatus;

        //What happens if button is pressed
        buttonAction mButtonAction;

        //Width and height
        int mWidth;
        int mHeight;

        //Textures
        LTexture mOut;
        LTexture mOver;
        LTexture mDown;

    };

Button::Button()
{
    mPosition.x = 0;
    mPosition.y = 0;

    mWidth = 0;
    mHeight = 0;

    mButtonStatus = MOUSE_OUT;

}

void Button::setPosition(int x, int y)
{
    mPosition.x = x;
    mPosition.y = y;
}

void Button::handleEvent(SDL_Event* e)
{
    bool mInside = true;

    //If mouse event happened
    if (e->type == SDL_MOUSEBUTTONDOWN || e->type == SDL_MOUSEMOTION)
    {
        //Get mouse position
        int x, y;
        SDL_GetMouseState(&x, &y);

        //Mouse is left of the button
        if (x < mPosition.x)
        {
            mInside = false;
        }
        //Mouse is right of button
        else if (x > mPosition.x + mWidth)
        {
            mInside = false;
        }
        //Mouse is above button
        else if (y < mPosition.y)
        {
            mInside = false;
        }
        //Mouse is below button
        else if (y > mPosition.y + mHeight)
        {
            mInside = false;
        }

        //Logic\\

        //Mouse is outside of button
        if (!mInside)
        {
            mButtonStatus = MOUSE_OUT;
        }
        //Mouse is inside of button
        else
        {
            switch (e->type)
            {
            case SDL_MOUSEMOTION:
                mButtonStatus = MOUSE_OVER;
                break;

            case SDL_MOUSEBUTTONDOWN:
                mButtonStatus = MOUSE_BUTTON_DOWN;
                break;
            }
        }
    }
}

void Button::render()
{
    switch (mButtonStatus)
    {
    case MOUSE_OUT:
        mOut.render(mPosition.x, mPosition.y);
        printf("Out rendered\n");
        break;

    case MOUSE_OVER:
        mOver.render(mPosition.x, mPosition.y);
        printf("Over rendered\n");
        break;

    case MOUSE_BUTTON_DOWN:
        mDown.render(mPosition.x, mPosition.y);
        printf("Down rendered\n");
        break;
    }
}


void Button::setWidth(int w)
{
    mWidth = w;
}

void Button::setHeight(int h)
{
    mHeight = h;
}

void Button::setButtonAction(buttonAction action)
{
    mButtonAction = action;
}

buttonStatus Button::getButtonStatus()
{
    return mButtonStatus;
}

void Button::setTextures(LTexture out, LTexture over, LTexture down)
{
    mOut = out;
    mOver = over;
    mDown = down;
}
//按钮和芯片类
类按钮
{
公众:
//初始化内部变量
按钮();
//处理鼠标事件
无效handleEvent(SDL_事件*e);
//渲染按钮
void render();
//设置左上角位置
无效设置位置(整数x,整数y);
//获取图像维度
空隙宽度(int w);
空隙高度(inth);
//设置按钮状态
无效设置按钮动作(按钮动作);
//获取按钮状态
buttonStatus getButtonStatus();
//执行按钮操作!!
无效激活按钮(按钮动作);
空洞设置(LTEXTRE out、LTEXTRE over、LTEXTRE down);
私人:
//左上角位置
SDL_点组合;
//当前使用的全局映像
按钮状态mButtonStatus;
//如果按下按钮会发生什么
按钮式按钮式按钮;
//宽度和高度
国际宽度;
整数mHeight;
//质地
土壤结构移动;
混合移动器;
LTexture mDown;
};
按钮::按钮()
{
mPosition.x=0;
mPosition.y=0;
mWidth=0;
mHeight=0;
mButtonStatus=鼠标离开;
}
无效按钮::设置位置(整数x,整数y)
{
mPosition.x=x;
mPosition.y=y;
}
无效按钮::handleEvent(SDL_事件*e)
{
bool mInside=true;
//如果鼠标事件发生
如果(e->type==SDL|U鼠标按钮下| e->type==SDL|U鼠标按钮下)
{
//获取鼠标位置
int x,y;
SDL_GetMouseState(x&y);
//鼠标在按钮的左边
if(xmPosition.x+mWidth)
{
mInside=false;
}
//鼠标在按钮上方
else if(ymPosition.y+mHeight)
{
mInside=false;
}
//逻辑\\
//鼠标在按钮外面
如果(!mInside)
{
mButtonStatus=鼠标离开;
}
//鼠标在按钮的内部
其他的
{
开关(e->类型)
{
案例SDL_:
mButtonStatus=鼠标悬停;
打破
外壳SDL_鼠标按钮向下:
mButtonStatus=鼠标按下按钮;
打破
}
}
}
}
void按钮::render()
{
开关(mButtonStatus)
{
大小写鼠标_OUT:
移动渲染(mPosition.x,mPosition.y);
printf(“输出渲染\n”);
打破
鼠标右键置于上方:
渲染器(mPosition.x,mPosition.y);
printf(“过度渲染”\n);
打破
大小写鼠标按钮按下:
mDown.render(mPosition.x,mPosition.y);
printf(“向下渲染\n”);
打破
}
}
无效按钮::设置宽度(整数w)
{
mWidth=w;
}
无效按钮::设置高度(inth)
{
mHeight=h;
}
void按钮::setButtonAction(按钮操作)
{
mbutonaction=动作;
}
buttonStatus Button::getButtonStatus()
{
返回mButtonStatus;
}
void按钮::setTextures(LTextureout、LTextureover、LTexturedown)
{
mOut=out;
移动=结束;
mDown=向下;
}

不幸的是,当我尝试使用复制构造函数将SDL_纹理值从原始纹理传递到buttons Private纹理时,它没有传递任何值,但仍然认为它不是“NULL”

这段代码有两个问题。 第一个是在
LTexture
copy构造函数中,只复制指向
SDL\u纹理的指针。这称为浅拷贝。然后,在
LTexture
的析构函数中,调用
free()
,删除
SDL\u纹理。这是不好的,因为这意味着
LTexture
的任何副本现在都有指向已删除纹理的指针,因此它们将不再工作。这里最好的两种解决方案是使用名为
shared_ptr
的c++11类来存储纹理,这将防止纹理被删除,或者实际复制纹理并指向新的纹理(深度副本)。对于测试,您可以尝试在
free()
中注释掉对
SDL\u DestroyTexture
的调用

此外,您忘记实现赋值运算符。目前,它的行为与复制构造函数类似(因为您所做的只是一个浅层复制),但是如果您将其设置为深度复制,那么您也必须实现它

        //Class for buttons and chips
    class Button
    {
    public:
        //Initializes internal variables
        Button();

        //Handles mouse events
        void handleEvent(SDL_Event* e);

        //Render buttons
        void render();

        //Sets top left position
        void setPosition(int x, int y);

        //Gets image dimensions
        void setWidth(int w);
        void setHeight(int h);

        //Set button status
        void setButtonAction(buttonAction action);

        //Get button status
        buttonStatus getButtonStatus();

        //Perform button action !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!FIXME::HAVEN'T DEFINED!!!!!!!!!!!!!!!!!!!!!!!!!!!!1!!
        void activateButton(buttonAction action);

        void setTextures(LTexture out, LTexture over, LTexture down);


    private:
        //Top left position
        SDL_Point mPosition;

        //Currently used global image
        buttonStatus mButtonStatus;

        //What happens if button is pressed
        buttonAction mButtonAction;

        //Width and height
        int mWidth;
        int mHeight;

        //Textures
        LTexture mOut;
        LTexture mOver;
        LTexture mDown;

    };

Button::Button()
{
    mPosition.x = 0;
    mPosition.y = 0;

    mWidth = 0;
    mHeight = 0;

    mButtonStatus = MOUSE_OUT;

}

void Button::setPosition(int x, int y)
{
    mPosition.x = x;
    mPosition.y = y;
}

void Button::handleEvent(SDL_Event* e)
{
    bool mInside = true;

    //If mouse event happened
    if (e->type == SDL_MOUSEBUTTONDOWN || e->type == SDL_MOUSEMOTION)
    {
        //Get mouse position
        int x, y;
        SDL_GetMouseState(&x, &y);

        //Mouse is left of the button
        if (x < mPosition.x)
        {
            mInside = false;
        }
        //Mouse is right of button
        else if (x > mPosition.x + mWidth)
        {
            mInside = false;
        }
        //Mouse is above button
        else if (y < mPosition.y)
        {
            mInside = false;
        }
        //Mouse is below button
        else if (y > mPosition.y + mHeight)
        {
            mInside = false;
        }

        //Logic\\

        //Mouse is outside of button
        if (!mInside)
        {
            mButtonStatus = MOUSE_OUT;
        }
        //Mouse is inside of button
        else
        {
            switch (e->type)
            {
            case SDL_MOUSEMOTION:
                mButtonStatus = MOUSE_OVER;
                break;

            case SDL_MOUSEBUTTONDOWN:
                mButtonStatus = MOUSE_BUTTON_DOWN;
                break;
            }
        }
    }
}

void Button::render()
{
    switch (mButtonStatus)
    {
    case MOUSE_OUT:
        mOut.render(mPosition.x, mPosition.y);
        printf("Out rendered\n");
        break;

    case MOUSE_OVER:
        mOver.render(mPosition.x, mPosition.y);
        printf("Over rendered\n");
        break;

    case MOUSE_BUTTON_DOWN:
        mDown.render(mPosition.x, mPosition.y);
        printf("Down rendered\n");
        break;
    }
}


void Button::setWidth(int w)
{
    mWidth = w;
}

void Button::setHeight(int h)
{
    mHeight = h;
}

void Button::setButtonAction(buttonAction action)
{
    mButtonAction = action;
}

buttonStatus Button::getButtonStatus()
{
    return mButtonStatus;
}

void Button::setTextures(LTexture out, LTexture over, LTexture down)
{
    mOut = out;
    mOver = over;
    mDown = down;
}