SDL_RenderSetViewport принимает все нарисованные объекты - PullRequest
0 голосов
/ 19 ноября 2018

Я создаю область просмотра в верхнем правом углу, где я отрисовываю изображение.но в итоге я рендерил все объекты, которые я рисую в этом окне просмотра, а не на остальной части экрана.в этом случае я нарисовал треугольник.

это код: окно

Window::Window (const std::string &title, int width, int height): title(title),width(width),height(height){closed=!init();}

bool Window::init(){
  window=SDL_CreateWindow(title.c_str(),SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,width,height,0);
  renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
}

void Window::clear() const{
  SDL_RenderPresent(renderer); 
  SDL_SetRenderDrawColor(renderer,0,0,200,255);
  SDL_RenderClear(renderer);   
}

код розыгрыша:

Draw::Draw(int w,int h,int x,int y,int r,int g,int b,int a):w(w),h(h),x(x),y(y),r(r),g(g),b(b),a(a){}

Draw::Draw(int w,int h,int x,int y,const std::string &image):w(w),h(h),x(x),y(y){
   auto surface = IMG_Load(image.c_str());
   texture=SDL_CreateTextureFromSurface(Window::renderer,surface);
   SDL_FreeSurface(surface);
}

void Draw::drawline() const{
  SDL_SetRenderDrawColor(Window::renderer,r,g,b,a);
  SDL_RenderDrawLine(Window::renderer,x,y,w,h);
}

void Draw::drawviewport() {
  SDL_Rect viewport ={x,y,w,h};
  SDL_RenderSetViewport(Window::renderer, &viewport );
  SDL_RenderCopy( Window::renderer, texture, NULL, NULL );
  SDL_RenderSetViewport(Window::renderer, NULL );
}

основной код:

Window window("test SDL 1", 1920, 1080);
Draw rs(960,550,960,0,"deposit/sdl.jpg");

Draw linha1(0,400,200,200,255,255,0,0);
Draw linha2(400,400,200,200,255,255,0,0);
Draw linha3(400,400,0,400,255,255,0,0); 

while(!window.isClosed()){

    rs.drawviewport();

    linha1.drawline();
    linha2.drawline();
    linha3.drawline();

    window.clear();
}

1 Ответ

0 голосов
/ 24 декабря 2018

Решение по keltar :

Вы никогда не возвращаете окно просмотра обратно в полноэкранный режим (SDL_RenderSetViewport (renderer, NULL)).Однако на данный момент неясно, зачем вам вообще нужны отдельные видовые окна - то, что написано в вопросе, лучше сделать с одной RenderCopy со структурой «viewport» в качестве прямоугольника назначения.

...