简体   繁体   English

无法在 C++ SDL 中打开图像

[英]Unable to open Image in C++ SDL

So im trying to render an image.所以我试图渲染图像。 This code worked fine before I refactored into seperate classes but i cannot see the problem.在我重构为单独的类之前,此代码运行良好,但我看不到问题。 The file path for the image also worked before the refactoring however i have not moved the image so it should still be in the same place.图像的文件路径在重构之前也有效,但是我没有移动图像,所以它应该仍然在同一个地方。

The error i am getting is "Unable to create texture from surface. Error: Couldn't open Images/text.bmp" so im fairly certain its the line of code below that is messing up.我得到的错误是“无法从表面创建纹理。错误:无法打开图像/text.bmp”所以我相当确定它下面的代码行搞砸了。

if (!(gTexture->LoadFromFile("Images/text.bmp")))
        {
            return false;
        }

Here is the LoadFromFile function code这是 LoadFromFile 函数代码

bool Texture2D::LoadFromFile(string path)
{

    Free();

    SDL_Texture* pTexture = NULL;

    SDL_Surface* pSurface = IMG_Load(path.c_str());

    if (pSurface != NULL)
    {
        //SDL_SetColorKey(pSurface, SDL_TRUE, SDL_MapRGB(pSurface->format, 0, 0xFF, 0xFF));

        pTexture = SDL_CreateTextureFromSurface(mRenderer, pSurface);
        if (pTexture == NULL)
        {
            cout << "Unable to create texture from surface. Error: " << SDL_GetError() << endl;
        }

        mWidth = pSurface->w;
        mHeight = pSurface->h;

        SDL_FreeSurface(pSurface);
    }
    else
    {
        cout << "Unable to create texture from surface. Error: " << IMG_GetError() << endl;
    }

    mTexture = pTexture;

    return pTexture != NULL;
}

Below is the Source.cpp file:下面是 Source.cpp 文件:

#include <SDL.h>
#include <SDL_image.h>
#include <SDL_mixer.h>
#include "Constants.h"
#include "Texture2D.h"
#include "Commons.h"
#include <iostream>
#include <string>

using namespace std;

//Globals
    SDL_Window* gWindow     = NULL;
    SDL_Renderer* gRenderer = NULL;
    Texture2D* gTexture = NULL;

    //prototypes
    bool            InitSDL();
    void            CloseSDL();
    bool            Update();
    void            Render();

int main(int argc, char* args[])
{
    if(InitSDL())
    {
        bool quit = false;

        while(!quit)
        {
            //gTexture->Render(Vector2D(), SDL_FLIP_NONE, 0);
            Render();
            quit = Update();
        }
    }

    CloseSDL();
    return 0;
}

bool InitSDL()
{
    if(SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        cout << "SDL did not initialise. Error: " << SDL_GetError();
        return false;
    }
    else
    {
        //ITS ALL GOOD BRO
        gWindow = SDL_CreateWindow("Games Engine Creation",
                                    SDL_WINDOWPOS_UNDEFINED,
                                    SDL_WINDOWPOS_UNDEFINED,
                                    SCREEN_WIDTH,
                                    SCREEN_HEIGHT,
                                    SDL_WINDOW_SHOWN);
        //DID IT GO?
        if (gWindow == NULL)
        {
            //NUH UH
            cout << "Window was not created. Error: " << SDL_GetError();
            return false;
        }

        gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED);

        if (gRenderer != NULL)
        {
            //INITIALISE THAT PNG BBY
            int imageFlags = IMG_INIT_PNG;
            if (!(IMG_Init(imageFlags) & imageFlags))
            {
                cout << "SDL_Image could not initialise. Error: " << IMG_GetError();
                return false;
            }

        }
        else
        {
            cout << "Renderer could not be initialised. Error: " << SDL_GetError();
            return false;
        }


        gTexture = new Texture2D(gRenderer);

        if (!(gTexture->LoadFromFile("Images/text.bmp")))
        {
            return false;
        }


        return true;
    }
}


void CloseSDL()
{
    SDL_DestroyWindow(gWindow);
    gWindow = NULL;

    delete gTexture;
    gTexture = NULL;

    SDL_DestroyRenderer(gRenderer);
    gRenderer = NULL;

    IMG_Quit();
    SDL_Quit();
}

bool Update()
{
    SDL_Event e;
    SDL_PollEvent(&e);

    switch(e.type)
    {
        case SDL_QUIT:
            return true;
        break;
        case SDL_KEYUP:
            switch(e.key.keysym.sym)
            {
                case SDLK_q:
                    return true;
                break;
            }
        break;
        case SDL_MOUSEBUTTONDOWN:
                    return true;
        break;
    }

    return false;
}

void Render()
{
    SDL_SetRenderDrawColor(gRenderer, 0xFF, 0xFF, 0xFF, 0xFF);
    SDL_RenderClear(gRenderer);

    gTexture->Render(Vector2D(), SDL_FLIP_NONE, 0);

    //SDL_Rect renderLocation = { 0, 0, mWidth, mHeight };

    //SDL_RenderCopyEx(mRenderer, mTexture, NULL, &renderLocation, 0, NULL, SDL_FLIP_NONE);

    SDL_RenderPresent(gRenderer);
}

开始调试的一种简单方法是将图像与可执行文件放在同一文件夹中,并将路径显示为./image.bmp以查看路径是否有问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM