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

Auteur Sujet: Balle qui rebondit contre les rebords...Galère !  (Lu 1995 fois)

0 Membres et 1 Invité sur ce sujet

Slash94

  • Jr. Member
  • **
  • Messages: 89
    • Voir le profil
Balle qui rebondit contre les rebords...Galère !
« le: Décembre 15, 2016, 11:03:06 pm »
Bonsoir tout le monde  :)

Je viens vous voir car je suis un petit peu perdu sur un petit programme que j'essaie de concevoir, autrement-dit : une simple balle qui rebondirait contre les 4 rebords de la fenêtre..

J'ai tenté d'inverser les valeurs X et Y si ces coordonnées dépassaient la largeur ( width ) de l'écran ou bien la hauteur ( height ) avec des booleans pour modifier les calculs en conséquence, mais mon programme se comporte n'importe comment, la balle rebondit bien après avoir quitté l'écran et fait des mouvements bizarres, d'autant plus qu'avec les getPositionX et Y de ma balle, elle prend de plus en plus d'amplitude ( que ce soit dans les négatifs ou les positifs ) au fur & à mesure !

Pourquoi un tel comportement ?

C'est pour un programme en 800*600 donc j'ai mis les valeurs 770 et 570 / 30 et 30 car j'ai déduis la taille de la balle..

PS : Je trouve le code du tuto openclassroom trop lourd / bordélique et en plus, il est obsolète par rapport à la nouvelle version SFML.. j'aimerais vous m'aidiez à identifier le problème dans MON code.

Merci infiniment à vous les z'amis :D

main.cpp
#include <iostream>
#include <SFML/Graphics.hpp>

#include "Ball.h"
#include "checkCollide.h"

using namespace std;
using namespace sf;

#pragma region variables
unsigned int SCREEN_WIDTH(800);
unsigned int SCREEN_HEIGHT(600);
RenderWindow app(VideoMode(SCREEN_WIDTH,SCREEN_HEIGHT,32),"Hey");
#pragma endregion variables

#pragma region fonctions
void gestionClavier();
#pragma endregion fonctions

int main()
{

    app.setFramerateLimit(30);

    Ball ball(Color::Red, 30);
    ball.setPosition(SCREEN_WIDTH/2-30, SCREEN_HEIGHT/2-30);

    while(app.isOpen())
    {
        Event E;

        while(app.pollEvent(E))
        {
            if(E.type == E.Closed)
                app.close();
        }

    gestionClavier();

    ball.moveBall();
    ball.checkCollide();

    cout << ball.getX() << endl;
    cout << ball.getY() << endl;

    system("cls");

    app.clear();
    app.draw(ball.getCircle());
    app.display();

    }

}

void gestionClavier()
{
        if (Keyboard::isKeyPressed(Keyboard::Escape))
        {
            app.close();
        }
}
 

Ball.h

#ifndef BALL_H_INCLUDED
#define BALL_H_INCLUDED

#include <SFML/Graphics.hpp>

class Ball{

protected:
    int m_taille = 0;
    int m_dX = 0;
    int m_dY = 0;
    int m_speed = 0;
    bool veX = false;
    bool veY = false;
    sf::CircleShape circle;

public:
    Ball();
    Ball(sf::Color c, int taille, int speed = 1);
    sf::CircleShape getCircle();
    sf::CircleShape setPosition(int x, int y);
    void moveBall();
    void checkCollide();
    int getX();
    int getY();
    ~Ball();

};

#endif
 

Ball.cpp

#include <iostream>

#include "Ball.h"

using namespace std;
using namespace sf;

Ball::Ball()
{

}

Ball::Ball(Color c, int taille, int speed) :
    m_taille(taille), m_speed(speed)
{
    circle.setFillColor(c);
    circle.setRadius(m_taille);
}

void Ball::moveBall()
{
    if (veX){
        m_dX += m_speed;
    }
    if (!veX){
        m_dX -= m_speed;
    }
    if (veY){
        m_dY += m_speed;
    }
    if (!veY){
        m_dY -= m_speed;
    }

    circle.move(m_dX, m_dY);
}

void Ball::checkCollide()
{
        if (circle.getPosition().x > 770)
    {
        veX = false;
    }
        if (circle.getPosition().x < 30)
    {
        veX = true;
    }
        if (circle.getPosition().y > 570)
    {
        veY = false;
    }
        if (circle.getPosition().y < 30)
    {
        veY = true;
    }
}

int Ball::getX()
{
    return circle.getPosition().x;
}

int Ball::getY()
{
    return circle.getPosition().y;
}

CircleShape Ball::getCircle()
{
    return circle;
}

CircleShape Ball::setPosition(int x, int y)
{
    circle.setPosition(x,y);
}

Ball::~Ball()
{

}
 

Et encore MERCI !  ;)

Slash94

  • Jr. Member
  • **
  • Messages: 89
    • Voir le profil
Re : Balle qui rebondit contre les rebords...Galère !
« Réponse #1 le: Décembre 15, 2016, 11:11:56 pm »
Choqué.. j'ai résolu le problème en remplaçant

circle.move(dX, dY)

par ...

circle.setPosition(dX, dY)

Si ça peut en aider d'autres...  :D mais une question reste en suspens.... POURQUOI ?!

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Balle qui rebondit contre les rebords...Galère !
« Réponse #2 le: Décembre 16, 2016, 12:11:36 pm »
les 2 fonctions ne sont pas identiques. l'une bouge par rapport à sa position ( donc relative  pour move() ) , et la seconde est absolue , tu indiques directement les coordonnées. lis bien la doc.