2016-01-12 120 views
0

我正在嘗試創建一個較小的遊戲,並且我需要在窗口內從左到右移動一個矩形。請注意,這不是完整的代碼。下面是創建的窗口類和它的運行函數的一個片段。SDL C++自動移動一個矩形

我可以繪製矩形,此刻它也在移動。但是,當我按下上/下時,它也會向右移動,但我希望它自動執行。如果我移動while(我認爲它應該...?)之外的for-loop調用movement(),矩形就會消失。

要注意的另一件事是移動應該通過向量pcEnhet調用,因爲我將在稍後使用它與其他精靈。

void Spelplan::run() { 

    SDL_RenderClear(render); 
    for (PCKomponent* k : pcEnhet) 
     k->draw(); 
    SDL_RenderPresent(render); 

    bool spela = true; 
    while (spela) { 
     SDL_Event eve; 

     while (SDL_PollEvent(&eve)) { 
      switch (eve.type) { 
      case SDL_QUIT: 
       spela = false; 
       break; 
      case SDL_KEYDOWN: 
       switch (eve.key.keysym.sym) { 
       case SDLK_DOWN: 
        for (PCKomponent* k : pcEnhet) 
         k->knappNer(eve); 
        break; 
       case SDLK_UP: 
        for (PCKomponent* k : pcEnhet) 
         k->knappUpp(eve); 
        break; 
       }//keysym switch 

       SDL_RenderClear(render); 
       for (PCKomponent* k : pcEnhet) 
        k->draw(); 
       SDL_RenderPresent(render); 
      }//eve.type switch 
      for (PCKomponent* k : pcEnhet) { 
       k->movement(); 
       k->draw(); 
      } 
     }//while SDL_Poll 

    }//while spela 

} 

void Spelare::movement() { 
    area.x++; 
} 
void Spelare::draw() { 

    SDL_RenderCopy(sp->getPlan(), spelareTexture, NULL, &area); 
} 

回答

0

不做渲染,while (SDL_PollEvent(&eve)),但在while (spela)。您的項目必須移動/繪製,而不取決於輸入是否正在註冊。

while (SDL_PollEvent(&eve)) { 
... 
} 

SDL_RenderClear(render); 

for (PCKomponent* k : pcEnhet) { 
    k->movement(); 
    k->draw(); 
} 

SDL_RenderPresent(render); 

刪除「預渲染」代碼,你有上面的bool spela = true;線,並記住您的活動循環類似於這樣從現在開始。

請注意,並非移動所有對象,您可以將它們視爲靜止並移動相機(視口),然後使用該相機計算其draw函數中對象的絕對座標。

而且還挑一個從兩個:

spela = false; // will render one last frame 
break;   //^will not, and does not require spela variable at all