Codebewertung (SFML Pong)



  • Hallo 🙂

    Könnt ihr meinen Code bewerten und mir Tipps geben ?
    Es ist ein Pong in SFML der noch nicht perfekt ist.
    Wo kann man etwas zur AI lernen/ lesen ?
    Wie würdet ihr das mit der Objektorientierung in grösseren Spielen machen ?
    Ich weis nicht wie ich das Spiel aufteilen soll.

    #include <SFML/graphics.hpp>
    #include <string>
    #include <cmath>
    
    std::string ExePath();
    
    int main()
    {
        const float PI = 3.14159f;
    
        sf::RenderWindow App(sf::VideoMode(800, 600, 32), "SS Pong");
        sf::Image lPaddleImage, rPaddleImage, lBackgroundImage, mBackgroundImage, rBackgroundImage , ballImage;
    
        std::string exePath = ExePath();
    
        if (!lPaddleImage.LoadFromFile( exePath + "/data/img/lpaddleimage.png") ||
            !rPaddleImage.LoadFromFile( exePath + "/data/img/rpaddleimage.png") ||
            !lBackgroundImage.LoadFromFile(exePath + "/data/img/background.png") ||
            !ballImage.LoadFromFile(exePath + "/data/img/ball.png"))
           {
               return EXIT_FAILURE;
           }
    
        sf::Sprite lPaddle(lPaddleImage);
        sf::Sprite rPaddle(rPaddleImage);
        sf::Sprite Background(lBackgroundImage);
        sf::Sprite ball(ballImage);
    
        lPaddle.Move(10, (App.GetView().GetRect().GetHeight() - lPaddle.GetSize().y) / 2);
        rPaddle.Move(App.GetView().GetRect().GetWidth() - rPaddle.GetSize().x - 10, (App.GetView().GetRect().GetHeight() - rPaddle.GetSize().y) / 2);
        ball.Move((App.GetView().GetRect().GetWidth() - ball.GetSize().x) / 2, (App.GetView().GetRect().GetHeight() - ball.GetSize().y) / 2);
    
        sf::Clock AITimer;
        const float AITime = 0.1f;
        float lPaddleSpeed = 400.f;
        float rPaddleSpeed = 400.f;
    
        float ballSpeed = 400.f;
        float ballAngle;
    
        do
        {
            ballAngle = sf::Randomizer::Random(0.f, 2 * PI);
        }while(std::abs(std::cos(ballAngle)) < 0.7f);
    
        bool isPlaying = true;
    
        while(App.IsOpened())
        {
            sf::Event Event;
            while(App.GetEvent(Event))
            {
                if (Event.Type == sf::Event::Closed)
                {
                    App.Close();
                }
            }
    
            if (isPlaying)
            {
                /*Spieler bewegung*/
                if (App.GetInput().IsKeyDown(sf::Key::Up) && (lPaddle.GetPosition().y > 5.f))
                {
                    lPaddle.Move(0.f, -lPaddleSpeed * App.GetFrameTime());
                }
    
                if (App.GetInput().IsKeyDown(sf::Key::Down) && (lPaddle.GetPosition().y < App.GetView().GetRect().GetHeight() - lPaddle.GetSize().y - 5.f))
                {
                    lPaddle.Move(0.f, lPaddleSpeed * App.GetFrameTime());
                }
    
                /*CP Bewegeung*/
    
                if (((rPaddleSpeed < 0.f) && (rPaddle.GetPosition().y > 5.f)) ||
                        ((rPaddleSpeed > 0.f) && (rPaddle.GetPosition().y < App.GetView().GetRect().GetHeight() - rPaddle.GetSize().y - 5.f)))
                    {
                        rPaddle.Move(0.f, rPaddleSpeed * App.GetFrameTime());
                    }
    
                if (AITimer.GetElapsedTime() > AITime)
                {
                    AITimer.Reset();
                    if ((rPaddleSpeed < 0) && (ball.GetPosition().y + ball.GetSize().y > rPaddle.GetPosition().y + rPaddle.GetSize().y))
                    {
                        rPaddleSpeed = -rPaddleSpeed;
                    }
                    if ((rPaddleSpeed > 0) && (ball.GetPosition().y < rPaddle.GetPosition().y))
                    {
                        rPaddleSpeed = -rPaddleSpeed;
                    }
                }
    
                float Factor = ballSpeed * App.GetFrameTime();
                ball.Move(std::cos(ballAngle) * Factor, std::sin(ballAngle) * Factor);
    
                /*kollisionsprüfung*/
    
                if (ball.GetPosition().x < 0.f)
                {
                    ball.Move((App.GetView().GetRect().GetWidth() - ball.GetSize().x) / 2, (App.GetView().GetRect().GetHeight() - ball.GetSize().y) / 2);
                }
    
                if (ball.GetPosition().x > App.GetView().GetRect().GetWidth())
                {
                    ball.Move((App.GetView().GetRect().GetWidth() - ball.GetSize().x) / 2, (App.GetView().GetRect().GetHeight() - ball.GetSize().y) / 2);
                }
    
                if (ball.GetPosition().y < 0.f)
                {
                    ballAngle = -ballAngle;
                    ball.SetY(0.1f);
                }
    
                if (ball.GetPosition().y > App.GetView().GetRect().GetHeight())
                {
                    ballAngle = -ballAngle;
                    ball.SetY(App.GetView().GetRect().GetHeight() - 0.1f);
    
                }
                //linkes Paddel
                if (ball.GetPosition().x < lPaddle.GetSize().x && ball.GetPosition().y >= lPaddle.GetPosition().y)
                {
                    ballAngle = PI - ballAngle;
                    ball.SetX(lPaddle.GetPosition().x + lPaddle.GetSize().x + 0.1f);
                }
                // rechtes paddel)
    
                if (ball.GetPosition().x + ball.GetSize().x > rPaddle.GetPosition().x &&
    				ball.GetPosition().x + ball.GetSize().x < rPaddle.GetPosition().x + (rPaddle.GetSize().x / 2.0f) &&
    				ball.GetPosition().y + ball.GetSize().y >= rPaddle.GetPosition().y &&
    				ball.GetPosition().y <= rPaddle.GetPosition().y + rPaddle.GetSize().y)
                {
                    ballAngle = PI - ballAngle;
                    ball.SetX(rPaddle.GetPosition().x - ball.GetSize().x - 0.1f);
                }
            }
    
            App.Clear();
            App.Draw(Background);
            App.Draw(lPaddle);
            App.Draw(rPaddle);
            App.Draw(ball);
            App.Display();
        }
    
        return EXIT_SUCCESS;
    }
    
    std::string ExePath()
    {
        char buffer[MAX_PATH];
        GetModuleFileName( NULL, buffer, MAX_PATH );
        std::string::size_type pos = std::string( buffer ).find_last_of( "\\/" );
        return std::string( buffer ).substr( 0, pos);
    }
    

    PS:
    Ich weiss das der Code Scheisse ist. :xmas1:

    Danke im vorraus !



  • opa45 schrieb:

    Könnt ihr meinen Code bewerten und mir Tipps geben ?
    [...]
    Ich weiss das der Code Scheisse ist.

    Wozu dann noch eine externe Bewertung?



  • _kermit schrieb:

    opa45 schrieb:

    Könnt ihr meinen Code bewerten und mir Tipps geben ?
    [...]
    Ich weiss das der Code Scheisse ist.

    Wozu dann noch eine externe Bewertung?

    Tipps ?



  • lies mal das buch Clean Code. dann weisst du, wie man code schreibt, den man übermorgen auch noch versteht.



  • opa45 schrieb:

    Tipps ?

    1. benutze Funktionen und Klassen um den Code zu gliedern. Die main geht sicherlich auch in weniger als 20 Zeilen.

    2. benutze einen Taschenrechner, dann brauchst du nicht sowas wie:

    do{
        ballAngle = sf::Randomizer::Random(0.f, 2 * PI);
    }while(std::abs(std::cos(ballAngle)) < 0.7f);
    

Anmelden zum Antworten