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

Auteur Sujet: [Résolu]Impossible de déplacer une sprite sur axe négatif  (Lu 3308 fois)

0 Membres et 1 Invité sur ce sujet

TZK

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
[Résolu]Impossible de déplacer une sprite sur axe négatif
« le: Juillet 23, 2013, 03:09:56 pm »
Salut à tous. Etant débutant avec la SFML, j'ai décidé de créer un petit PacMan-Like pour m'entrainer.
Pour le moment, je n'en suis qu'à la gestion des déplacement des entités.
Le problème c'est que je n'arrive pas à déplacer ma sprite en négatif(pour les déplacements vers la gauche et le haut).

Je poste mon code:
main.cpp
#include <iostream>
#include <SFML\Graphics.hpp>

#include "Entity.h"

using namespace sf;
using namespace std;

int main(int argc, char *argv[]){

        RenderWindow app(VideoMode(800,600, 32), "TEST");
        Entity player("sprite.png",Vector2i(21,538) ,Vector2i(14,14));

        app.setFramerateLimit(60);

        while(app.isOpen()){
               
                Event event;
                while(app.pollEvent(event)){
                        if(event.type == Event::Closed || Keyboard::isKeyPressed(Keyboard::Escape))
                                app.close();
                        player.move();
                }

                app.clear();
                app.draw(player.getSprite());
                app.display();

        }

        return 0;
}
 

Display.cpp
#include "Display.h"

using namespace sf;
using namespace std;

Display::Display(){}

Display::Display(string file, Vector2i pos, Vector2i size)
        :m_file(file), m_pos(pos), m_size(size){
                setSprite();
                m_tex.setSmooth(true);
}

Sprite Display::getSprite() const{
        return m_sprite;
}

void Display::setSprite(){

        if(!m_tex.loadFromFile(m_file, IntRect(m_pos.x, m_pos.y, m_size.x, m_size.y))){
                cout << "ERROR: The file " << m_file << " cannot be loaded !" << endl;
        }
        else
                m_sprite.setTexture(m_tex);

}

void Display::changeSprite(Vector2i pos){
        m_pos = pos;
        setSprite();
}

void Display::moveSprite(char dir){

        switch (dir){

                case 'U':{
                        m_sprite.move(0.0f, -m_size.x);
                }

                case 'D':{
                         m_sprite.move(0, m_size.y); // Y
                }

                case 'L':{
                         m_sprite.move(-m_size.x, 0); // -X
                }

                case 'R':{
                         m_sprite.move(m_size.x, 0); // X
                }

                default:
                        break;
        }

}
 

Display.h
#ifndef DISPLAY_H
#define DISPLAY_H

#include "includes.h"

class Display{

public:
        Display();
        Display(std::string file, sf::Vector2i pos, sf::Vector2i size);
        sf::Sprite getSprite() const;
        void setSprite();
        void changeSprite(sf::Vector2i pos);
        void moveSprite(char dir);


private:
        sf::Texture  m_tex;
        sf::Sprite       m_sprite;
        std::string  m_file; // Path to texture file.(jpg, png, gif)
        sf::Vector2i m_size; // Sprite size
        sf::Vector2i m_pos; // Sprite position on texture file
};

#endif
 

Entity.cpp
#include "Entity.h"


using namespace sf;

Entity::Entity(std::string file, Vector2i pos, Vector2i size){
        m_entity = new Display(file, pos, size);
}

Entity::~Entity(){
        delete m_entity;
}

void Entity::move(){

        if(Keyboard::isKeyPressed(Keyboard::Up)){
                m_entity->moveSprite('U');
                std::cout << "UP" << std::endl;
        }

        if(Keyboard::isKeyPressed(Keyboard::Down)){
                m_entity->moveSprite('D');
                std::cout << "DOWN" << std::endl;
        }

        if(Keyboard::isKeyPressed(Keyboard::Left)){
                m_entity->moveSprite('L');
                std::cout << "LEFT" << std::endl;
        }

        if(Keyboard::isKeyPressed(Keyboard::Right)){
                m_entity->moveSprite('R');
                std::cout << "RIGHT" << std::endl;
        }

}

sf::Sprite Entity::getSprite() const{
        return m_entity->getSprite();
}
 

Entity.h
#ifndef ENTITY_H
#define ENTITY_H

#include "includes.h"
#include "Display.h"

class Entity{

public:
        Entity(std::string file, sf::Vector2i pos, sf::Vector2i size);
        ~Entity();
        sf::Sprite getSprite() const;
        void move();

private:
        Display *m_entity;
};

#endif
 

