【问题标题】:cannot load multiple textures in SDL 2.0无法在 SDL 2.0 中加载多个纹理
【发布时间】:2014-03-10 18:37:09
【问题描述】:

我试图在我的 SDL 应用程序中加载多个纹理图像,但我无法在屏幕上加载或渲染第二个图像。我所看到的只是我的grass.bmp 正在显示。无法加载 Bob.bmp。我不知道错误可能出在哪里,因为我已经正确实施了所有内容

我的头文件

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

#ifndef GAMEWINDOW_H
#define GAMEWINDOW_H

class GameWindow{
private:
    bool _running;
    SDL_Window* _screen;
    SDL_Renderer* _renderer;
    SDL_Texture* _grassTexture;
    SDL_Texture* _bobTexture;
    SDL_Rect _grassRect;
    SDL_Rect _bobRect;
......

我的 .cpp 文件

void GameWindow::LoadSprites(){
    _grassTexture = IMG_LoadTexture(_renderer,"grass.bmp");
    _grassRect.x = 0;
    _grassRect.y = 0;
    _grassRect.w = 600;
    _grassRect.h = 500;

    _bobTexture = IMG_LoadTexture(_renderer,"bob.bmp");
    _bobRect.x = 150;
    _bobRect.y = 150;
    _bobRect.w = 80;
    _bobRect.y = 50;
}
void GameWindow::Initialize(){
    if(SDL_Init(SDL_INIT_EVERYTHING) == -1)
        _running = false;
}
void GameWindow::SetupScreen(){
    _screen = SDL_CreateWindow("My Game Window",
                          100,
                          100,
                          640, 480,
                          SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);

    if(_screen == NULL){
       _running = false;
    }
    _renderer = SDL_CreateRenderer(_screen,-1,SDL_RENDERER_ACCELERATED);
    GameWindow::LoadSprites();
}
void GameWindow::Update(){

}
void GameWindow::Render(){
    SDL_RenderClear(_renderer);
    SDL_RenderCopy(_renderer,_bobTexture,NULL,&(_bobRect));
    SDL_RenderCopy(_renderer,_grassTexture,NULL,&(_grassRect));

    SDL_RenderPresent(_renderer);
}

我看到的只是grass.bmp。我无法渲染第二张图像。图像很好。我尝试使用相同的grass.bmp 代替bob.bmp 进行调试,但它仍然没有显示。只有第一个图像被渲染,第二个没有!希望有人能发现错误。我在 SDL 1.2 中没有任何问题,但在切换到 2.0 之后,它会产生很多错误和混乱!!

【问题讨论】:

  • SDL_RenderCopy/Load_Texture 返回什么?如果他们没有成功,SDL_GetError() 会告诉你什么?
  • 很抱歉,如何显示错误?我以前没有用 Windows 应用程序调试过。如果有任何错误,我在哪里以及如何查看日志?
  • 这是个奇怪的问题。我什么都试过了。只有第一个纹理被加载并显示在屏幕上,无论是任何图像。第二张图片无论是什么图片都没有成功加载!
  • 在 C++ 编码时避免在成员名称前使用下划线,这些是为实现保留的!看这里:stackoverflow.com/questions/228783/…
  • @JimZilla 将其写入文件或分配控制台来显示错误。 SDL 还带有一个日志记录头 wiki.libsdl.org/CategoryLog

标签: c++ sdl sdl-2


【解决方案1】:

好的,你有两个问题。

首先。仔细查看_bobRect 初始化的最后一行。猜猜_bobRect.h 参数的值是多少? (提示,它是 0 :)

_bobRect.x = 150;
_bobRect.y = 150;
_bobRect.w = 80;
_bobRect.y = 50;

其次,由于您将_grassTexture 复制到_bobTexture 之上,并且它更大,它将隐藏_bobTexture,除非它是透明的。所以改变顺序,让背景首先像这样复制

SDL_RenderCopy(_renderer,_grassTexture,NULL,&(_grassRect));
SDL_RenderCopy(_renderer,_bobTexture,NULL,&(_bobRect));

那你应该没事。

【讨论】:

  • @Hjorthenify 也花了我一段时间,当我看到它时正要开始逐行调试:p
  • 上帝的圣母。太感谢了!我想我的程序在这个世界上有什么问题?一切似乎都是正确的,我无法发现一个愚蠢的错误。我正要切换回SDL 1.2,我几乎花了一个小时试图定位错误哈哈哈。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
相关资源
最近更新 更多