2017-04-12 2 views
-1

Je crée un jeu où vous pouvez déplacer un point le long de l'axe des x au milieu de l'écran et il y aura des éléments tombant du haut que vous aurez besoin d'essayer et d'esquiver, clairement pour cela j'ai besoin d'une forme de la détection de collision, que j'ai implémentée et qui semble fonctionner correctement. Mon problème est que lorsque le personnage (point) s'est déplacé vers l'objet et que la collision s'est produite, vous n'êtes plus capable de déplacer le personnage, il reste simplement dans une position fixe. Cela ne se produit pas lorsque le personnage entre en collision avec les bords de la fenêtre, mais comme vous le verrez ci-dessous, la collision de la fenêtre et la collision d'objet ont le même code à exécuter.Après avoir détecté une collision entre mon personnage et un objet, le personnage ne peut plus bouger?

boucle de jeu principal:

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 

Déplacer et fonctions Collision:

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

Comme il y aura quelques éléments qui tombent du haut de l'écran, je l'ai mis en place une liste chaînée pour ceux , d'où la fonction de récursion sur la collision. Si quelqu'un a une idée sur pourquoi le personnage ne bouge pas après une collision, je serai très reconnaissant.

Répondre

0

Ma conjecture: votre méthode collision(c, scene) examine les collisions pour l'étape actuelle. Dans ce cas, votre instruction if dans la fonction 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; 
} 

le joueur ne peut pas se déplacer après qu'elle est entré en collision avec un objet. La solution est de vérifier avant collision vous prenez l'étape:

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

Alors voulez-vous dire que je devrais lancer la fonction de déplacement avant la file d'attente? – JLW

+0

@JLW Je ne suis pas sûr de ce que cela signifie. Ma suggestion est de vérifier et de voir si votre prochaine position est une position autorisée, pas de vérifier si votre position actuelle est autorisée ou non. Si vous avez des corps de collision en mouvement, vous devrez cependant faire quelques modifications supplémentaires. – pingul

+0

Ah ok oui je comprends ce que tu veux dire maintenant. Je vais essayer dans un jour ou deux, merci pour l'aide, vous permettra de savoir si cela a résolu les choses! Merci! – JLW