La méthode d'hyru est déjà réussie en tout cas, merci
double v_x = 1.5;
double v_grav = 0.08;
double v_saut = -4;
double v_y = v_saut;
Dans le cas où j'appuie sur la touche :
positionperso.x += v_x;
positionperso.y += v_y;
v_y += v_saut;
v_y += v_grav;
Ici qu'est-ce qui serait la variable horizontal ? Qu'est-ce que j'dois mettre à = 1 ? ![]()
J'ai pas compris ta question...
Un truc que tu n'a pas l'air d'avoir saisi, c'est que dans le cas ou t'appuie sur la touche il ne doit y avoir QUE v_y = v_saut et pas le reste, le reste doit être en dehors de la gestion des événement sinon la position ne sera pas mise à jour à chaque frames.
Bon, j'ai beaucoup lu la page deux, après des dizaines de notes pour bien comprendre, j'en arrive à ça :
http://pastebin.com/acwPPhYN
Ce que je veux ici, c'est juste gérer le déplacement.. Le carré ne se déplace que si la souris bouge et que j'ai avant appuyé sur SDLK_RIGHT ![]()
Ah ben c'est trouvé, c'était SDL_WaitEvent qui bloquait tout simplement ![]()
http://pastebin.com/eKpUzhXs
Sinon ici, même en ayant fait ce que Pocolo m'a proposé, lorsque j'arrête d'appuyer sur SDL_KEYDOWN le carré ne s'arrête pas..
Ah c'est beaucoup mieux ça!
Remarques:
1
ton PollEvent et ton switch event.type devraient être places AVANT le code correspondant au déplacement du personnages, c'est logique après tout, souviens-toi que l'ordinateur exécute les actions une à une dans l'ordre qu'elles sont écrites de haut en bas et de gauche à droite. Maintenant si on considère un jeu 2D très basique on aurait grossièrement l'ordre d'actions qui suit:
- Input (les touches sur lesquelles appuie l'utilisateur en gros).
- Déplacement, il est logique de déplacer le personnage seulement après l'input, vu que ce sont les touches sur lesquelles appuie le joueur qui vont déterminer le mouvement du personnage.
- Collision, après le déplacement puisque pour voir si il y a collision il faut que les rectangles aient bouge, si on le fait avant il se peut que deux rectangles qui ne se touchaient pas se touchent une fois que les rectangles ont change de position.
- Dessiner l'image à l’écran, une fois qu'on a les coordonnées définitives on peut enfin dessiner le tout à l’écran.
2
Concernant ta remarque "lorsque j'arrête d'appuyer sur SDL_KEYDOWN le carré ne s'arrête pas.. ".
- Déjà de la façon dont tu t'y prends tu peux oublier la variable "horizontal" elle ne servira finalement pas a grand chose (c’était plutôt si tu avais envie de simuler des forces, en gros augmenter/diminuer progressivement la vitesse du perso) donc on va l'oublier pour l'instant et se focaliser sur tes variables v_x et v_y, ça sera plus simple dans un premier temps. Donc change ton "case SDL_KEYDOWN:" en ça:
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_RIGHT: v_x = 1; break;
case SDLK_LEFT: v_y = -1; break;
}
break; //a noter que j'ai rajouté un break ici, c'est nécessaire.
Et tu peux carrément enlever les deux conditions if avec "horizontal", en revanche laisse "positioncarre.x += v_x;" et "positioncarre.y += v_y;".
- Donc maintenant imaginons que tu appuie sur la flèche droite de ton clavier, la SDL va détecter que la touche est passée du statut "non-appuyée" à "appuyée" et va donc la variable v_x à 1 (et c'est tout ce qui est fait, après tu peux laisser ton doigt sur la touche ou l'enlever, ça ne va rien changer) et le personnage va bouger vers la droite puisque ""positioncarre.x += v_x;".
C'est là que SDL_KEYUP entre en jeu, il faut dire au programme que si on lâche la touche, on veut que le personnage s’arrête. Dans ton code il ne s’arrête pas car tu laisses la variable v_x à 1, tu ne la remets jamais a 0. Il faudrait donc rajouter ceci dans ton switch event.type:
case SDL_KEYUP:
switch(event.key.keysym.sym)
{
case SDLK_RIGHT: (if v_x == 1) v_x = 0; break;
case SDLK_LEFT: (if v_x == -1) v_x = 0; break;
}
break;
On remets la variable à 0 si la touche passe du statut "appuyée" à "non-appuyée", donc maintenant si tu enlèves ton doigt de la touche ça fait bien une différence.
A noter que les conditions "(if v_x == 1)" et "(if v_x == -1)" sont juste la pour vérifier si le personnage va bien vers la droite lorsque l'on lâche la flèche droite et pareil pour la gauche, ce n'est pas indispensable mais sans ca le joueur pourrait être en train d'aller vers la droite et appuyer sur la flèche gauche sans avoir lâche la flèche droite, dans ce cas sans la condition si il venait a lâcher la flèche droite, le personnage arrêterait de bouger même si il est en train de se déplacer vers la gauche, c'est peut-être un peu confus ce que je dis.
Désolé si il y à des fautes, j'ai écris ça vite fait et je n'ai pas trop le temps de relire.
Ah j'ai manifestement mal écrit les conditions dans le dernier bout de code, j'ai inclus le "if" dans les parenthèses, enfin, tu l'auras probablement remarqué.
Ah et autre petite chose (désolé du triple post), j'aimerais savoir quel est le but recherché avec le "SDL_Delay(5);" dans ton code, je sais ce que fais cette fonction (pauser le thread pour X millisecondes) mais je ne vois pas pourquoi tu as mis ça ici.
Super Pocolo, merci beaucoup de ton aide !
Dans ton 1, je dois donc mettre que le carre += v_x et v_y ?
J'ai enlevé toute la fonction horizontal. :oui J'ai fait tout ça surtout réussir la gestion des sauts, que je verra plus tard, mais je pense que je n'ai en pas besoin finalement
J'avais utilisé cette méthode avec KEYUP, j'avais même tenté une condition au début de la boucle et tout ![]()
Par contre au final, le mouvement n'est pas génial. Il se déplace comme je le souhaitais, lorsque j'appuie sur la droite alors que j'étais sur la gauche, ça s'arrête, et j'dois reprendre.
" lorsque j'appuie sur la droite alors que j'étais sur la gauche, ça s'arrête, et j'dois reprendre. "
Il ne devrait pas, montre-moi ton code actuel.
Sinon tu n'as pas répondu à la question concernant ton "SDL_Delay()".
Oui pardon ! Mhh, car la cadence était très élevée, j'ai juste mis ça pour que je vois mieux.. Peut-être que maintenant elle n'a plus d'intérêt ?
http://pastebin.com/5DcGL1p9
Et ça !
Tu as oublié des "break;" dans les case du switch de KEYUP, autrement tu n'as toujours pas mis l'input en premier comme je l'avais conseillé, il faut que:
positioncarre.x += v_x;
positioncarre.y += v_y;
Soit placé après tout ton switch event.type, c'est plus exact comme ça et dans certains cas c'est même crucial.
" Mhh, car la cadence était très élevée, j'ai juste mis ça pour que je vois mieux.. Peut-être que maintenant elle n'a plus d'intérêt ? "
D'accord. Libre a toi de la laisser, cela-dit si la cadence est trop élever c'est parce que tu n'as pas limité le framerate (et ton PC exécute le programme aussi vite qu'il le peut vu qu'il n'a pas de limite), un SDL_Delay() ou un Sleep() tout seul peut faire ça mais ce n'est pas la bonne solution étant donné que ça ne permet pas de contrôler exactement le nombre de frames, il faudra que tu vois les histoires de gestion du temps plus tard.
Ah oui le con !
Merci, j'aurais dû mieux me relire
Ok, c'est parfait, ça marche !
J'ai regardé pleins de trucs sur internet, et effectivement j'ai lu que SDL_Delay() n'était pas le plus optimisé. J'ai regardé un peu SDL_Ticks (dans l'genre), apparemment c'est ce qu'il faut.
J'te remercie en tout cas ! Je vais m'attaquer enfin aux sauts, mais avant.. la gestion de collision. Ça aussi c'est une autre histoire ![]()
" j'ai lu que SDL_Delay() n'était pas le plus optimisé. J'ai regardé un peu SDL_Ticks (dans l'genre), apparemment c'est ce qu'il faut. "
En fait il faudrait que tu utilises SDL_GetTicks() AVEC SDL_Delay(), je disais juste qu'utiliser SDL_Delay tout seul avec un chiffre fixe (5 dans ton cas) n'est pas bon, mais tu as encore le temps de voir tout ça, ça ne presse pas.
Saches juste qu'il faut que tu vois ça avant de distribuer tes projets à d'autres personnes car sans contrôle du framerate les ordis sur lesquels ton programme tournera le feront tous tourner aussi vite qu'ils le peuvent et vu que le processeur varie d'un PC à un autre la vitesse de ton jeu variera aussi.
Donc même si ton jeu a l'air de tourner a une vitesse convenable sur ton ordi (car tu auras régler les variables par rapport a la vitesse de ton PC), tu risques de le voir tourner en slow motion ou à vitesse lumière sur d'autres PC.
Ouais, je verrai ça.
Ok, merci pour l'info
Mon souci now : c'est la collision.. J'ai une belle ligne de gestion collision :
if(!(positioncarre.x + positioncarre.w <= positionmur.x
|| positioncarre.x >= positionmur.x + positionmur.w
|| positioncarre.y + positioncarre.h <= positionmur.y
|| positioncarre.y >= positionmur.y + positionmur.h))
Je ne sais pas où la placer. Si je dois la placer à plusieurs endroit, la complexifier, la simplifier etc..
poisitionmur est une nouvelle surface qui sera tout simplement l'obstacle !
J'ai abordé cela dans un de mes posts un peu plus haut, la détection de collisions doit se faire après avoir bougé les rectangles, tu ne la place qu'à un seul endroit.
J'y arrive pas
J'vois pas trop en fait, après mon switch event.type j'ai donc le déplacement de mes rectangles, mais je sais pas sous quelle forme la mettre
C'est bon
mon test de collision était incorrect, fallait additionner logiquement les positioncarre à leurs vitesses variables.
Bref, concluant tout ça.
Je reviendrai pour d'autres soucis. ![]()