2017-04-12 13 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

ああ、はい、私はあなたが今何を意味するかを取得します。私は1日か2日でそれを与えます、助けをありがとう、それが事を解決すればあなたに知らせる!ありがとう! – JLW

関連する問題