J'ai commencé la SFML depuis peu et j'apprends avec la documentation officielle, et j'ai un problème : j'ai un programme qui affiche un joueur que l'on peux déplacer avec Z Q S et D, le seul problème étant que le mouvement est saccadé (Comme lorsqu'on laisse une touche appuyé sur un éditeur de texte). Voici le programme :
#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <SFML/Audio.hpp>
#include <math.h>
#include <iostream>
#include <cstdlib>
using namespace sf;
int main()
{
//---FENÊTRE---\\
RenderWindow rWindow(VideoMode(900,700,64),"The CB",Style::Resize);
Texture texture;
//---SPR PLAYER---\\
if(!texture.loadFromFile("Player.png"))
return EXIT_FAILURE;
Sprite sprPlayer(texture);
rWindow.draw(sprPlayer);
//---VARIABLES___\\
float playerX=450;
float playerY=350;
Time y;
Time t=milliseconds(10);
sprPlayer.setPosition(playerX,playerY);
Event event;
while(rWindow.isOpen())
{
rWindow.pollEvent(event);
switch(event.type)
{
//---TOUCHES CLAVIER---\\
case Event::KeyPressed:
switch (event.key.code)
{
case Keyboard::Z:
playerY-=2;
std::cout<<"Z"<<std::endl;
break;
case Keyboard::Q:
playerX-=2;
std::cout<<"Q"<<std::endl;
break;
case Keyboard::S:
playerY+=2;
std::cout<<"S"<<std::endl;
break;
case Keyboard::D:
playerX+=2;
std::cout<<"D"<<std::endl;
break;
}
break;
}
sleep(t);
rWindow.clear();
sprPlayer.setPosition(playerX,playerY);
rWindow.draw(sprPlayer);
rWindow.display();
}
return EXIT_SUCCESS;
}
Oui c'est parce qu'il faut garder l'état des touches en mémoire en dehors de la boucle d'events et effectuer le mouvement dans la partie update du code.
Sinon plusieurs choses :
je te déconseille d'utiliser la directive using namespace sf au risque d'avoir des suprises
le sleep(t) est complètement inutile ici et il ralentit le programme pour rien
set la position du jouer pendant le draw c'est pas cool
pour des déplacement uniforme au temps d'éxecution, il faut mulitplier la vitesse par le temps d'exécution d'une frame (enfin ça c'est un minimum vital, il y a des techniques plus complexe et plus sûr)
Coucou, merci pour la réponse qui (du moins, si le reste du code suit) fonctionne, mais voilà : je ne voulais pas recopier le code car je ne connaissais pas certaine notions (en cas de pépins je serais perdu sinon ^^'), alors j'ai fait ceci en me basant GRANDEMENT sur ton code mais il reste un problème, rien ne s'affiche :/
En fait si, il y a un affichage mais si on regarde attentivement ton code, on voit que même si une touche n'est pas appuyée, le personnage avance (très très vite) et du coup il sort de l'écran à peine la fenêtre lancée.
Dans un premier temps, les booléens représentant l'état des touches sont mals initialisés, prend l'habitude d'initialiser une variable par ligne :
À la place des tes 2 variables xBis et yBis, suffit d'initialiser 2 variables x et y représentant la distance de déplacement juste avant de calculer celle-ci selon la touche appuyée.
Pourtant même en aillant suivit tes instructions (à savoir : retirer xBis et yBis, copier les conditions pour les touches pressées, et initialisé correctement mes variables), l'affichage reste noir, là par contre je suis perdu, si tu lance le programme sur ton PC, tu as un résultats?
Oui là c'est parce que tu as inversé l'ordre des opérations au niveau du draw, dans l'ordre c'est :
clear
draw
display
Dans tons code tu as placé le clear() après le draw() donc forcément on se retrouve avec une fenêtre vide ^^.
Autre chose, j'me fait hurler dessus par mon compilo à cause de la forme de tes commentaires, un conseil évite de mettre des antislash en fin de ligne commentée.
Dernière petite chose, ça :
pressZ=true;std::cout<<"Z PRESS"<<std::endl;
On évite ! Une instruction par ligne maximum. Là tu en as 2.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
...
...
...
...
...