2017-09-28 18 views
2

SDL2 위키의 SDL_RenderSetScale()과 SDL_RenderSetLogicalSize()에 대한 간단한 설명에서부터 나는이 명령이 기본적으로 그래픽 편집기에서 이미지의 크기를 조절하는 방식으로 내용에 상관없이 전체 프레임의 크기를 조절한다는 인상하에있었습니다.SDL_RenderSetScale과 SDL_RenderDrawLine은 어떻게 상호 작용합니까?

이전의 SDL_Rects 및 SDL_Texture 만 크기 조정하고 렌더링 한 이전 프로그램에서는 그 것처럼 보였습니다. 그러나 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()을 사용하여 각도에 상관없이 선의 크기를 조절하는 방법이 있습니까? 함수가 무엇을 확장하고 무엇을 무시할지 결정하는 방법은 무엇입니까?

답변

1

이것은 SDL 렌더러의 알려진 버그로, 선 그리기 기능이 확장되지 않고 자유로운 각도로 그려집니다. 그것은 (/* FIXME: We can't use a rect for this line... */ 참조) 여전히 최근 출시 된 SDL-2.0.6에 존재입니다 : 이것은 거의 사용되지 않는 기능이기 때문에 나는이 곧 고정되지 않습니다 가정

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

.

+0

머리를 주셔서 감사합니다. 이 버그의 영향을받지 않는 sdl2로 확장 할 수있는 다른 방법이 있습니까? 프레젠테이션을하기 전에 전체 프레임의 스냅 샷을 찍은 다음 크기를 조정하는 것과 같은 것이 있습니까? 성능이 그다지 큰 문제는 아닙니다. – mwyah

+0

@ boristhesp1der 아마도 라인 (또는 전체 장면)을 SDL_Surface로 렌더링 한 다음 확장 할 수 있습니다. –

+0

@ boristhesp1der 렌더러에 대한 다른 대상 (케이스의 질감)을 사용하고 선을 그려 넣은 다음 이미 수행 한 것처럼 텍스처의 크기를 조정할 수 있습니다. 나는 내 마음에서 이름을 얻었지만'SDL_SetRendererTarget'과 같은 것입니다. – skypjack