This is a really weird issue I am having and have been stuck on for most of today.
What should be rendering is "0 | 0" but the pipe is the only part of the string that is being rendered.
Here is the code:
/*
* Game.h
* Written by James Yeoman
*/
#pragma once
#include "Paddle.h"
#include "Ball.h"
#include <SFML/Graphics.hpp>
class Game
{
private:
sf::RenderWindow window;
uint16_t WindowWidth;
uint16_t WindowHeight;
uint8_t score1;
uint8_t score2;
bool isRoundOver;
void createEntities();
Ball* puck;
Paddle* paddles[2];
sf::Font scoreFont;
sf::Text* scoreSmall;
sf::Text* scoreBig;
public:
Game(uint16_t, uint16_t, std::string);
void startLoop();
};
/*
* Game.cpp
* Written by James Yeoman
*/
#include "Game.h"
#include <string>
Game::Game(uint16_t windowWidth, uint16_t windowHeight, std::string title) :
window(sf::VideoMode(windowWidth, windowHeight), title)
{
this->WindowWidth = windowWidth;
this->WindowHeight = windowHeight;
this->window.setVerticalSyncEnabled(true);
this->score1 = 0;
this->score2 = 0;
this->isRoundOver = false;
this->scoreFont = sf::Font();
if (!this->scoreFont.loadFromFile("fonts/scoreFont.ttf"))
{
}
this->scoreSmall = new sf::Text("", this->scoreFont, 30U);
this->scoreSmall->setString(std::to_string(score1) + " | " + std::to_string(score2));
this->scoreSmall->setOrigin(this->scoreSmall->getLocalBounds().width / 2, this->scoreSmall->getLocalBounds().height / 2);
this->scoreSmall->setPosition(this->WindowWidth / 2, this->scoreSmall->getGlobalBounds().height);
this->scoreSmall->setFillColor(sf::Color::White);
this->scoreSmall->setOutlineColor(sf::Color::White);
this->scoreSmall->setOutlineThickness(1.0f);
std::printf(scoreSmall->getString().toAnsiString().data());
this->scoreBig = new sf::Text("0 | 0", this->scoreFont, 200U);
this->scoreBig->setOrigin(this->scoreBig->getLocalBounds().width / 2, this->scoreBig->getLocalBounds().height / 2);
this->scoreBig->setPosition(windowWidth / 2.0f, windowHeight / 2.0f);
this->scoreBig->setFillColor(sf::Color::White);
}
void Game::createEntities()
{
this->paddles[0] = new Paddle(sf::Vector2f(20, 100), 1, sf::Vector2f(this->window.getSize()));
this->paddles[1] = new Paddle(sf::Vector2f(20, 100), 2, sf::Vector2f(this->window.getSize()));
this->puck = new Ball(sf::Vector2f(20, 20), &(this->window), this->paddles);
}
void Game::startLoop()
{
sf::Event event;
while (window.isOpen())
{
// Initialises the paddles and the ball
this->createEntities();
// Round loop
while (this->isRoundOver == false)
{
while (this->window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
this->window.close();
}
this->window.clear();
this->paddles[0]->Update();
this->window.draw(this->paddles[0]->getBody());
this->paddles[1]->Update();
this->window.draw(this->paddles[1]->getBody());
this->isRoundOver = this->puck->Update();
this->window.draw(this->puck->getBody());
this->window.draw(*this->scoreSmall);
this->window.display();
}
/* Checks who won the round */
if (this->puck->getBody().getPosition().x > this->WindowWidth / 2)
this->score1 += 1;
else
this->score2 += 1;
this->scoreSmall->setString(std::to_string(this->score1) + " | " + std::to_string(this->score2));
this->scoreBig->setString(this->scoreSmall->getString());
/* Positions the score in the middle of the screen */
this->scoreBig->setPosition(WindowWidth / 2.0f, WindowHeight / 2.0f);
/* Display the score in the middle of the screen */
while (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Space) == false)
{
while (this->window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
this->window.close();
}
this->window.clear();
this->window.draw(this->paddles[0]->getBody());
this->window.draw(this->paddles[1]->getBody());
this->window.draw(*this->scoreSmall);
this->window.draw(*this->scoreBig);
this->window.display();
}
this->isRoundOver = false;
}
}