Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Déplacement d'un sprite saccadé  (Lu 2305 fois)

0 Membres et 1 Invité sur ce sujet

helio

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Déplacement d'un sprite saccadé
« le: Septembre 03, 2014, 02:28:21 pm »
Bonjour à tous,

Je débute avec SFML et malgré les problèmes déjà évoqués par certains sur ce forum ou ailleurs, ils ne me permettent pas de régler mes soucis.
en effet je démarre un petit projet et pour l'instant je me base sur le programme PONG suivant :
https://github.com/SFML/SFML/blob/master/examples/pong/Pong.cpp

J'ai donc pour l'instant suivi un peu le même principe pour mon programme dont voici le code :

#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
#include <iostream>
#include <cstdlib>
#include <ctime>

// Here is a small helper for you ! Have a look.
// #include "ResourcePath.hpp"

#define gameWidth 800
#define gameHeight 640

#define LARGEUR_TILE 32  /// hauteur et largeur des tiles.
#define HAUTEUR_TILE 32

#define NOMBRE_BLOCS_LARGEUR 25  /// nombre a afficher en x et y
#define NOMBRE_BLOCS_HAUTEUR 20

int table[20][25] = {
    {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
    {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
    {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
    {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
    {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
    {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
    {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
    {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
    {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
    {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
    {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
    {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
    {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
    {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
    {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
    {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};

bool mIsMovingUp;
bool mIsMovingDown;

using namespace sf;

void Afficher(sf::RenderTarget &App, sf::Texture & tileset, int table[20][25],int nombre_blocs_largeur,int nombre_blocs_hauteur)
{
    sf::Sprite Rect_source;
   
    Rect_source.setTexture(tileset);
    for (int i=0;i<nombre_blocs_largeur;i++)
    {
        for (int j = 0; j<nombre_blocs_hauteur; j++)
        {
            // Rect_source.setTextureRect(sf::IntRect(table[j][i] * LARGEUR_TILE, 0, table[i][j] * LARGEUR_TILE + LARGEUR_TILE, HAUTEUR_TILE));
            Rect_source.setTextureRect(sf::IntRect((table[j][i]) * LARGEUR_TILE, 0, (table[i][j]) * LARGEUR_TILE + LARGEUR_TILE, HAUTEUR_TILE));
            Rect_source.setPosition(i * LARGEUR_TILE, j * HAUTEUR_TILE);
            App.draw(Rect_source);
        }
    }
}

int main()
{

    sf::Vector2f spriteSize (65, 72);
       
    sf::Font font;
    if (!font.loadFromFile("Sansation_Regular.ttf"))
        return EXIT_FAILURE;
   
    sf::Text pauseMessage;
    pauseMessage.setFont(font);
    pauseMessage.setCharacterSize(30);
    pauseMessage.setPosition(150.f, 250.f);
    pauseMessage.setColor(sf::Color::White);
    pauseMessage.setString("Welcome to SFML Game!\nPress space to start the game");
   
    // sf::RenderWindow app(sf::VideoMode(LARGEUR_TILE*NOMBRE_BLOCS_LARGEUR, HAUTEUR_TILE*NOMBRE_BLOCS_HAUTEUR, 32), "Tile Mapping - Test");
    sf::RenderWindow app(sf::VideoMode(800,640,32), "Démo");
    app.setVerticalSyncEnabled(true);
   
    sf::Texture tileset;
    tileset.loadFromFile("tileset1.bmp");
   
    sf::Texture xwing1;
    xwing1.loadFromFile("x_wing.png");
   
    sf::Sprite xwing;
    xwing.setTexture(xwing1);
        xwing.setOrigin(spriteSize / 2.f);

        sf::RectangleShape rectangle1(sf::Vector2f(65,72));
        // rectangle1.setOutlineThickness(3);
        // rectangle1.setPosition(10.f, 152.f);
        rectangle1.setFillColor(sf::Color::White);
        rectangle1.setOrigin(spriteSize / 2.f);    
   
   
    const float xwingSpeed = 200.f;

    sf::Clock clock;
    bool isPlaying = false;
    while (app.isOpen())
    {
        sf::Event event;
        while (app.pollEvent(event))
        {
            if ((event.type == sf::Event::Closed) ||
                ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape)))
            {
                app.close();
                break;
            }
           
            if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Space))
            {
                if (!isPlaying)
                {
                    // (re)start the game
                    isPlaying = true;
                    clock.restart();
                   
                    // xwing.setPosition((gameWidth / 2), gameHeight-200);
                                        rectangle1.setPosition((gameWidth / 2), gameHeight-200);
                }
            }
           
            if (isPlaying)
            {
                float deltaTime = clock.restart().asSeconds();
               
                if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up) &&
                    // (xwing.getPosition().y - spriteSize.y / 2 > 5.f))
                                                (rectangle1.getPosition().y - spriteSize.y / 2 > 5.f))
                {
                   
                    // xwing.move(0.f, -15.f);
                                        rectangle1.move(0.f, -xwingSpeed * deltaTime);
                }
                if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down) &&
                    // (xwing.getPosition().y + spriteSize.y / 2 < gameHeight - 5.f))
                                                (rectangle1.getPosition().y + spriteSize.y / 2 < gameHeight - 5.f))
                {
                   
                    // xwing.move(0.f, 15.f);
                                        rectangle1.move(0.f, xwingSpeed * deltaTime);
                }
               
            }            
        }
       
        app.clear();
        // Afficher(app, tileset, table, NOMBRE_BLOCS_LARGEUR, NOMBRE_BLOCS_HAUTEUR);
        if (isPlaying)
        {  
            // app.draw(xwing);
            app.draw(rectangle1);
        }
        else
        {
            app.draw(pauseMessage);
        }
        // update(xwing);
        app.display();
    }
   
    return EXIT_SUCCESS;
}

Que ce soit le sprite xwing ou rectangle1, le mouvement est saccadé.
Juste après l'appui sur la touche haut par exemple, le déplacement se fait de 40px environ et ensuite de 5 en 5 environ!
je ne comprends d'où cela peut venir!
j'ai le même problème sur les environnements Windows (core i5, intel HD Graphics 3000) et Mac (core i7, Intel Iris Pro Graphics).

Merci de votre aide.
« Modifié: Septembre 03, 2014, 03:12:27 pm par helio »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Déplacement d'un sprite saccadé
« Réponse #1 le: Septembre 03, 2014, 02:38:34 pm »
Dans l'exemple if (isPlaying) est en dehors de la boucle d'évènement. Dans ton code non, donc cette partie du code n'est effectuée que quand un évènement se déclenche.

helio

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Déplacement d'un sprite saccadé
« Réponse #2 le: Septembre 03, 2014, 02:58:28 pm »
ah oui effectivement  !!
merci.

En revanche j'en profite pour parler d'un autre souci sur le même programme qui ne me bloque pas pour continuer mais qui est gênant!
J'ai quelquefois l'arrière plan réalisé à l'aide de la technique tile mapping qui est mal représenté au niveau du côté droit ! je mets une copie d'écran.

Encore merci.


« Modifié: Septembre 03, 2014, 04:07:14 pm par helio »

helio

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Déplacement d'un sprite saccadé
« Réponse #3 le: Novembre 26, 2014, 09:52:39 am »
Bonjour à tous,
Personne a une idée ?
Merci.

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Déplacement d'un sprite saccadé
« Réponse #4 le: Novembre 26, 2014, 10:58:53 am »
Pour ma part ton problème est trop vague, la capture d'écran est minuscule et on ne sait pas trop ce qu'on est censé regarder. Puis faudrait le code actuel.
Donc à priori non pas d'idée. ;)
« Modifié: Novembre 26, 2014, 01:44:07 pm par G. »