2017-09-15 21 views
1

即時通訊嘗試顯示兩個不同的動畫,兩個功能,一個渲染和兩個線程。在兩個不同的線程(解決方案中沒有線程)中顯示兩個或多個不同的動畫和SDL2渲染。 C++

我每次運行代碼時都會收到不同類型的錯誤。 如:在刷新函數(SDL_RenderPresent(w1.renderer);行)中的默認分段以及其他奇怪的錯誤。每次都是不同的。

我知道它在不同的線程中使用渲染。但我不知道如何解決這個問題。

當我只用其中一個線程運行一切就OK了。但不是與他們兩個。

我只是想在窗口周圍播放不同的圖形。 (總是使用sdl2)。

這裏是我的代碼:

在window.h:

class Window 
{ 
public: 
SDL_Window *window1; 
int background,windowWidth,windowHeight,windowXcoord,windowYcoord; 
SDL_Renderer * renderer; 
SDL_Renderer * renderer2; 
Window(); 
}; 

void refresh(); 
extern Window w1; 

window.cpp:

Window w1; 
Window::Window() 
{ 
window1=nullptr; 
background = 0xffffff; 
windowWidth=700;  windowHeight=500; 
windowXcoord = 650; windowYcoord = 0; 

this->window1 = 
SDL_CreateWindow("Window",windowXcoord,windowYcoord, 
windowWidth,windowHeight, SDL_WINDOW_SHOWN); 
    this->renderer = SDL_CreateRenderer(this->window1, -1 , 
SDL_RENDERER_ACCELERATED); 

SDL_SetRenderDrawColor(this->renderer, 255, 255, 255, 255); 
SDL_RenderClear(this->renderer); 
SDL_RenderPresent(this->renderer); 
} 

// this function is called everytime an object or function want to "refresh" the window. 

void refresh(){ 

// clearing the window 
    SDL_SetRenderDrawColor(w1.renderer, 255, 255, 255,0); 
    SDL_RenderClear(w1.renderer); 

// r1, the first Rects object to animate. 
    SDL_SetRenderDrawColor(w1.renderer,255,0,0,255); 
    SDL_RenderFillRect(w1.renderer, &r1.rect); 

// r2, the second Rects. 
    SDL_SetRenderDrawColor(w1.renderer,255,0,255,255); 
    SDL_RenderFillRect(w1.renderer, &r2.rect); 
    SDL_RenderPresent(w1.renderer); 
} 

rects.h:

class Rects 
{ 
public: 
SDL_Rect rect; 

Rects(); 
}; 
extern Rects r1, r2; 

void moveR1(); 
void moveR2(); 

rects.cpp:

Rects::Rects() 
{ } 
Rects r1,r2; 

// moveR1 and moveR2, (just some dumm animations-example) 
void moveR1(){ 
r1.rect.x=400; r1.rect.y=100; 
r1.rect.w =40; r1.rect.h =10; 
SDL_SetRenderDrawColor(w1.renderer,255,0,0,255); 
SDL_RenderFillRect(w1.renderer, &r1.rect); 
{ 
for (int u = 1; u<=5;u++){ 
r1.rect.x=200; r1.rect.y=100; 
r1.rect.w =50; r1.rect.h =50; 
refresh(); 
for (int i = 1; i <=200; i++){ 

r1.rect.x-=1; 
usleep (7000); 
refresh(); 
} 
} 
} 
} 
void moveR2(){ 
    r2.rect.x=200; r2.rect.y=100; 
    r2.rect.w =40; r2.rect.h =10; 
    SDL_SetRenderDrawColor(w1.renderer,255,255,0,255); 
    SDL_RenderFillRect(w1.renderer, &r2.rect); 
    { 
    for (int u = 1; u<=5;u++){ 
      check 
      r2.rect.x=200; r2.rect.y=100; 
      r2.rect.w =50; r2.rect.h =50; 
      refresh(); 
      for (int i = 1; i <=200; i++){ 

       r2.rect.x+=1; r2.rect.y+=1; 
       usleep (7000); 
       refresh(); 
       } 
     } 
    } 
} 

