SDL_RENDERSETSETSCALE和SDL_RENDERDRAWLINE如何交互
How do SDL_RenderSetScale and SDL_RenderDrawLine interact?
来自sdl_rendersetscale()的简短描述()和sdl2 wiki上的sdl_rendersetLogicalSize(),我的印象是这些命令是这些命令缩放整个帧与其内容独立于其内容的方式,从而扩展了您的内容,从而扩展了您的内容的规模,从而扩展了您的尺度图形编辑器中的图像。
在我以前的程序中,我只在缩放和渲染sdl_rects和sdl_textures,这似乎就是这种情况。但是,仅部分使用RenderDrawLine()绘制线路。
如果线平行于X或Y轴,则该线的缩放率正确,但是在任何其他情况下,它根本不缩放。
SDL_RenderSetScale( gRenderer, gScaler, gScaler );
SDL_SetRenderDrawColor( gRenderer, 0x00, 0x00, 0x00, 0xFF );
SDL_RenderClear( gRenderer );
SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF );
SDL_RenderDrawLine( gRenderer, x1, y1, x2, y2 );
SDL_RenderPresent( gRenderer );
与SDL_RenderSetscale()角度无关,有没有办法缩放线路?该函数如何确定缩放的规模和忽略的范围?
这是SDL渲染器的已知错误,行绘图函数不会缩放,然后以自由角度绘制。它仍然存在于最近发布的SDL-2.0.6(请参阅/* FIXME: We can't use a rect for this line... */
):
static int
RenderDrawLinesWithRects(SDL_Renderer * renderer,
const SDL_Point * points, int count)
{
SDL_FRect *frect;
SDL_FRect *frects;
SDL_FPoint fpoints[2];
int i, nrects;
int status;
frects = SDL_stack_alloc(SDL_FRect, count-1);
if (!frects) {
return SDL_OutOfMemory();
}
status = 0;
nrects = 0;
for (i = 0; i < count-1; ++i) {
if (points[i].x == points[i+1].x) {
int minY = SDL_min(points[i].y, points[i+1].y);
int maxY = SDL_max(points[i].y, points[i+1].y);
frect = &frects[nrects++];
frect->x = points[i].x * renderer->scale.x;
frect->y = minY * renderer->scale.y;
frect->w = renderer->scale.x;
frect->h = (maxY - minY + 1) * renderer->scale.y;
} else if (points[i].y == points[i+1].y) {
int minX = SDL_min(points[i].x, points[i+1].x);
int maxX = SDL_max(points[i].x, points[i+1].x);
frect = &frects[nrects++];
frect->x = minX * renderer->scale.x;
frect->y = points[i].y * renderer->scale.y;
frect->w = (maxX - minX + 1) * renderer->scale.x;
frect->h = renderer->scale.y;
} else {
/* FIXME: We can't use a rect for this line... */
fpoints[0].x = points[i].x * renderer->scale.x;
fpoints[0].y = points[i].y * renderer->scale.y;
fpoints[1].x = points[i+1].x * renderer->scale.x;
fpoints[1].y = points[i+1].y * renderer->scale.y;
status += renderer->RenderDrawLines(renderer, fpoints, 2);
}
}
status += renderer->RenderFillRects(renderer, frects, nrects);
SDL_stack_free(frects);
if (status < 0) {
status = -1;
}
return status;
}
我认为这不会很快解决,因为这是一个很少使用的功能。
相关文章:
- Qt VTK交互风格的信号到小部件
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- SDL 窗口不会弹出
- Qt Quick-如何仅从c++代码与qml属性交互
- SDL 操纵杆按钮按下/C++
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- 复制和交换习惯用法与移动操作之间的交互
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- 为什么在访问 vtkRenderWindow 的"交互器"变量时会发生段错误?
- SDL 映像:无法打开映像,仅显示错误消息
- 如何在 3D OpenGL 场景上绘制 SDL 2D 矩形?
- Qt QGraphicsProxyWidget 与 QGraphicsScene 的交互
- "Undefined symbols for architecture x86_64" 在 SDL 2 (macOS) 中
- 为什么 SDL 在 Mac 上比 Linux 慢得多?
- 在 OSX 上打开 SDL 窗口时不要打开终端窗口
- SDL + OpenGL ES 2.0 使用着色器显示纹理
- SDL GPU 为什么将两个图像分成两个单独的循环更快?
- 在 cmake 中找不到 SDL 库
- 使用 Python 事件并与 C++ 交互