在检测到我的角色和物体之间的碰撞后,角色再也无法移动了?

时间:2017-04-12 09:34:04

标签: c sdl game-physics sdl-2

我正在创建一个游戏,您可以在屏幕中间沿x轴移动一个点,并且会有从顶部掉落的元素,您需要尝试躲闪,显然我需要一些形式碰撞检测,我已经实现,它似乎工作正常。

我的问题是,当角色(点)移向物体并发生碰撞时,你不再能够移动角色,它只是停留在一个固定的位置。当角色与窗口边缘碰撞时不会发生这种情况,但正如您将在下面看到的那样,窗口碰撞和对象碰撞都有相同的代码可以运行。

主游戏循环:

  while(running) {

    // Queue of the events happening
    while(SDL_PollEvent(&event)) {
      if(event.type == SDL_QUIT) {
        running = false;
      }
      else if(event.type == SDL_KEYDOWN && event.key.repeat == 0) {
        switch(event.key.keysym.sym) {
          case SDLK_UP:
            //sprite->yVel -= VELOCITY;
            break;
          case SDLK_DOWN:
            //sprite->yVel += VELOCITY;
            break;
          case SDLK_LEFT:
            sprite->xVel -= VELOCITY;
            break;
          case SDLK_RIGHT:
            sprite->xVel += VELOCITY;
            break;
        }
     }
     else if(event.type == SDL_KEYUP && event.key.repeat == 0) {
       switch(event.key.keysym.sym) {
         case SDLK_UP:
           //sprite->yVel += VELOCITY;
           break;
         case SDLK_DOWN:
           //sprite->yVel -= VELOCITY;
           break;
         case SDLK_LEFT:
           sprite->xVel += VELOCITY;
           break;
         case SDLK_RIGHT:
           sprite->xVel -= VELOCITY;
           break;
       }
     }
   } // Poll event loop

   float timeStep = getTicks(ticks) / (float) 1000;
   move(sprite, timeStep, WINDOW_WIDTH, WINDOW_HEIGHT, head);

   startTimer(ticks);

   // Clear window then draw image
   SDL_RenderClear(rend);
   SDL_RenderCopy(rend, background->element, NULL, NULL);
   SDL_RenderCopy(rend, sofa->element, NULL, &sofa->dest);

   setPosition(sprite, sprite->xPos, sprite->yPos);
   SDL_RenderCopy(rend, sprite->element, NULL, &sprite->dest);

   SDL_RenderPresent(rend);
   capFrameRate(timeStep);
} // Main game loop

移动和碰撞功能:

void move(Character *c, float timeStep, const int WIDTH, const int HEIGHT, Scene *scene) {
  c->xPos += c->xVel * timeStep;

  // Collision check for the walls
  if(((c->xPos < 0) || (c->xPos + c->dest.w > WIDTH)) || (collision(c, scene))) {
    c->xPos -= c->xVel * timeStep;
  }
}

bool collision(Character *character, Scene *scene) {
  if(SDL_HasIntersection(&character->dest, &scene->element->dest)) {
    return true;
  }
  else {
    if(scene->nextElement == NULL) {
      return false;
    }
    else {
      collision(character, scene->nextElement);
    }
  }
  return false;
}

由于屏幕顶部会有一些元素掉落,我为这些元素实现了一个链接列表,因此为什么会在碰撞函数上进行递归。如果有人知道为什么角色在碰撞后不动,我将非常感激。

1 个答案:

答案 0 :(得分:0)

我的猜测:您的collision(c, scene)方法会查看当前时间步的冲突。在这种情况下,move函数

中的if语句
                                                      //  \/ This here is the problem -- if you're currently colliding with an object you don't allow any movement, even if you're moving out of the object  
if(((c->xPos < 0) || (c->xPos + c->dest.w > WIDTH)) || (collision(c, scene))) {
    c->xPos -= c->xVel * timeStep;
}

玩家在与物体相撞后不允许移动。解决方案是在采取步骤之前检查碰撞

float newX = c->xPos + c->xVel*timeStep;
float newY = ...;
if (!collision(newX, newY, scene)) {
    c->xPos = newX;
    ...
}