gpt4 book ai didi

c++ - SDL2 SLD_RenderCopy 不显示任何内容

转载 作者:行者123 更新时间:2023-11-28 01:55:31 25 4
gpt4 key购买 nike

我正在使用 SDL2 学习如何制作简单的 2D 平台。我开始阅读 SDL 游戏开发和 Lazy Foo 的教程,我能够打开一个窗口并在表面上绘制并在窗口上绘制该表面(就像在旧版 SDL 中所做的那样),但如果我尝试这样做与使用渲染器功能的硬件加速一样,它不显示任何东西!我在 Windows 10 上运行,当我启动应用程序时,它只显示空窗口。我试图打印一些调试行,它似乎打开了位图,创建了纹理,但是当我打印我使用 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::loadImage() 函数。在行中

SDL_Texture *texture = SDL_CreateTextureFromSurface(m_pRenderer,surface);

创建的纹理被分配给一个局部指针变量,它去在函数末尾超出范围。相反,你需要评估类变量的纹理:

m_pTexture = SDL_CreateTextureFromSurface(m_pRenderer,surface);

请注意,您没有充分利用 C++ 功能来管理资源。我建议你投入一些时间在学习推荐的做法时,例如从 C++ Core Guidelines .

关于c++ - SDL2 SLD_RenderCopy 不显示任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41359917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com