C++ 在SDL2.0c++;

C++ 在SDL2.0c++;,c++,map,sdl,C++,Map,Sdl,我有一个关于SDL 2.0和渲染的问题,我对地图渲染(2d游戏,如game boy上的旧zeldas或pokemon)的想法是加载一个纹理,在内存中模拟地图(假设为2000x2000),然后渲染相机所在的部分,但我的问题是: 我不能放任何IMG,因为我需要10个代表,对不起。我试过了 这是实际的地图表示(只是一个口袋妖怪地图,我在谷歌得到),这是一个.bmp的地图,大小是=800x553 这是im使用的摄像头代码(即.cpp): 这是绘制到屏幕(.cpp)的代码: 我的问题是:从地图纹理我想画像

我有一个关于SDL 2.0和渲染的问题,我对地图渲染(2d游戏,如game boy上的旧zeldas或pokemon)的想法是加载一个纹理,在内存中模拟地图(假设为2000x2000),然后渲染相机所在的部分,但我的问题是:

我不能放任何IMG,因为我需要10个代表,对不起。我试过了

这是实际的地图表示(只是一个口袋妖怪地图,我在谷歌得到),这是一个.bmp的地图,大小是=800x553

这是im使用的摄像头代码(即.cpp):

这是绘制到屏幕(.cpp)的代码:

我的问题是:从地图纹理我想画像地图的一部分,但在小尺寸,使它适合整个屏幕,这是一个800x553,我重新640480,如果有人在1024x740播放将无法工作,像地图的城市之一,但城市适合整个屏幕


如果目标的宽度和高度与源不匹配,thx

SDL将缩放纹理

例如,假设您有一个50x50雪碧,并执行以下操作:

SDL_Rect src;
src.x = 0
src.y = 0;
src.w = 50;
src.h = 50;

SDL_Rect dst;
dst.x = 0;
dst.y = 0;
dst.w = 100;
dst.h = 100;

SDL_RenderCopy(renderer, mySprite, &src, &dst);
您的精灵将渲染两倍大,因为目标宽度和高度是源的两倍大

对于您的情况,如果您只想显示地图的640x480部分并拉伸它以适应窗口,则可以将源设置为640x480,将目标设置为窗口大小


一个常用的技巧是确保所有东西都以相同的方式缩放,即使用具有“摄影机”分辨率(即640x480)的纹理,游戏渲染到该纹理,而不是窗口。将整个帧渲染到纹理后,纹理将渲染到窗口并缩放到正确的大小。

SDL不是分辨率独立的,因为它是一个“像素完美”库,老式

有一个补充图书馆提供“rotozoom”功能(SDL_gfx),如果您愿意,您可以使用它

如果需要渲染库,也可以使用
SFML
。不同之处在于,SFML将使用一个成熟的光栅化器管道来显示内容,因此您可以随意调整内容大小和分辨率

所以我的建议是对分辨率进行硬编码,大多数游戏都是这样做的,一个游戏只能以一种分辨率进行,就是这样


另一方面,你不应该使用大图片来限制它。使用瓷砖。制作一个关卡编辑器或其他东西,将图像的位放在任何地方,然后你的关卡就是一个文本文件,位置在左上角,或者是组成关卡的所有图像+每个精灵的文件路径。然后,游戏只需在屏幕上显示与当前屏幕矩形对应的像素偏移量的平铺。

没错,
RenderCopy
将进行缩放。当然SDL_gfx会做得更快更整洁:)我不知道我做得是否正确,我只想展示我的地图,然后在上面放一些实体,就像不要饿死的地图一样,但是没有随机发生器,我想也许我可以在内存中画一个巨大的完整图像,然后在玩家移动时在相机中显示它的片段,实体将出现在一个列表中,只有当它的坐标在摄像头区域时才会显示,我不知道它是否会成为一个记忆吞噬者(游戏将有更多的地图),但我还是一个新手,我正在努力学习。
    bool Texture::OnDraw(SDL_Renderer * Render, SDL_Texture * Texture_Dest, int X, int Y,int X2, int Y2,int W, int H){

if (Render==NULL || Texture_Dest == NULL ){printf("No se pudo dibujar ya que El renderer o el destino o la fuente estaba vacio"); return false;}


SDL_Rect DestR;

DestR.x = X;
DestR.y = Y;
DestR.w = W;
DestR.h = H;

SDL_Rect SrcR;

SrcR.x = X2;
SrcR.y = Y2;
SrcR.w = W;
SrcR.h = H;


SDL_RenderCopy(Render,Texture_Dest,&SrcR,&DestR);

 return true;
   }
SDL_Rect src;
src.x = 0
src.y = 0;
src.w = 50;
src.h = 50;

SDL_Rect dst;
dst.x = 0;
dst.y = 0;
dst.w = 100;
dst.h = 100;

SDL_RenderCopy(renderer, mySprite, &src, &dst);