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

Auteur Sujet: SFML Pong comment faire?  (Lu 2921 fois)

0 Membres et 1 Invité sur ce sujet

TheYoungGeek43

  • Jr. Member
  • **
  • Messages: 87
    • Voir le profil
SFML Pong comment faire?
« le: Juillet 16, 2015, 06:44:53 pm »
Bonjour,

Je suis entrain de faire un pong mais je ne sait pas comment faire pour que la balle parte quand le jeux se lance (le pong et en un seul fichier Main.cpp pour l'instant après je ferait en plusieurs classe :) )

Merci pour votre aide :)
L'échec est la preuve que l'on à essayer

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : SFML Pong comment faire?
« Réponse #1 le: Juillet 16, 2015, 08:54:28 pm »
Ben tu la bouges à chaque frame. (la fonction move des sprite ou shape)

TheYoungGeek43

  • Jr. Member
  • **
  • Messages: 87
    • Voir le profil
Re : SFML Pong comment faire?
« Réponse #2 le: Juillet 17, 2015, 10:27:09 am »
J'ai essayer de voir j'ai mis dans la
while(window.isOpen()){ ball.move(1.0f,0) }
sauf que si on y reflechie si je met sa quoi qu'il arrive elle ira vers la droite donc je sait pas trop cmment faire pour la bouger a chaque Frame
L'échec est la preuve que l'on à essayer

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : SFML Pong comment faire?
« Réponse #3 le: Juillet 17, 2015, 12:08:34 pm »
Et tu la dessines pas ?
A chaque frame (tour de boucle principale) :
- tu bouges ta balle (et les autres trucs qui doivent bouger (raquettes, etc.))
- tu la dessines (et les autres trucs que tu veux dessiner (murs, raquettes, score, etc.)
- tu appelles display sur ta fenêtre
Là dans ton code il manque les 3/4

Tu peux créer un sf::Vector2f qui représente son déplacement, et à chaque frame tu déplaces (move) la balle de ce vecteur
Par exemple si tu bouges de (1.0f, 0) fera bouger la balle à droite d'un pixel (comme tu le fais, apparemment). Mais (1.0f, 0.4f) la fera bouger vers la droite d'un pixel et de 0.4 pixels vers le bas. ;)

Pour changer la direction de la balle quand elle touche un mur ou une raquette, il suffit de modifier le vecteur.
Quand elle touche un mur (en haut ou en bas) tu veux inverser son déplacement vertical, donc le vecteur devient :
deplacement.y = -deplacement.y;
Quand elle touche une raquette, tu veux inverser son déplacement horizontal, si elle allait vers la droite tu veux la renvoyer à gauche et vice versa donc
deplacement.x = -deplacement.x;

Ça sera déjà un bon début.
Et tes questions sont vagues, pas précises.

TheYoungGeek43

  • Jr. Member
  • **
  • Messages: 87
    • Voir le profil
Re : SFML Pong comment faire?
« Réponse #4 le: Juillet 17, 2015, 12:25:31 pm »
J'ai reussie a la faire bouger mais j'essaye de faire des collision entre la balle la fenetre et le raquette mais je n'y arrive pas j'ai essayer quelque truc

Mon code :
#include <SFML\Graphics.hpp>

#include <iostream>
#include <cmath>


using namespace std;

sf::RectangleShape paddle1(sf::Vector2f(10,100));
sf::RectangleShape paddle2(sf::Vector2f(10, 100));

sf::CircleShape ball(10);

void gestion_clavierP1();
void gestion_clavierP2();

sf::Vector2f ballSpeed(1.0f, 1.0f);

