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
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 !