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);