2015-10-13 35 views
1

我正在做一个pong游戏,lPad是左垫和rPad是正确的垫,但我有一个问题,当任何垫向上移动,当我释放向上按钮,并按下垫停止一个而再出现故障,另一件事是按两个控件(仅移动)在此设置时,无法移动这两个垫:SDL僵硬的运动

if(e.type == SDL_KEYDOWN) { 
        switch(e.key.keysym.sym) { 

        case SDLK_s: 
         lPad.y += 8; 
         if(lPad.y >= s.SCREEN_HEIGHT - lPad.getHeight()) { 
          lPad.y = s.SCREEN_HEIGHT - lPad.getHeight(); 
         } 
         break; 

         case SDLK_w: 
         lPad.y -= 8; 
         if(lPad.y <= 0) { 
          lPad.y = 0; 
         } 
         break; 

         case SDLK_DOWN: 
         rPad.y += 8; 
         if(rPad.y >= s.SCREEN_HEIGHT - rPad.getHeight()) { 
          rPad.y = s.SCREEN_HEIGHT - rPad.getHeight(); 
         } 
         break; 

         case SDLK_UP: 
         rPad.y -= 8; 
         if(rPad.y <= 0) { 
          rPad.y = 0; 
         } 
         break; 

         default: 
         break; 
        } 
       } 

任何想法如何解决这一问题,并使其光滑?

+0

@zenith你是什么意思? –

+1

认为他意味着更多的标签和你的代码 - 事实上你所有的问题 - 将毫不费力地离开屏幕的右侧... –

回答

1

最好使用SDL_GetKeyboardState(NULL)作为获取输入的函数。这样,您可以同时获得键盘的整个状态,从而可以进行并行输入。如果使用while循环,则每个事件都会被单独捕获,从而变得不连贯。

下面是关于如何使用它的一些示例代码:

const auto * keys = SDL_GetKeyboardState(NULL); 

    while(!done) { 
    while(SDL_PollEvent(&e)) { 
     if(e.type == SDL_QUIT) { 
     done = true; 
     }  
    } 

    SDL_PumpEvents(); 

    if (keys[SDL_SCANCODE_UP]) { 
     p1.set_speed(0, -60000 * delta.count()); 
    } 
    if (keys[SDL_SCANCODE_DOWN]) { 
     p1.set_speed(0, 60000 * delta.count()); 
    } 
    if (keys[SDL_SCANCODE_LEFT]) { 
     p1.set_speed(-60000 * delta.count(), 0); 
    } 
    if (keys[SDL_SCANCODE_RIGHT]) { 
     p1.set_speed(60000 * delta.count(), 0); 
    } 

另外,可能我建议有一个速度变量?使用像素不是缩放移动的好方法,因为它取决于屏幕的分辨率。使用基于时间步长的东西更加健壮。

+0

你能告诉我set_speed()应该如何工作吗? 什么是三角洲? –