如何在 SDL2 中嵌套视口

How can I nest viewports in SDL2

我在屏幕右侧有一个大视口(此处 "Layers"),我在该视口内渲染了一个矩形 ("actorRect")。然后,我将视口设置为 actorRect 并尝试 SDL_RenderDrawLines 矩形中的火柴人。

火柴人在屏幕左侧渲染,就好像它使用的是 ActorRect 的普通 x,y 坐标。

在上图中,我圈出了我的火柴人,画了一个指向actorRect的箭头。 (actorRect 在这里只有绿色,所以我可以知道它在哪里。稍后它会是其他颜色,或者像轮廓之类的东西,idk)。

我想让火柴人在那个矩形内渲染。

这是一个代码片段:

//vector mStickmanIcon = {/*...a bunch of points...*/};
SDL_RenderSetViewport(gRenderer, &Layers);
SDL_SetRenderDrawColor(gRenderer, 200,250,165,255);
SDL_RenderFillRect(gRenderer, &actorRect);
SDL_RenderSetViewport(gRenderer, &actorRect);
SDL_SetRenderDrawColor(gRenderer, 0,0,0,255);
SDL_RenderDrawLines(gRenderer, mStickmanIcon.data(), mStickmanIcon.size());

大家怎么看?有什么建议吗?请将答案限制为 SDL2。我没有使用 OpenGL。

我也对偏移 SDL_Point 向量的简单方法感兴趣,这样我就可以完全取消 actorRect,但我想我以后可能想再次嵌套视口,所以这就是问题所在我在问。

ETA:我添加了以下代码来找出这些项目在屏幕上的位置:

SDL_Rect myRect;
SDL_RenderGetViewport(gRenderer, &myRect);
printf("Viewport h,w,x,y: %i,%i,%i,%i\n", myRect.h,myRect.w,myRect.x,myRect.y);
for(int i = 0; i < mStickmanIcon.size(); i++)
{
    printf("stickman i,x,y: %i,%i,%i\n", i,mStickmanIcon.data()[i].x, mStickmanIcon.data()[i].y);
}

这是输出:

stickman i,x,y: 0,5,15
stickman i,x,y: 1,8,12
stickman i,x,y: 2,11,15
stickman i,x,y: 3,8,12
stickman i,x,y: 4,8,9
stickman i,x,y: 5,5,9
stickman i,x,y: 6,11,9
stickman i,x,y: 7,8,9
stickman i,x,y: 8,8,6
stickman i,x,y: 9,7,6
stickman i,x,y: 10,5,4
stickman i,x,y: 11,5,2
stickman i,x,y: 12,7,0
stickman i,x,y: 13,8,0
stickman i,x,y: 14,11,2
stickman i,x,y: 15,11,4
stickman i,x,y: 16,9,6
Viewport h,w,x,y: 16,16,247,119

查看 SDL,嵌套视口似乎并不容易。不过,您很幸运 - 既然您已经有了一个现有的视口,以及您刚刚绘制的一个矩形,为什么不使用该矩形的坐标作为新视口的基础呢?

//vector mStickmanIcon = {/*...a bunch of points...*/};
SDL_RenderSetViewport(gRenderer, &Layers);
SDL_SetRenderDrawColor(gRenderer, 200,250,165,255);
SDL_RenderFillRect(gRenderer, &actorRect);

SDL_Rect actorView;
actorView.x = Layers.x + actorRect.x;
actorView.y = Layers.y + actorRect.y;
actorView.w = actorRect.w;
actorView.h = actorRect.h;

SDL_RenderSetViewport(gRenderer, &actorView);
SDL_SetRenderDrawColor(gRenderer, 0,0,0,255);
SDL_RenderDrawLines(gRenderer, mStickmanIcon.data(), mStickmanIcon.size());