C++ SDL2 SLD#U渲染复制不';我什么也看不出来

C++ SDL2 SLD#U渲染复制不';我什么也看不出来,c++,sdl,C++,Sdl,我正在使用SDL2学习如何制作一个简单的2D平台。 我开始阅读SDL游戏开发和Lazy Foo的教程,我能够打开一个窗口,在一个曲面上绘制,并在窗口上blit该曲面(就像在遗留SDL中所做的那样),但是如果我尝试使用渲染器函数对硬件加速做同样的事情,它不会显示任何东西! 我在Windows10上运行,当我启动应用程序时,它只显示空窗口。我试图打印一些调试行,它似乎打开了位图,创建了纹理,但当我打印使用QueryTexture得到的矩形的尺寸时,它返回0和0 //Game.cpp: #includ

我正在使用SDL2学习如何制作一个简单的2D平台。 我开始阅读SDL游戏开发和Lazy Foo的教程,我能够打开一个窗口,在一个曲面上绘制,并在窗口上blit该曲面(就像在遗留SDL中所做的那样),但是如果我尝试使用渲染器函数对硬件加速做同样的事情,它不会显示任何东西! 我在Windows10上运行,当我启动应用程序时,它只显示空窗口。我试图打印一些调试行,它似乎打开了位图,创建了纹理,但当我打印使用QueryTexture得到的矩形的尺寸时,它返回0和0

//Game.cpp:
#include <SDL.h>
#include <SDL_image.h>
#include "Game.h"
#include <iostream>

bool Game::init(const char *title,int x,int y,int width,int height,int flags)
{
    if (SDL_Init(SDL_INIT_VIDEO) < 0)
        return false;
    m_pWindow = SDL_CreateWindow(title,x,y,width,height,flags);
    if (m_pWindow == NULL)
        return false;
    m_pRenderer = SDL_CreateRenderer(m_pWindow,-1,0);
    if (m_pRenderer == NULL)
        return false;
    SDL_SetRenderDrawColor(m_pRenderer,0,0,0,255);
    return true;
}

void Game::handle_events()
{
    SDL_Event event;
    while (SDL_PollEvent(&event) != 0)
    {
        switch (event.type)
        {
            case SDL_QUIT:
                m_bRunning = false;
                break;
            default:
                break;
        }
    }
}

void Game::render()
{
    SDL_RenderClear(m_pRenderer);
    SDL_RenderCopy(m_pRenderer,m_pTexture,&m_sourceRectangle,&m_destinationRectangle);
    SDL_RenderPresent(m_pRenderer);
}

void Game::clean()
{
    SDL_DestroyWindow(m_pWindow);
    SDL_DestroyRenderer(m_pRenderer);
    SDL_Quit();
}

bool Game::loadImage()
{
    SDL_Surface *surface = SDL_LoadBMP("logo.bmp");
    if (surface == NULL)
        return false;
    SDL_Texture *texture =  SDL_CreateTextureFromSurface(m_pRenderer,surface);
    if (texture == NULL)
        return false;
    SDL_FreeSurface(surface);
    SDL_QueryTexture(m_pTexture,NULL,NULL,&m_sourceRectangle.w,&m_sourceRectangle.h);
    m_destinationRectangle.x = m_sourceRectangle.x = 0;
    m_destinationRectangle.y = m_sourceRectangle.y = 0;
    m_destinationRectangle.w = m_sourceRectangle.w;
    m_destinationRectangle.h = m_sourceRectangle.h;
    return true;
}



// main.cpp:
#include <SDL.h>
#include "Game.h"
#include <iostream>
#include <Windows.h>

Game *g_game = NULL;

