2017-04-12 7 views
-1

화면 가운데에서 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; 
} 

나는 사람들을 위해 링크 된 목록을 구현했습니다 따라서 충돌 함수에 대한 재귀가 왜 필요합니다. 충돌 후 캐릭터가 왜 움직이지 않는지에 대한 생각이 있다면 나는 매우 감사 할 것입니다.

답변

0

내 생각 엔 collision(c, scene) 메서드는 현재 시간 간격에 대해 의 충돌을 찾습니다. 이 경우, move 기능

             // \/ 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; 
} 

플레이어에서 if 문은 그녀가 물체와 충돌 한 후 이동할 수 없습니다. 이 솔루션을 사용하면 단계 걸릴 전에 충돌 를 확인하는 것입니다

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

을 그래서 당신은 내가 이벤트 큐 전에 이동 기능을 시작해야 의미합니까? – JLW

+0

@JLW 그게 무슨 뜻인지 모르겠습니다. 내 제안은 _check하고 다음 위치가 허용 된 위치인지 확인하는 것입니다. 현재 위치가 허용되는지 여부는 확인하지 않습니다. 충돌 시체가 움직이는 경우 추가 수정을해야합니다. – pingul

+0

아 좋아, 네가 지금 무슨 뜻인지 알 겠어. 하루나 이틀 만에 도움을 주겠다. 도움이된다면 해결할 수있을 것이다. 감사! – JLW