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.
Alors voulez-vous dire que je devrais lancer la fonction de déplacement avant la file d'attente? – JLW
@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
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