2017-04-12 43 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我不確定這是什麼意思。我的建議是檢查你的下一個位置是否是允許的位置,而不是檢查你的當前位置是否允許。如果你有移動的碰撞體,你必須做一些額外的修改。 – pingul

+0

好的,我明白你的意思了。我會在一兩天內給出一個答案,謝謝你的幫助,會讓你知道它是否解決了問題!謝謝! – JLW