Hey,
So this time hopefully my issue isn't as stupid as me adding an extra semi-colon, but when I try to get the global bounds of an sf::Text object, I get an access violation:
First-chance exception at 0x0FD2E41F (sfml-graphics-d-2.dll) in Survive.exe: 0xC0000005: Access violation reading location 0xCCCCCD24.
The violation happens in the if statement when I use the .contains method(). I know it happens because of the .getGlobalBounds() method because if I try std::cout'ing that value's width, height, etc, it will crash there instead.
Here are my .h and .cpp files. The relevent .h portion is the //------Menu---- and //=====Main Screen==== section. As for the .cpp, the menu constructor is the one that loads. As an added note, even though I change the character size, Visual Studio is reporting it as '0' in the debug window at the time of the crash. Thanks!
.h
#ifndef GUIMANAGER_H
#define GUIMANAGER_H
#include <SFML/Graphics.hpp>
#include "Player.h"
class GUIManager
{
public:
GUIManager(sf::RenderWindow*, Player*);
GUIManager(sf::RenderWindow*);
GUIManager();
void update(const sf::Time&);
enum menuType
{
main,
settings,
gameplay,
audio,
controls
};
//Getters
sf::RectangleShape getHealthOutOf() const;
sf::RectangleShape getHealthCurrent() const;
sf::RectangleShape getReloadOutOf() const;
sf::RectangleShape getReloadCurrent() const;
sf::Text getTotalAmmo() const;
bool isMenu() const;
menuType getCurrentMenu() const;
sf::RectangleShape getSelectionRect() const;
sf::Text getSurviveTitleText() const;
sf::Text getPlayText() const;
sf::Text getSettingsText() const;
sf::Text getQuitText() const;
private:
sf::RenderWindow* pWindow_;
sf::Font font_;
bool menu_;
//-----------------------------------MENU------------------------------------
//The type of menu that is currently visible
menuType currentMenu_ = main;
//Rectangle that appears below selected button/text
sf::RectangleShape selectionRect_;
//Text that is shown at the bottom to describe what the setting does
sf::Text descriptionText_;
//The sizes of selectable buttons and title texts in percent
int titleSize_ = 0.3f;
int buttonSize_ = 0.1f;
float titleOffset_ = 0.15f;
//==================================Main Screen===================================
//Text
sf::Text surviveTitleText_;
sf::Text playText_;
sf::Text settingsText_;
sf::Text quitText_;
//====================================Settings====================================
sf::Text settingsTitleText_;
sf::Text audioText_;
sf::Text gameplayText_;
sf::Text fullscreenText_;
//====================================GAMEPLAY====================================
sf::Text gameplayTitleText_;
sf::Text mapSizeText_;
sf::Text difficultyMultiplierText_;
//--------------------------------------Game--------------------------------------
Player* pPlayer_;
//Health
sf::RectangleShape healthOutOf_;
sf::RectangleShape healthCurrent_;
sf::Vector2f healthOffset_ = sf::Vector2f(0.01f, 0.01f); //In percent of window size
sf::Vector2f healthSize_ = sf::Vector2f(0.075f, 0.01f); //In percent of window size
//Weapon
sf::Text ammo_;
sf::Vector2f ammoOffset_ = sf::Vector2f(0.015f, 0.015f);
float ammoSize_ = 0.035f; //In percent
//Reload
sf::RectangleShape reloadOutOf_;
sf::RectangleShape reloadCurrent_;
sf::Vector2f reloadOffset_ = sf::Vector2f(0.01f, 0.01f);
sf::Vector2f reloadSize_ = sf::Vector2f(0.075f, 0.01f);
};
#endif
.cpp
#include "GUIManager.h"
#include <iostream>
#include "Humanoid.h"
#include "Player.h"
#include "Gun.h"
//HUD constructor
GUIManager::GUIManager(sf::RenderWindow* pWindow, Player* pPlayer)
:pWindow_(pWindow), pPlayer_(pPlayer)
{
if (!font_.loadFromFile("arial.ttf"))
std::cout << "Failed to load font." << std::endl;
//Health
healthOutOf_.setFillColor(sf::Color(214, 34, 34));
healthCurrent_.setFillColor(sf::Color(78, 213, 116));
healthOutOf_.setSize(sf::Vector2f(3.0f, 3.0f));
healthCurrent_.setSize(sf::Vector2f(3.0f, 3.0f));
healthOutOf_.setOrigin(0.0f, 3.0f);
healthCurrent_.setOrigin(0.0f, 3.0f);
//Ammo
ammo_.setFont(font_);
ammo_.setColor(sf::Color::Black);
//Reload
reloadOutOf_.setFillColor(sf::Color(23, 24, 25));
reloadCurrent_.setFillColor(sf::Color(141, 191, 215));
reloadCurrent_.setSize(sf::Vector2f(3.0f, 3.0f));
reloadOutOf_.setSize(sf::Vector2f(3.0f, 3.0f));
reloadCurrent_.setOrigin(sf::Vector2f(3.0f, 3.0f));
reloadOutOf_.setOrigin(sf::Vector2f(3.0f, 3.0f));
}
//Menu constructor
GUIManager::GUIManager(sf::RenderWindow* pWindow)
:menu_(true), pWindow_(pWindow)
{
if (!font_.loadFromFile("arial.ttf"))
std::cout << "Failed to load font." << std::endl;
selectionRect_.setFillColor(sf::Color(200, 200, 200, 100));
selectionRect_.setPosition(sf::Vector2f(-10000.0f, -10000.0f));
surviveTitleText_.setFont(font_);
playText_.setFont(font_);
settingsText_.setFont(font_);
quitText_.setFont(font_);
//Assigns all the strings to the texts
surviveTitleText_.setString("Survive");
playText_.setString("Play");
settingsText_.setString("Settings");
quitText_.setString("Quit");
settingsTitleText_.setString("Settings");
audioText_.setString("Audio");
gameplayText_.setString("Gameplay");
fullscreenText_.setString("Fullscreen: No");
gameplayTitleText_.setString("Gameplay");
mapSizeText_.setString("Map Size: 257");
difficultyMultiplierText_.setString("Difficulty: Easy");
}
//Default - do not use
GUIManager::GUIManager()
{
}
void GUIManager::update(const sf::Time& dT)
{
sf::Vector2f windowSize = pWindow_->getView().getSize();
if (menu_)
{
if (currentMenu_ == main)
{
surviveTitleText_.setCharacterSize((int)(titleSize_ * windowSize.y));
playText_.setCharacterSize((int)(buttonSize_ * windowSize.y));
settingsText_.setCharacterSize((int)(buttonSize_ * windowSize.y));
quitText_.setCharacterSize((int)(buttonSize_ * windowSize.y));
std::cout << settingsText_.getPosition().x;
surviveTitleText_.setPosition(windowSize.x / 2.0f, windowSize.y * titleOffset_);
playText_.setPosition(windowSize.x / 2.0f, windowSize.y * titleOffset_ + windowSize.y * 0.15f * 2);
settingsText_.setPosition(windowSize.x / 2.0f, windowSize.y * titleOffset_ + windowSize.y * 0.15f * 3);
quitText_.setPosition(windowSize.x / 2.0f, windowSize.y * titleOffset_ + windowSize.y * 0.15f * 4);
if (playText_.getGlobalBounds().contains((sf::Vector2f)sf::Mouse::getPosition(*pWindow_)))
{
selectionRect_.setSize(sf::Vector2f(playText_.getGlobalBounds().width, playText_.getGlobalBounds().height));
selectionRect_.setPosition(playText_.getPosition());
}
else if (settingsText_.getGlobalBounds().contains((sf::Vector2f)sf::Mouse::getPosition(*pWindow_)))
{
selectionRect_.setSize(sf::Vector2f(settingsText_.getGlobalBounds().width, settingsText_.getGlobalBounds().height));
selectionRect_.setPosition(settingsText_.getPosition());
}
else if (quitText_.getGlobalBounds().contains((sf::Vector2f)sf::Mouse::getPosition(*pWindow_)))
{
selectionRect_.setSize(sf::Vector2f(quitText_.getGlobalBounds().width, quitText_.getGlobalBounds().height));
selectionRect_.setPosition(quitText_.getPosition());
}
}
}
else
{
sf::Vector2f currentWindowPos(pWindow_->getView().getCenter().x - windowSize.x / 2.0f, pWindow_->getView().getCenter().y - windowSize.y / 2.);
//Health
healthOutOf_.setScale(windowSize.x * healthSize_.x, windowSize.y * healthSize_.y);
healthCurrent_.setScale(windowSize.x * healthSize_.x * (pPlayer_->getHealth() / 100.0f), windowSize.y * healthSize_.y);
healthOutOf_.setPosition(currentWindowPos.x + windowSize.x * healthOffset_.x, currentWindowPos.y + windowSize.y - windowSize.y * healthOffset_.y);
healthCurrent_.setPosition(currentWindowPos.x + windowSize.x * healthOffset_.x, currentWindowPos.y + windowSize.y - windowSize.y * healthOffset_.y);
//Reload
Gun gun = pPlayer_->getGuns().at(pPlayer_->getCurrentGunIndex());
if (gun.isReloading())
reloadCurrent_.setScale(windowSize.x * reloadSize_.x * (gun.getCurrentReloadTime().asSeconds() / gun.getReloadTime()), windowSize.y * reloadSize_.y);
else
reloadCurrent_.setScale(windowSize.x * reloadSize_.x * (gun.getCurrentBullets() / (float)gun.getBulletsPerMag()), windowSize.y * reloadSize_.y);
reloadOutOf_.setScale(windowSize.x * reloadSize_.x, windowSize.y * reloadSize_.y);
reloadCurrent_.setPosition(currentWindowPos.x + windowSize.x - windowSize.x * reloadOffset_.x, currentWindowPos.y + windowSize.y - windowSize.y * reloadOffset_.y);
reloadOutOf_.setPosition(currentWindowPos.x + windowSize.x - windowSize.x * reloadOffset_.x, currentWindowPos.y + windowSize.y - windowSize.y * reloadOffset_.y);
//Ammo
ammo_.setString(std::to_string(pPlayer_->getGuns().at(pPlayer_->getCurrentGunIndex()).getCurrentBullets()) + " / " + std::to_string(pPlayer_->getGuns().at(pPlayer_->getCurrentGunIndex()).getTotalAmmo()));
ammo_.setOrigin(ammo_.getLocalBounds().width / 2, ammo_.getLocalBounds().height / 2.0f);
ammo_.setCharacterSize(0.75f * reloadOutOf_.getGlobalBounds().height);
ammo_.setPosition(reloadOutOf_.getPosition().x - reloadOutOf_.getGlobalBounds().width / 2.0f, reloadOutOf_.getPosition().y - reloadOutOf_.getGlobalBounds().height / 2.0f);
}
}
//Getters
sf::RectangleShape GUIManager::getHealthOutOf() const { return healthOutOf_; }
sf::RectangleShape GUIManager::getHealthCurrent() const { return healthCurrent_; }
sf::RectangleShape GUIManager::getReloadOutOf() const { return reloadOutOf_; }
sf::RectangleShape GUIManager::getReloadCurrent() const { return reloadCurrent_; }
sf::Text GUIManager::getTotalAmmo() const { return ammo_; }
bool GUIManager::isMenu() const { return menu_; }
sf::RectangleShape GUIManager::getSelectionRect() const { return selectionRect_; }
sf::Text GUIManager::getSurviveTitleText() const { return surviveTitleText_; }
sf::Text GUIManager::getPlayText() const { return playText_; }
sf::Text GUIManager::getSettingsText() const { return settingsText_; }
sf::Text GUIManager::getQuitText() const { return quitText_; }