在SDL 2.0 C ++中渲染地图

时间:2014-02-26 03:22:56

标签: c++ map sdl

我有一个关于SDL 2.0和渲染的问题,我对地图渲染的想法(像游戏男孩那样的老式zeldas或口袋妖怪的2D游戏)是在内存中加载一个模拟地图(假设像2000x2000)的纹理,然后渲染相机所在的部分,但我的问题是:

我不能放任何IMG,因为我需要10 REP,抱歉。我试过了

这是实际的地图代表(只是我在谷歌中获得的一张小精灵地图),这张地图是.bmp,大小是= 800x553。

这是使用(.cpp)的相机代码:

    CCamera CCamera::CameraControl;

    CCamera::CCamera() {
     X = Y = 0;

     TargetX = TargetY = NULL;

     TargetMode = TARGET_MODE_NORMAL;
     }

     void CCamera::OnMove(int MoveX, int MoveY) {
     X += MoveX;
     Y += MoveY;
     }

     int CCamera::GetX() {
     int WWIDTH=640; 
    if(TargetX != NULL) {
    if(TargetMode == TARGET_MODE_CENTER) {
        return *TargetX - (WWIDTH / 2);
     }

    return *TargetX;
    }

  return X;
   }

   int CCamera::GetY() {
   int WHEIGHT=480; //Ver guia tutorial "SDL MAPAS", El creo un define.h el cual traia unos defaults
    if(TargetY != NULL) {
    if(TargetMode == TARGET_MODE_CENTER) {
        return *TargetY - (WHEIGHT / 2);
    }

    return *TargetY;
    }

    return Y;
     }   

   void CCamera::SetPos(int X, int Y) {
   this->X = X;
   this->Y = Y;
   }

   void CCamera::SetTarget(int* X, int* Y) {
    TargetX = X;
   TargetY = Y;
   }

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

    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;
   }

我的问题是:从地图纹理我想绘制像地图的一部分,但在小尺寸,使其适合整个屏幕,这是一个800x553,并且即时渲染640,480,如果有人在1024x740播放将不会工作,就像地图的一个城市,但只是整个城市适合整个屏幕。

THX

2 个答案:

答案 0 :(得分:0)

如果目的地的宽度和高度与来源不匹配,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)的纹理(游戏渲染到的)而不是窗口。一旦将整个帧渲染到纹理,纹理就会渲染到窗口并缩放到正确的大小。

答案 1 :(得分:0)

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

有一个提供“rotozoom”功能的补充库(SDL_gfx),如果需要,可以使用它。

或者,如果您需要渲染库,则可能需要使用SFML。不同之处在于SFML将使用完全伪装光栅化器管道来显示内容,因此您可以随意调整大小并保持分辨率。

所以我的建议只是硬编码分辨率,大多数游戏都是这样做的,游戏是以一个分辨率播放的,就是这样。

另外在旁注中,你不应该使用大图像来限制它。使用平铺。制作一个关卡编辑器或其他东西,并在任何地方放置一些图像,然后你的关卡只是一个左上角位置的文本文件或构成关卡的所有图像+每个精灵的文件路径。然后你的游戏只需要在屏幕上显示一个像素偏移对应于当前屏幕矩形的图块。