来自SDL_CreateTextureFromSurface()的“无效纹理”错误?

时间:2018-09-25 18:19:49

标签: c++ ubuntu sdl

运行程序时,我一直遇到此问题。我的图像无法加载,并显示错误:“无效的纹理”。该程序过去工作正常。我正在linux ubuntu中处理它,并更新了所有驱动程序。这是制作渲染器和加载图像的代码。

// init.h

//#pragma once

#ifndef INIT_H
#define INIT_H


static const int SCREEN_WIDTH = 480;
static const int SCREEN_HEIGHT = 480;

static SDL_Surface* currentSurface = NULL;
static SDL_Window* window = NULL;
static SDL_Surface* screenSurface = NULL;
static SDL_Renderer* renderer = NULL;
//static SDL_Surface *SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 0, SDL_ANYFORMAT);



bool init();
void close();

//void SetColor(int value);

#endif // INIT_H

// init.cpp

//#include "stdafx.h"

#include <stdio.h>
#include "tchar.h"
#include <SDL2/SDL.h>
#include <iostream>
#include <SDL2/SDL_image.h>
#include "main.h"
#include "init.h"
#include "load.h"
//#include <conio.h>
//#include <Windows.h>
#include <string>
#include <SDL2/SDL_ttf.h>
#include <cmath>