和主:

int main() 
{ 
    thread t1(moveR1); 
    t1.detach(); 

    thread t2(moveR2); 
    t2.detach(); 

    // sleep instead of showing a loop. 

    sleep (10); 

    return 0; 
} 

任何禮貌的幫助是值得歡迎的,這裏IM學習。

回答

0
// thanks to skypjack, i am able to solve the problem 
// HOW TO PRESENT TWO (OR MORE) GRAPHICS WITH SDL_RENDERER WITHOUT USING THREADS. 
// The two rectangle animation are just and example. 
// It could be whatever we want to show. 
// In this case, just two rectangles moving around. 
#include <unistd.h> 
#include <SDL.h> 
using namespace std; 

SDL_Window *window1; 
int background, windowWidth, windowHeight,windowXcoord, 
windowYcoord; 

SDL_Rect rectangle1; 
SDL_Rect rectangle2; 
SDL_Renderer *renderer; 
int sequence1; 
int sequence2; 
void moveRectangle1(), moveRectangle2(); 

int main() 
{ 
    window1=nullptr; 
    background = 0xffffff; 
    windowWidth=700;  windowHeight=500; 
    windowXcoord = 650; windowYcoord = 0; 
    window1 = SDL_CreateWindow("Main 
    Window",windowXcoord,windowYcoord, windowWidth,windowHeight, 
SDL_WINDOW_SHOWN); 
    renderer = SDL_CreateRenderer(window1, -1 , 
SDL_RENDERER_ACCELERATED); 

    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); 
    SDL_RenderClear(renderer); 
    SDL_RenderPresent(renderer); 

    rectangle1.x = 100; rectangle1.y = 100; rectangle1.h = 40; 
rectangle1.w = 40; 
    rectangle2.x = 100; rectangle2.y = 100; rectangle2.h = 40; 
rectangle2.w = 40; 

    for (int i = 1;i<500;i++){ 
       SDL_SetRenderDrawColor(renderer, 255, 255, 255,0); 
       SDL_RenderClear(renderer); 
       // chequear return (cerrar programa) 
       moveRectangle1(); 
       moveRectangle2(); 
       SDL_RenderPresent(renderer); 
       usleep (12000); 
     } 
    return 0; 
} 

void moveRectangle1(){ 
    sequence1++; 
    if (sequence1 <= 50){ rectangle1.x++; } 
    else if (sequence1 <= 100){ rectangle1.x--; } 
    else { sequence1 = 0; } 

    SDL_SetRenderDrawColor(renderer,255,0,0,255); 
    SDL_RenderFillRect(renderer, &rectangle1); 

} 
void moveRectangle2(){ 
    sequence2++; 
    if (sequence2 <= 100){ rectangle2.y++; } 
    else if (sequence2 <= 200){ rectangle2.y--; } 
    else { sequence2 = 0; } 

    SDL_SetRenderDrawColor(renderer,0,200,0,255); 
    SDL_RenderFillRect(renderer, &rectangle2); 
} 
1

當我只用其中一個線程運行一切就OK了。但不是與他們兩個。

按照documentation2D加速渲染(也稱爲SDL_render.h,在其它方面,其中SDL_RenderPresent生命的地方):

此API不旨在從多線程使用詳情請參閱SDL bug #1995

你很快就無法做到這一點。通過查看錯誤的描述,它看起來像UB,並且錯誤的鏈接可能會給你所有的細節。

我只是想在窗口周圍播放不同的圖形。

你不需要使用兩個線程來做到這一點。
您可以更新位置,動畫和圖形所需的任何內容,並從同一個線程顯示它們。沒有什麼能夠阻止你在調用SDL_RenderPresent之前多次調用相同的函數(例如SDL_RenderCopy)。
如果您需要每個圖形的線程,那麼視頻中有數千個多邊形的遊戲呢?

+0

沒事!我明白了,我會嘗試沒有線程。謝謝你skypjack。 –

+0

skypjack,我發佈了一個解決方案的靈感來自你教給我的答案。再次感謝。 –

相關問題