c++ - 无法使用 SDL2 显示纹理
问题描述
我试图用 SDL2 显示纹理。
这是我的代码:
主文件
#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 教程,但这是我得到的部分坚持
解决方案
您的调用Texture::Texture
发生在程序启动时,在main
. 因此,该代码看到一个空指针renderer
。这很可能会让你的电话SDL_CreateTextureFromSurface
失败。
在创建之后将texture
对象的初始化移到内部:main
renderer
// at top-level:
Texture *texture;
int main () {
// ...
renderer = SDL_CreateRenderer(window, -1, 0);
texture = new Texture(renderer, "assets/player.png", 16, 20);
// ...
}
推荐阅读
- asp.net - 将用户数据保存到 DB Visual Studio
- android - 计算距离点的纬度/经度 X 英里?
- java - 无法在两个方法中传递 try catch 块返回值
- c++ - 如何在 C++ 中创建特定大小的消息以通过 UDP 套接字发送?
- java - 运行代码时的 java.lang.ThreadDeath 错误消息
- react-native - 仅当我移动手指时才允许 Panresponder 反应原生
- android - 如何务实地为应用程序创建一个叠加层作为Android中的水印?
- java - 如何关闭两个标签并打开具有不同网址的新标签
- java - 如何在删除时使用 mockito 制作 JUnit
- python - `plotly.subplots.make_subplots`中`specs`的意外行为