gpt4 book ai didi

c++ - 在 SDL 中显示 PNG?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:16 25 4
gpt4 key购买 nike

我正试图让一名骑马的骑士(不吉利地被命名为“家伙”)跑过屏幕。骑士目前以 2 个 .png 文件的形式存在于我的目录中,以模拟一些动画效果不佳的疾驰。当他是 .bmp 时,我能够让他出现,但我想利用 png 文件的透明度——我也尝试过打开 tif 文件,但失败了。我如何更改我的代码才能使他从正确加载到 SDL 的 .png 中出现?

这是我的 .cpp 文件:

#include "SDL/SDL.h"
#include <iostream>
#include "source_sdl.h"
# include <string>

using namespace std;

int source_sdl( int argc, char* args[] ) {

int switch = 1;
int running = 1;

// surface & rect declarations
SDL_Surface* ground = NULL;
SDL_Surface* guy = NULL;
SDL_Surface* guy2 = NULL;
SDL_Rect guylocationRect;
SDL_Rect groundlocationRect;

// initialize SDL & the screen
SDL_Init( SDL_INIT_EVERYTHING );
screen = SDL_SetVideoMode( 875, 625, 32, SDL_SWSURFACE );

// open .png files
SDL_RWops* guy_rwop;
SDL_RWops* guy2_rwop;
guy_rwop = SDL_RWFromFile("tiffKnight.png", "rb");
guy2_rwop = SDL_RWFromFile("tiffKnight2.png", "rb");
guy = IMG_LoadPNG_RW(guy_rwop);
guy2 = IMG_LoadPNG_RW(guy2_rwop);
guylocationRect.x = 300;
guylocationRect.y = 300;
groundlocationRect.x = 300;
groundlocationRect.y = 300;

SDL_Event occur;

// animation loop (currently endless)
while (running == 1){

SDL_Flip( screen );
SDL_Delay( 300 );

if (gallop > 89) gallop=0;

// draw the ground
for( int yu = 0; yu<35; yu++){
groundlocationRect.x=25*yu;
groundlocationRect.y=5*25;
SDL_BlitSurface( ground, NULL, screen, &groundlocationRect );
}
// draw the gallopping
guylocationRect.x=10*gallop;
guylocationRect.y=5*25;
if( switch ){
SDL_BlitSurface( guy, NULL, screen, &guylocationRect );
}else{
SDL_BlitSurface( guy2, NULL, screen, &guylocationRect );
}
gallop++;
switch = (switch+1)%2;
for(int u = 6; u < 25; u++){
for(int yu = 0; yu < 35; yu++){
groundlocationRect.x = 25*yu;
groundlocationRect.y = 25*u;
SDL_BlitSurface( ground, NULL, screen, &groundlocationRect );
}
}
}
SDL_FreeSurface( guy );
SDL_FreeSurface( guy2 );
SDL_FreeSurface( ground );
}

正如我目前拥有的那样,骑士没有出现,我也没有收到任何错误(SDL 屏幕打开的结果?)失败检查,例如

if(!guy) {
cout << "IMG_LoadPNG_RW: %s\n" << IMG_GetError();
}

也没有结果。我的 .h 文件很简单:

#include "SDL/SDL.h"
#include <iostream>

using namespace std;
int source_sdl( int argc, char* args[] );

还有我的 main.cpp:

#include "SDL/SDL.h"
#include <iostream>
#include "source_sdl.h"
using namespace std;

int main( int argc, char* args[] ){

source_sdl( argc, args );

}

最佳答案

如果您真的想坚持使用 C++ 中的 SDL,我建议您使用 SDL_image library并使用如下函数:

SDL_Surface * load_image(std::string const & filename)
{
SDL_Surface * img = NULL;
SDL_Surface * tmp = IMG_Load(filename.c_str());

if (tmp)
{
img = SDL_DisplayFormatAlpha(tmp);
SDL_FreeSurface(tmp);
}

return img;
}

一个更现代、更安全的方法示例如下所示:

using surface_ptr = std::unique_ptr<SDL_Surface, decltype(&SDL_FreeSurface)>;

surface_ptr load_image (std::string const & filename)
{
surface_ptr img { nullptr, &SDL_FreeSurface };
surface_ptr tmp { IMG_Load(filename.c_str()), &SDL_FreeSurface };

if (tmp)
img.reset(SDL_DisplayFormatAlpha(tmp.get()));

return img;
}

或者更好的是,使用现有的 C++ 绑定(bind),例如 libSDL2pp (我与他们无关)。

关于c++ - 在 SDL 中显示 PNG?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22706153/

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