int main()
{
        sf::RenderWindow window(sf::VideoMode(800, 600), "Pong Make by Maxime Mazet v1.0");


        paddle1.setPosition(sf::Vector2f(10, 600 / 2 - 50));
        paddle2.setPosition(sf::Vector2f(780, 600 / 2 - 50));

        ball.setPosition(800 / 2 - 10, 600 / 2 - 10);

        paddle1.setFillColor(sf::Color::Black);
        paddle2.setFillColor(sf::Color::Black);

        ball.setFillColor(sf::Color::Black);

        window.setFramerateLimit(60);

        while (window.isOpen())
        {
                sf::Event event;
                while (window.pollEvent(event))
                {
                        if (event.type == event.Closed)
                        {
                                window.close();
                        }
                        gestion_clavierP1();
                        gestion_clavierP2();
                       
                       
                       
                }

                /** COLLISION ENTRE LA BALLE ET LES RAQUETTE **/

                if ((std::abs((paddle1.getPosition().x + 100) - (ball.getPosition().x + 10)) < 100) && (std::abs((paddle1.getPosition().y + 100) - (ball.getPosition().y + 10)) < 100)){
                       
                        ball.move(1.0f, 0);

                }

                if ((std::abs((paddle2.getPosition().x + 100) - (ball.getPosition().x + 10)) < 100) && (std::abs((paddle2.getPosition().y + 100) - (ball.getPosition().y + 10)) < 100)){

                        ball.move(-1.0f, 0);

                }
                /** COLLISION ENTRE LA BALLE ET LA FENTRE ET ENTRE LES RAQUETTES ET LA FENETRE **/
                if (ball.getPosition().x <= 0)
                {
                        ball.move(0, ballSpeed.y);
                }
                if (ball.getPosition().x >= 600)
                {
                        ball.move(0, ballSpeed.y);
                }

                if (paddle1.getPosition().y <= 0)
                {
                        paddle1.setPosition(10,0);
                }
                if (paddle1.getPosition().y >= 600)
                {
                        paddle1.setPosition(10, 600);
                }

                if (paddle2.getPosition().y <= 0)
                {
                        paddle2.setPosition(780, 0);
                }
                if (paddle2.getPosition().y >= (600-100))
                {
                        paddle2.setPosition(780, 600);
                }
               


                ball.move(ballSpeed.x, ballSpeed.y);

                window.clear(sf::Color::White);
                window.draw(paddle1);
                window.draw(paddle2);
                window.draw(ball);
                window.display();
        }

        return EXIT_SUCCESS;
}
/** GESTION DU CLAVIER POUR LA RAQUETTE N°1 **/
void gestion_clavierP1()
{
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Z))
        {
                paddle1.move(0, -1.5f);
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::S))
        {
                paddle1.move(0, 1.5f);
        }

}
/** GESTION DU CLAVIER POUR LA RAQUETTE N°2 (pensez apres a le mettre en IA) **/
void gestion_clavierP2()
{
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
        {
                paddle2.move(0, -1.5f);
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
        {
                paddle2.move(0, 1.5f);
        }
}

 
L'échec est la preuve que l'on à essayer

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : SFML Pong comment faire?
« Réponse #5 le: Juillet 17, 2015, 12:36:05 pm »
http://www.sfml-dev.org/documentation/2.3.1-fr/classsf_1_1Shape.php#a5257341fe832884dbba6b9dc855e33cc
http://www.sfml-dev.org/documentation/2.3.1-fr/classsf_1_1Rect.php#a566740c8f58e01bb052266f47e7e1011

Au lieu de tes calculs. (qui me semblent étranges, pourquoi y'a autant de 100 alors que la largeur d'un paddle c'est 10 ? Pourquoi ne pas utiliser la largeur d'un paddle plutot qu'une valeur magique ? ;) )
T'utilises pas les évènements dans ta gestion des raquettes, pourquoi tu appelles ces fonctions dans la boucle d'évènements ? :o

Si tu veux voir si la balle touche le haut et le bas, c'est le y de sa position qu'il faut regarder :o Et si c'est le cas, inverser sa vitesse verticale.
« Modifié: Juillet 17, 2015, 12:43:20 pm par G. »