Donc comme vous pouvez le voir, j'essaie de déplacer ma sprite avec une valeur négative(via la variable m_size.x) mais lorsque j’exécute le programme, rien ne se passe.
Je précise que si je passe une valeur numérique sans passer par une variable, la sprite se déplace.

Je ne comprends pas trop le problème.

Merci ;)
« Modifié: Juillet 23, 2013, 05:53:39 pm par TZK »

gostron

  • Jr. Member
  • **
  • Messages: 53
    • Voir le profil
Re : Impossible de déplacer une sprite sur axe négatif
« Réponse #1 le: Juillet 23, 2013, 03:24:00 pm »
Salut,

Tout d'abord je t'aurais conseille de reduire ton code au minimum pour comprendre d'ou vient le probleme plutot que d'essayer de trouver la solution dans ton code entierement construit (nous facilitant la tache a nous aussi si tu ne le trouves pas toi-meme) meme s'il n'est pas tres grand deja.

Ensuite, je suis pas sur de cibler le probleme entierement. Est-ce uniquements les deplacements negatifs ou bien est-ce qu'aucun deplacement ne s'effectue ?

En dehors de ces details, ce qui me gene un peu dans ton code c'est que tu envoies une copie de Sprite dans ta methode getSprite() car tu envoies l'objet directement (sans referencement ni adressage). Je te conseillerais de renvoyer une reference vers l'objet ou un pointer, mais d'eviter absolument de renvoyer un objet lourd directement. Ensuite, je me demandais pourquoi tu checkais l'etat du clavier dans la boucle de pollEvent(). En effet, si tu utilises l'etat du clavier il ne faut pas dependre du fait qu'il y ait eu un evenement, ca te donnerait des mouvements un peu anarchique en te faisant bouger a chaque fois qu'il y a un evenement quelconque (appui sur n'importe quelle touche, clic ou meme deplacement de la souris) et que la bonne touche se trouve etre appuyee. Tu devra probablement ou bien diminuer la frequence a laquelle tu regardes le clavier ou bien faire un timer pour eviter de bouger trop souvent.

A priori je vois pas trop d'autres soucis meme si je m'y suis pas penche tres longtemps. Bon courage et j'espere que tout ca aide

TZK

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Impossible de déplacer une sprite sur axe négatif
« Réponse #2 le: Juillet 23, 2013, 03:37:57 pm »
Tout d'abord, merci pour tes conseils. J'en tiens compte, je vais modifier ça :)
Par contre, pour les déplacements de la sprite, c'est effectivement que lorsque je veux effectuer un déplacement négatif. Dans ce cas là, rien ne se passe.
Par contre, si j'utilise move de cette façon ça marche,
m_sprite.move(0,-10);
mais pas
sprite.move(0, -m_size.x)

gostron

  • Jr. Member
  • **
  • Messages: 53
    • Voir le profil
Re : Impossible de déplacer une sprite sur axe négatif
« Réponse #3 le: Juillet 23, 2013, 04:30:41 pm »
as-tu verifie la valeur de m_size.x ou m_size.y pendant l'execution ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Impossible de déplacer une sprite sur axe négatif
« Réponse #4 le: Juillet 23, 2013, 04:46:05 pm »
Il manque les 'break' à la fin des case de ton switch.

A part ça, ne mets pas ta fonction de déplacement dans la boucle d'évènements si elle ne dépend pas d'évènements, ça n'a aucun sens.
Laurent Gomila - SFML developer

TZK

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Re : Impossible de déplacer une sprite sur axe négatif
« Réponse #5 le: Juillet 23, 2013, 05:17:55 pm »
as-tu verifie la valeur de m_size.x ou m_size.y pendant l'execution ?

Les valeurs de m_size.x ou m_size.y sont bonne à l’exécution, j'ai vérifié en les affichant dans la console et de toute manière le déplacement fonctionne avec ces valeurs uniquement lorsqu'elles sont positives.

Il m'est impossible de faire un déplacement vers le haut ou encore vers la gauche.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Impossible de déplacer une sprite sur axe négatif
« Réponse #6 le: Juillet 23, 2013, 05:47:14 pm »
Au cas où ce serait passé inaperçu (ça a l'air d'être le cas...), dans ma réponse il y a la solution à ton problème.
Laurent Gomila - SFML developer

TZK

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Re : Impossible de déplacer une sprite sur axe négatif
« Réponse #7 le: Juillet 23, 2013, 05:53:21 pm »
Au cas où ce serait passé inaperçu (ça a l'air d'être le cas...), dans ma réponse il y a la solution à ton problème.

Excusez-moi, j'avais bien modifié mon code mais VS2012 a oublié de recompiler...

C'est bon tout marche ! :)

 

anything