bool init()
{
    bool boot = 1;
    if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
    {
        //SetColor(4);
        printf("SDL failed to initialize \n");
        //SetColor(7);
        boot = 0;
    }
    else {
        printf("SDL initialized!\n");
        window = SDL_CreateWindow("Light Development Project", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
        if (window == NULL)
        {
            //SetColor(4);
            printf("SDL failed to create the window \n");
            //SetColor(7);
            boot = 0;
        }
        else {
            printf("Window created!\n");
            //screenSurface = SDL_GetWindowSurface(window);
            printf("Screen surface created!\n");
        }
        printf("Initializing SDL_image...\n");
        int imgFlags = IMG_INIT_PNG;
        if (!(IMG_Init(imgFlags) & imgFlags))
        {
            //SetColor(4);
            printf("Failed to initialize SDL_image\n");
            //SetColor(7);
            boot = 0;
        }
        else {
            printf("SDL_image initialized!\n");
        }

        printf("Initializing TTF...\n");

        if (TTF_Init() == -1)
        {
            //SetColor(4);
            printf("Failed to initialize TTF\n");
            //SetColor(7);
            boot = 0;
        }
        else {
            printf("TTF initialized!\n");
        }


        printf("Creating renderer...\n");
        renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
        if (renderer == NULL)
        {
            //SetColor(4);
            printf("Failed to create renderer. Error: %s\n", SDL_GetError());
            //SetColor(7);
            boot = 0;
        } else
        printf("Renderer created!\n");
        printf("Setting render draw color...\n");
        SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
        printf("Render draw color set!\n");
    }
    //printf("Done!\n");
    return boot;
}

void close()
{
    printf("\nShutting down...\nFreeing SDL surfaces...\nDetroying textures and renderers...\n");
    SDL_DestroyTexture(texture);
    texture = NULL;
    SDL_DestroyRenderer(renderer);
    renderer = NULL;
    printf("SDL surfaces, textures, and renderers freed from memory!\nDestroying SDL window...\n");
    SDL_DestroyWindow(window);
    //TTF_CloseFont(font);
    //font = NULL;

    window = NULL;
    printf("SDL window detroyed!\nQuitting SDL subsystems...\n");
    IMG_Quit();
    SDL_Quit();
    //TTF_Quit();
    printf("All SDL subsystems shutdown!\n");
}

/*void SetColor(int value) {
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), value);
    /*
    1: Blue
    2: Green
    3: Cyan
    4: Red
    5: Purple
    6: Yellow (Dark)
    7: Default white
    8: Gray/Grey
    9: Bright blue
    10: Brigth green
    11: Bright cyan
    12: Bright red
    13: Pink/Magenta
    14: Yellow
    15: Bright white

}
*/

// load.h

//#pragma once

#ifndef LOAD_H
#define LOAD_H




enum KeyPressSurfacese
{
    KEY_PRESS_SURFACE_DEFUALT,
    KEY_PRESS_SURFACE_UP,
    KEY_PRESS_SURFACE_DOWN,
    KEY_PRESS_SURFACE_LEFT,
    KEY_PRESS_SURFACE_RIGHT,
    KEY_PRESS_SURFACE_TOTAL
};

class cTexture {
public:
    cTexture();
    ~cTexture();

    bool loadFromFile(std::string path);

    void free();

    void render(int x, int y, SDL_Rect* clip = NULL, double angle = 0.0, SDL_Point* center = NULL, SDL_RendererFlip flip = SDL_FLIP_NONE);

    void loadFromRenderedText(std::string text, SDL_Color color);

    void setColor(Uint8 red, Uint8 green, Uint8 blue);

    void setBlendMode(SDL_BlendMode blending);

    void setAlpha(Uint8 alpha);

    int getWidth();

    int getHeight();

private:
    SDL_Texture * hTexture;
    int hWidth;
    int hHeight;
};

static cTexture keyPresses[KEY_PRESS_SURFACE_TOTAL];
static cTexture sprite;
static cTexture text;

static SDL_Texture* loadTexture(std::string path);
static SDL_Rect spriteClips[4];
//TTF_Font* font = NULL;
static SDL_Color textColor = { 0, 0, 0 };

void loadAssets();

#endif //LOAD_H

// load.cpp

//#include "stdafx.h"

#include <stdio.h>
#include "tchar.h"
#include <SDL2/SDL.h>
#include <iostream>
#include <SDL2/SDL_image.h>
#include "main.h"
#include "init.h"
#include "load.h"
//#include <conio.h>
//#include <Windows.h>
#include <string>
#include <SDL2/SDL_ttf.h>
#include <cmath>



cTexture::cTexture()
{
    //printf("Constructing texture wrapper class...\n");
    hTexture = NULL;
    hWidth = 0;
    hHeight = 0;
}
cTexture::~cTexture()
{
    //printf("Destroying texture wrapper class...\n");
    free();
 }



 void cTexture::free()
 {
    //if (hTexture != NULL)

        SDL_DestroyTexture(hTexture);
        hTexture = NULL;
        hWidth = 0;
        hHeight = 0;

 }

bool cTexture::loadFromFile(std::string path)
{
    free();
    SDL_Texture* newTexture = NULL;
    SDL_Surface* loadedSurface = IMG_Load(path.c_str());
    newTexture = SDL_CreateTextureFromSurface(renderer, loadedSurface);
    if(newTexture == NULL)
    //printf("fail. error: %s\n", SDL_GetError());
    hWidth = loadedSurface->w;
    hHeight = loadedSurface->h;
    SDL_FreeSurface(loadedSurface);
    hTexture = newTexture;

    return hTexture != NULL;
}

void cTexture::render(int x, int y, SDL_Rect * clip, double angle, SDL_Point * center, SDL_RendererFlip flip)
{
    //SDL_Rect renderQuad = { x, y, hWidth, hHeight };
    SDL_Rect renderQuad = { x, y, 480, 480 };

    if (clip != NULL)
    {
        renderQuad.w = clip->w;
        renderQuad.h = clip->h;
    }

    SDL_RenderCopyEx(renderer, hTexture, clip, &renderQuad, angle, center, flip);
}

/*
void cTexture::loadFromRenderedText(std::string text, SDL_Color color)
{
    free();

    SDL_Surface* textSurface = TTF_RenderText_Solid(font, text.c_str(), textColor);
    hTexture = SDL_CreateTextureFromSurface(renderer, textSurface);
    hWidth = textSurface->w;
    hHeight = textSurface->h;
    SDL_FreeSurface(textSurface);
}
*/

void cTexture::setColor(Uint8 red, Uint8 green, Uint8 blue)
{
    SDL_SetTextureColorMod(hTexture, red, green, blue);
}

void cTexture::setBlendMode(SDL_BlendMode blending)
{
    SDL_SetTextureBlendMode(hTexture, blending);
}

void cTexture::setAlpha(Uint8 alpha)
{
    SDL_SetTextureAlphaMod(hTexture, alpha);
}

int cTexture::getWidth() { return hWidth; }
int cTexture::getHeight() { return hHeight; }



void loadAssets()
{

    printf("Loading image assets in loadAssets()...\n");

    if (!keyPresses[KEY_PRESS_SURFACE_DEFUALT].loadFromFile("carrot.png"))
    {
        //SetColor(4);
        printf("Failed to load image. Error: %s\n", SDL_GetError());
        //SetColor(7);
    } else
    printf("Image loaded\n");


    if(!keyPresses[KEY_PRESS_SURFACE_UP].loadFromFile("smIamLU.jpg"))
    {
        //SetColor(4);
        printf("Failed to load image\n");
        //SetColor(7);

    }
    else {
        //keyPresses[KEY_PRESS_SURFACE_UP].setBlendMode(SDL_BLENDMODE_BLEND);
        printf("Image loaded\n");

    }

    if(!keyPresses[KEY_PRESS_SURFACE_DOWN].loadFromFile("down.bmp"))
    {
        //SetColor(4);
        printf("Failed to load image\n");
        //SetColor(7);

    } else
    printf("Image loaded\n");


    if(!keyPresses[KEY_PRESS_SURFACE_LEFT].loadFromFile("left.bmp"))
    {
        //SetColor(4);
        printf("Failed to load image\n");
        //SetColor(7);

    }else
    printf("Image loaded\n");


    if(!keyPresses[KEY_PRESS_SURFACE_RIGHT].loadFromFile("right.bmp"))
    {
        //SetColor(4);
        printf("Failed to load image\n");
        //SetColor(7);

    }else
    printf("Image loaded\n");


    if (!sprite.loadFromFile("foo.png"))
    {
        //SetColor(4);
        printf("Failed to load image\n");
        //SetColor(7);
    }else
    printf("Image loaded\n");


    spriteClips[0].x = 0;
    spriteClips[0].y = 0;
    spriteClips[0].w = 64;
    spriteClips[0].h = 205;

    spriteClips[1].x = 64;
    spriteClips[1].y = 0;
    spriteClips[1].w = 64;
    spriteClips[1].h = 205;

    spriteClips[2].x = 128;
    spriteClips[2].y = 0;
    spriteClips[2].w = 64;
    spriteClips[2].h = 205;

    spriteClips[3].x = 192;
    spriteClips[3].y = 0;
    spriteClips[3].w = 64;
    spriteClips[3].h = 205;


    //font = TTF_OpenFont("Ubuntu-L.ttf", 28);
    //text.loadFromRenderedText("text", textColor);


    printf("Done!\n");

}

使用渲染器,我尝试使用不同的标志(例如SDL_RENDERER_ACCELERATED或SDL_RENDERER_SOFTWARE)将其制成,但均无效。该错误专门来自load.cpp文件

newTexture = SDL_CreateTextureFromSurface(renderer, loadedSurface);

这是失败的行。 SDL生成的错误显示为“无效纹理”。渲染器已正确声明,但无法正常工作。

我很困惑为什么它不能正常工作,因为它曾经可以正常工作。我放弃了该项目几个月,当我停下来又回来时它正在运行,现在却不起作用。更不用说我还有很多其他问题已经解决,但是我没有。

1 个答案:

答案 0 :(得分:0)

我知道了,这是我做过的最奇怪的修复。我在加载功能中为渲染器添加了一个错误检查,它再次开始工作。如果我删除错误检查if语句,它将返回至无法正常工作。似乎是一个奇怪的错误,但我很高兴它再次起作用。