c++ 如何在SDL2上创建不同大小的纹理?

qv7cva1a  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(175)

There's quite a bit of code, so I put it all on my github.cpp文件在**/src上,hpp文件在/include上)
这可能真的很简单,但因为我是C++的新手,所以我不知道该怎么去做。
所以我的项目中已经有了一些纹理,一个占据整个应用程序的
background纹理(640 x480),一些floortiles(64 x64)和players**纹理,这就是我的问题所在。

我想让我的播放器纹理不是64 x64,也许是86 x86或类似的东西,但不是64 x64。

问题是,教程基本上教我硬编码纹理大小为64 x64,你可以在Entity.cpp的这个小片段中看到。

Entity::Entity(Vector2f p_pos, SDL_Texture* p_tex)
:pos(p_pos), tex(p_tex)
{
    currentFrame.x = 0;
    currentFrame.y = 0;
    currentFrame.w = 64;
    currentFrame.h = 64;
}

有什么方法可以让它接受不同的值吗?**当我在Photoshop上将播放器纹理设置为(例如)86 x86并将其插入代码时,问题才真正开始出现。
播放器就是那个黄色的东西,我加了一张脸,所以你可以理解它被剪掉了,因为程序把它裁剪成了一个64 x64的正方形,我不想这样。
screenshot of the problem.
我试着在Entity类中添加一个新的size变量(它已经有了position变量),但是由于我不是很擅长这个语言,我没有设法使它工作,因为它给了我很多错误,说明它基本上不知道size变量是什么和它的用途。

jqjz2hbq

jqjz2hbq1#

您正在为应用程序使用硬件渲染。为此,SDL使用一个名为SDL_RenderCopy的函数。这个函数的一个参数是指向SDL_Rect的指针,它定义了图像的哪个“切片”将在指定的位置呈现。当前,您正在使用64作为此图像的宽度和高度值。您可以更改构造函数以接受width和height值,并将它们用于currentFrame.wcurrentFrame.h

Entity::Entity(Vector2f p_pos, SDL_Texture* p_tex, int w, int h)
:pos(p_pos), tex(p_tex)
{
    currentFrame.x = 0;
    currentFrame.y = 0;
    currentFrame.w = w;
    currentFrame.h = h;
}

正如您所看到的,使用小于纹理的值会导致纹理具有裁剪外观。然而,这也有一个优点。以这种方式使用切片允许程序员在他们的应用程序中使用瓦片贴图,而不是必须为他们可能想要在他们的游戏中使用的每个瓦片使用单独的纹理。
或者,如果您不使用平铺贴图,只是想轻松渲染整个纹理,而不必计算其高度和宽度(以像素为单位),您可以简单地将NULL传递给SDL_RenderCopy作为srcrect参数。
SDL_RenderCopy(renderer, texture, NULL, &dst);
这将用纹理texture填充dst占用的区域。

相关问题