Wszystkie moje uwagi jakie przyszły mi do głowy:
1. Zmieniłem rozmiar okna i przyciski przestały prawidłowo reagować. Wypadałoby zablokować rozszerzanie np poprzez nadanie sf::RenderWindow innego typu okna:
sf::RenderWindow window(sf::VideoMode(512, 576), "Pixel Quiz", sf::Style::Close);
albo użyć metody mapPixelToCoords przy pobieraniu położenia myszki:
sf::Vector2f mouse(window.mapPixelToCoords(sf::Mouse::getPosition(window)));
2. Czemu konsola jest włączona?
3. MessageBox jest z WinApi. Dodatkowe okna też mogą być robione w SFML dzięki czemu gra będzie mogła być skompilowana również na inne niż windows systemy.
4. Przydałby się jakiś menedżer zasobów. Często piszesz coś takiego:
if (!level.loadMap(selected_lvl))
{
MessageBox(NULL, "Faile do load map file", "ERROR", NULL);
return;
}
4. Wszystkie nazwy zmiennych powinny być zrozumiałe i spójne:
bool tp, wat, game_status;
5. Kolory można podawać na dwa sposoby:
text.setFillColor(sf::Color::Color(255, 153, 0)); // #ff9900
text.setFillColor(sf::Color(0xff9900ff)); // bo RGBA
6. Engine::colision(sf::Vector2f xy)
if (level.poziom[(int)xy.x][(int)xy.y] == level.ICE || level.poziom[(int)xy.x][(int)xy.y] == level.PADLOCK
|| level.poziom[(int)xy.x][(int)xy.y] == level.DOOR)
{
return true;
}
else
{
return false;
}
zamień na:
return (level.poziom[(int)xy.x][(int)xy.y] == level.ICE || level.poziom[(int)xy.x][(int)xy.y] == level.PADLOCK
|| level.poziom[(int)xy.x][(int)xy.y] == level.DOOR);
7. Patrzę na tę funkcję i zastanawia mnie jedno. Czemu funkcja otrzymuje parę liczb zmiennoprzecinkowych. Nie lepiej od razu sf::Vector2i/u? W tym momencie szukam kontekstu i trafiam na wywołanie
if (colision(player.getPosition() + sf::Vector2f(0, -1)) == false)
skąd przeszedłem do metody Player::getPosition():
return sf::Vector2f(((sprite.getPosition().x - 8) / 16), (((sprite.getPosition().y - 64) - 8) / 16));
Niby wszystko działa, ale gdzieś po tych wszystkich działaniach tracisz trochę prędkości, trochę wygody i dokładności. Lepiej jakbyś przechowywał w tym przypadku pozycję gracza jako nr od razu, a nie je wyliczał.
8. Czemu pliki nagłówkowe są dużej litery, a pliki źródłowe z małej?
9. Używaj "\n" zamiast std::endl na strumieniach plikowych (będzie szybciej zwłaszcza dla plików).
10. sf::RenderWindow nie powinno być elementem klasy Game?
11. Dobrze, że często stosujesz angielskie nazewnictwo, ale postaraj się, aby było wszędzie:
wybrany_lvl = 0;
12. Metoda resize jest zbędna, bo konstruktor może robić dokładnie to samo:
std::vector <sf::Sprite> lvl_field(16);
13. Funkcja Level::lose_rgb() - powinna zostać wyłączona z tej klasy (to zupełnie niezwiązany element) i zmień jej nazwę!
sf::Uint8 randUint8()
{
return rand() % 256;
}
sf::Color w jednym z konstruktorów przyjmuje właśnie 4 sf::Uint8, a one mogą przyjmować wartości od 0 - 256 (chociaż nie będzie błędu przy przekroczeniu wartości tylko zostanie zapisana wartość kolejna dla np 257 będzie 1).
14. Sterowanie jest troszkę niewygodne. Gdy raz nacisnę przycisk przesunę się raz, a po chwili będę przesuwał się bardzo szybko przez co można nie skręcić w odpowiednim momencie więc trzeba na niektórych korytarzach cały czas wduszać dany przycisk. IMHO gdyby poruszanie się byłoby ciągłe można by wygodniej sterować (czyli sterowanie za pomocą sf::Keyboard::isKeyPressed).
15. Wyszedłem z gry i nie zapisały mi się wszystko levele