int main(int argc,char **argv)
{
    AllocConsole(); 
    freopen("CON","w", stdout);

    g_game = new Game();
    if (g_game->init("my 2D platform game!",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,800,600,SDL_WINDOW_SHOWN) != true)
        return 1;
    if (g_game->loadImage() != true)
        return 2;
    g_game->render();

    while (g_game->running())
    {
        g_game->handle_events();
        g_game->update();
    }

    g_game->clean();

    return 0;
}
//Game.cpp:
#包括
#包括
#包括“Game.h”
#包括
bool Game::init(常量字符*标题、整数x、整数y、整数宽度、整数高度、整数标志)
{
if(SDL_Init(SDL_Init_视频)<0)
返回false;
m_pWindow=SDL_CreateWindow(标题、x、y、宽度、高度、标志);
如果(m_pWindow==NULL)
返回false;
m_pRenderer=SDL_CreateRenderer(m_pWindow,-1,0);
如果(m_pRenderer==NULL)
返回false;
SDL_SetRenderDrawColor(m_pRenderer,0,0,0255);
返回true;
}
无效游戏::处理事件()
{
SDL_事件;
while(SDL_PollEvent(&event)!=0)
{
开关(事件类型)
{
案例SDL_退出:
m_bRunning=错误;
打破
违约:
打破
}
}
}
void Game::render()
{
SDL_RenderClear(m_pRenderer);
SDL_渲染副本(m_pRenderer、m_pTexture、m_sourceRectangle和m_destinationRectangle);
SDL_RenderPresent(m_pRenderer);
}
void游戏::clean()
{
SDL_窗口(m_pWindow);
SDL_(m_pRenderer);
SDL_退出();
}
bool游戏::loadImage()
{
SDL_Surface*Surface=SDL_LoadBMP(“logo.bmp”);
如果(曲面==NULL)
返回false;
SDL_Texture*Texture=SDL_CreateTextureFromSurface(m_pRenderer,surface);
如果(纹理==NULL)
返回false;
SDL_自由曲面(曲面);
SDL_QueryTexture(m_pTexture,NULL,NULL,&m_sourceRectangle.w,&m_sourceRectangle.h);
m_destinationRectangle.x=m_sourceRectangle.x=0;
m_destinationRectangle.y=m_sourceRectangle.y=0;
m_destinationRectangle.w=m_sourceRectangle.w;
m_destinationRectangle.h=m_sourceRectangle.h;
返回true;
}
//main.cpp:
#包括
#包括“Game.h”
#包括
#包括
Game*g_Game=NULL;
int main(int argc,字符**argv)
{
allocsole();
弗雷奥普(“CON”、“w”、stdout);
g_game=新游戏();
如果(g_game->init(“我的2D平台游戏!”,以SDL_WINDOWPOS_为中心,以SDL_WINDOWPOS_为中心,显示800600,SDL_WINDOW_)!=true)
返回1;
如果(g_game->loadImage()!=true)
返回2;
游戏->渲染();
while(游戏->跑步())
{
g_游戏->处理_事件();
游戏->更新();
}
g_游戏->清洁();
返回0;
}

问题在于您没有在中正确指定纹理
Game::loadImage()
函数。排队

SDL_Texture *texture = SDL_CreateTextureFromSurface(m_pRenderer,surface);
创建的纹理被指定给一个局部指针变量,该变量 函数末尾超出范围。相反,你需要帮助别人 将纹理添加到类变量:

m_pTexture = SDL_CreateTextureFromSurface(m_pRenderer,surface);

作为注释,你没有充分利用C++的能力。 管理资源。我建议你花点时间 在学习推荐做法时,例如从


.

问题在于您没有在中正确指定纹理
Game::loadImage()
函数。排队

SDL_Texture *texture = SDL_CreateTextureFromSurface(m_pRenderer,surface);
创建的纹理被指定给一个局部指针变量,该变量 函数末尾超出范围。相反,你需要帮助别人 将纹理添加到类变量:

m_pTexture = SDL_CreateTextureFromSurface(m_pRenderer,surface);

作为注释,你没有充分利用C++的能力。 管理资源。我建议你花点时间 在学习推荐做法时,例如从


.

哦,对了!这太愚蠢了…我来自嵌入式C编程,我在一段时间之前学会了一点OOP,现在我正在学习C++和所有的类类型的东西。但这是一个可怕的错误:我不反对:)。虽然我还学习C++的所有复杂性,确实有很多东西要做。干杯,好的!这太愚蠢了…我来自嵌入式C编程,我在一段时间之前学会了一点OOP,现在我正在学习C++和所有的类类型的东西。但这是一个可怕的错误:我不反对:)。虽然我还学习C++的所有复杂性,确实有很多东西要做。干杯