C++ 和 SDL 纹理不会加载,但 SDL_GetError() 不会返回任何内容

标签 c++ 2d textures sdl

当我发现一些非常奇怪的东西时,我正在玩 SDL2。我正在尝试绘制优化的纹理,但它不起作用。将表面变成纹理的代码不起作用。根据文档, SDL_GetError() 应该给我错误,但它不返回任何东西......任何帮助将不胜感激!这是代码:

主要.cpp:

#include "SDLHelper.h"
#include "Player.h"

#define WIDTH 640
#define HEIGHT 480
#define NAME "TILES BOI!"

int main(int args, char* argv[]){
    SDL_Window* gWindow;
    SDL_Renderer* gRenderer;
    if(!init(NAME, WIDTH, HEIGHT, &gWindow, &gRenderer)){
        printf("Failed to initialize!\n");
    }else{
            bool quit = false;
            SDL_Event e;
            Player* player = new Player(100, 100, 0, 0);
            player->texture = loadTexture("sprites/people/male_walkcycle.png", &gRenderer);
        while(!quit){
            while(SDL_PollEvent(&e) != 0){
                if(e.type == SDL_QUIT){
                        quit = true;
                }
            }

            SDL_RenderClear(gRenderer);

            SDL_RenderCopy(gRenderer, player->texture, &(player->currentTexturePos), &(player->position));

            SDL_RenderPresent(gRenderer);
        }
        close(&gWindow, &gRenderer);
    }

    return 0;
}

SDLHelper.h:

 #ifndef SDLHELPER_H
  #define SDLHELPER_H

  #include <SDL2/SDL.h>
  #include <SDL2/SDL_image.h>
  #include <stdio.h>

  bool init(const char* name, int width, int height, SDL_Window** window, SDL_Renderer** renderer);
  SDL_Texture* loadTexture(const char* path, SDL_Renderer** renderer);
    void close(SDL_Window** gWindow, SDL_Renderer** gRenderer);

    #endif

SDLHelper.cpp:

#include "SDLHelper.h"

bool init(const char* name, int width, int height, SDL_Window** window, SDL_Renderer** renderer){
    bool success = true;
    if(SDL_Init(SDL_INIT_EVERYTHING) < 0){
        printf("SDL could not initialize! SDL Error: %s\n", SDL_GetError());
        success = false;
    }else{
        if(!SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1")){
            printf("Warning: Linear texture filtering is not enabled!\n");
        }

        *window = SDL_CreateWindow(name, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_SHOWN);
        if(*window == NULL){
            printf("Window could not be created! SDL Error: %s\n", SDL_GetError());
            success = false;
        }else{
            *renderer = SDL_CreateRenderer(*window, -1, SDL_RENDERER_ACCELERATED);
            if(*renderer == NULL){
                printf("Renderer could not be created! SDL Error: %s\n", SDL_GetError());
                success = false;
            }else{
                SDL_SetRenderDrawColor(*renderer, 0xFF, 0xFF, 0xFF, 0xFF);
                int imgFlags = IMG_INIT_PNG;
                if(!(IMG_Init(imgFlags) & imgFlags)){
                    printf("SDL_Image could not initialize! SDL_Image Error: %s\n",IMG_GetError());
                    success = false;
                }
            }
        }
    }
    return success;
}

SDL_Texture* loadTexture(const char* path, SDL_Renderer** renderer){
    SDL_Texture* newTexture = NULL;
    SDL_Surface* loaded = IMG_Load(path);
    if(loaded == NULL){
        printf("Unable to load image %s! SDL_Image Error: %s\n", path, IMG_GetError());
    }else{
        newTexture == SDL_CreateTextureFromSurface(*renderer, loaded);
        if(newTexture == NULL){
            printf("Unable to create texture from %s! SDL Error: %s\n", path, SDL_GetError());
        }
        SDL_FreeSurface(loaded);
    }

    return newTexture;
}

void close(SDL_Window** gWindow, SDL_Renderer** gRenderer){
    SDL_DestroyRenderer(*gRenderer);
    SDL_DestroyWindow(*gWindow);
    *gWindow = NULL;
    *gRenderer = NULL;

    //Quit SDL subsystems
    IMG_Quit();
    SDL_Quit();
}

播放器.h:

#ifndef PLAYER_H
#define PLAYER_H

#include <SDL2/SDL.h>

class Player
{
public:
    Player(int h, int m, int x, int y);
    ~Player();
    SDL_Texture* texture;
    SDL_Rect position;
    SDL_Rect currentTexturePos;
    int health;
    int mana;
    const char* name = "Bobby";
};
#endif

播放器.cpp:

#include "Player.h"

Player::Player(int h, int m, int x, int y){
    health = h;
    mana = m;
    position.x = x;
    position.y = y;
    position.h = 64;
    position.w = 64;
    currentTexturePos.x = 64;
    currentTexturePos.y = 0;
    currentTexturePos.h = 64;
    currentTexturePos.w = 64;
}

Player::~Player(){
    SDL_DestroyTexture(texture);
    texture = NULL;
}

生成文件:

CC = g++
FLAGS = -w -lSDL2 -lSDL2_image
OBJECTS = main.cpp SDLHelper.cpp Player.cpp
NAME = tileBasedRPG

all: $(OBJECTS)
    $(CC) $(OBJECTS) $(FLAGS) -o $(NAME)

clean:
    rm -rf *.o

最佳答案

您从未分配过 newTexture:

newTexture == SDL_CreateTextureFromSurface(*renderer, loaded);

当它应该是

newTexture = SDL_CreateTextureFromSurface(*renderer, loaded);

关于C++ 和 SDL 纹理不会加载,但 SDL_GetError() 不会返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38506844/

相关文章:

c++ - 颜色和纹理如何协同工作?

ios - iPhone OpenGL ES 2.0 - 像素完美纹理

c# - 在 C# 中生成图像上的纹理

c++ - "Was not declared in this scope"结构定义错误。 C++

c++ - 将 char 添加到 String 并删除 char 数组

c - 段错误 C(1d 数组到 2d 数组并返回)

matlab - 在 matlab 中具有不同误差条的多维(2d 更好 3d)散点图

c++ - 链接 : fatal error LNK1104: cannot open file 'libcpmt.lib' after manually configuring the LIB environmental variable

c++ - 快速排序实现

java - 仅搜索并更改二维数组中的 1 个数字