【问题标题】:Rendering the map in SDL 2.0 C++在 SDL 2.0 C++ 中渲染地图
【发布时间】:2014-02-26 03:22:55
【问题描述】:

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

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

这是实际显示的地图(只是我在 google 中获得的口袋妖怪地图),此地图为 .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,如果有人以 1024x740 播放,我会重新绘制 640,480工作,就像地图上的城市之一,但只有城市适合整个屏幕。

谢谢

【问题讨论】:

    标签: c++ map sdl


    【解决方案1】:

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

    【讨论】:

    • 没错RenderCopy wiki.libsdl.org/SDL_RenderCopy 将进行缩放。当然,SDL_gfx 会做得更快更整洁 :)
    • 我不知道我做得对不对,我只是想展示我的地图,然后像饥荒的地图一样在上面放一些实体,但是没有随机生成器,我想也许我可以画记忆一个巨大的完整图像,然后在玩家移动时在相机中显示它的碎片,并且实体将在列表中,并且只有当它的坐标在相机区域时才会显示,我不知道它是否会以后会吃内存(游戏会有更多地图),但我还是个新手,我正在努力学习。
    【解决方案2】:

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

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

    或者如果你想要一个渲染库,你可能想要使用SFML。不同之处在于 SFML 将使用完全成熟的光栅化管道来显示内容,因此您可以随意调整大小并独立于分辨率。

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

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

    【讨论】:

      猜你喜欢
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多