繁体   English   中英

如何在 SDL2 中嵌套视口

[英]How can I nest viewports in SDL2

我在屏幕右侧有一个大视口(这里是“图层”),我在该视口(“actorRect”)内渲染了一个矩形。 然后,我将视口设置为 actorRect 并尝试将 SDL_RenderDrawLines 设置为矩形中的火柴人。

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

插图

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

我希望那个火柴人在那个矩形内渲染。

这是一个代码片段:

//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());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM