首页 > 解决方案 > 无法使用 SDL2 显示纹理

问题描述

我试图用 SDL2 显示纹理。

16x20

这是我的代码:

主文件

#include <iostream>

#include <SDL.h>
#include <SDL_image.h>

#include "Texture.h"

SDL_Window* window;
SDL_Renderer* renderer;
SDL_Event e;

Texture texture(renderer, "assets/player.png", 16, 20); // this the texture is defined
SDL_Texture* t;
bool running = true;

void update();
void draw();

int main(int argc, char* argv[]) {
    SDL_Init(SDL_INIT_VIDEO);
    window = SDL_CreateWindow("My Game", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 1280, 720, SDL_WINDOW_SHOWN);
    renderer = SDL_CreateRenderer(window, -1, 0);

    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);

    while (running) {
        update();
        draw();
    }

    SDL_DestroyWindow(window);
    SDL_DestroyRenderer(renderer);
    SDL_Quit();

    return 0;
}

void update() {
    while (SDL_PollEvent(&e) != 0) {
        if (e.type == SDL_QUIT) {
            running = false;
        }
    }
}

void draw() {
    SDL_RenderClear(renderer);
    texture.show(renderer);
    SDL_RenderPresent(renderer);
}

纹理.cpp

#include "Texture.h"

#include <iostream>
#include <SDL.h>
#include <SDL_image.h>
#include <string>

Texture::Texture(SDL_Renderer*& renderer, std::string path, int w, int h) {
    IMG_Init(IMG_INIT_PNG);

    SDL_Surface* temp_surface = IMG_Load(path.c_str());
    texture = SDL_CreateTextureFromSurface(renderer, temp_surface);
    SDL_FreeSurface(temp_surface);
    d_rect.w = w;
    d_rect.h = h;
}

void Texture::show(SDL_Renderer*& renderer) {
    SDL_RenderCopy(renderer, texture, NULL, &d_rect);
}

纹理.h

#pragma once

#include <SDL.h>
#include <SDL_image.h>
#include <string>

class Texture {
    public:
        Texture(SDL_Renderer*& renderer, std::string path, int w, int h);
        void show(SDL_Renderer*& renderer);

        SDL_Texture* texture;
        SDL_Rect d_rect;
        SDL_Renderer* renderer;
};

这是我的文件结构:\

src/\
...main.cpp\
...Texture.cpp\
...Texture.h\
assets/\
...player.png

我对 C++ 很陌生,我一直在关注一些教程,所以我真的不知道发生了什么我一直在关注https://lazyfoo.net/tutorials/SDL SDL 教程,但这是我得到的部分坚持

标签: c++sdlsdl-2

解决方案


您的调用Texture::Texture发生在程序启动时,在main. 因此,该代码看到一个空指针renderer。这很可能会让你的电话SDL_CreateTextureFromSurface失败。

在创建之后将texture对象的初始化移到内部:mainrenderer

// at top-level:
Texture *texture;

int main () {
    // ...
    renderer = SDL_CreateRenderer(window, -1, 0);
    texture = new Texture(renderer, "assets/player.png", 16, 20);
    // ...
}

推荐阅读