2016-01-12 79 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