• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ SFML - klasa przycisku, origin, globalBounds, czyli o jeden pixel za daleko

Object Storage Arubacloud
0 głosów
489 wizyt
pytanie zadane 23 sierpnia 2017 w C i C++ przez niezalogowany

Mam problem ze stworzeniem przycisku. Niby mam klasę z sf::Text i tłem sf::RectangleShape, ale nie wszystko układa się tak jakbym chciał. Trzeci przycisk jest przesunięty w kierunek dolnym-lewym o 1px. Z tego co udało mi się wydedukować to fakt, że dzieląc liczbę nieparzystą szerokości tekstu na pół w konstruktorze mogę tracić 1 piksel, ale to rozwiązywało mi tylko połowę problemu. Czy mógłbym moje przyciski lepiej wyśrodkować?

Plik main.cpp

#include <SFML\Graphics.hpp>
#include <vector>
#include "BasicButton.hpp"

int main()
{
    sf::Font font; 
    if(!font.loadFromFile("ArchivoBlack-Regular.ttf")) return 1; 

	sf::RenderWindow window(sf::VideoMode(1024, 720), "Menu");
	
	std::vector<BasicButton> buttons = 
	{
		BasicButton(font, "Start", window.getSize().x / 2, window.getSize().y / 2 - 101, 200, 100),
		BasicButton(font, "Opcje", window.getSize().x / 2, window.getSize().y / 2, 200, 100),
		BasicButton(font, "Wyjscie", window.getSize().x / 2, window.getSize().y / 2 + 101, 200, 100)
	};

	for (auto& button : buttons)
		button.setRectColor(sf::Color::Blue, sf::Color::Red);

	while (window.isOpen())
	{
		sf::Event event;
		while (window.pollEvent(event))
		{
			if (event.type == sf::Event::Closed) window.close();

			sf::Vector2f mousePos(sf::Mouse::getPosition(window));
			for (auto& button : buttons)
				button.setFocus(mousePos);
		}

		window.clear();
		for (auto& button : buttons) button.draw(window);
		window.display();
	}
}

Plik BasicButton.hpp

#pragma once
#include <SFML/Graphics.hpp>

class BasicButton
{
	sf::Text m_text;
	sf::RectangleShape m_rect;

	sf::Color m_normal_color;
	sf::Color m_focus_color;
public:

	BasicButton(const sf::Font&, const std::string&, float x, float y, float w, float h);

	bool isFocus(const sf::Vector2f& v);
	void setFocus(const sf::Vector2f& v);
	void setRectColor(const sf::Color& normal, const sf::Color& focus);

	void draw(sf::RenderWindow&);
};

Plik BasicButton.cpp

#include "BasicButton.hpp"

BasicButton::BasicButton(const sf::Font& font, const std::string& str, float x, float y, float w, float h)
{
	m_text.setFont(font);
	m_text.setString(str);
	m_normal_color = sf::Color::Black;
	m_focus_color = sf::Color::Black;
	m_rect.setSize(sf::Vector2f(w, h));
	m_text.setPosition(x, y);
	auto global2 = m_text.getGlobalBounds();
	m_text.setOrigin(global2.width / 2, global2.height / 2);
	m_rect.setOrigin(w / 2, h / 2);
	m_rect.setPosition(global2.left, global2.top);
}


void BasicButton::setRectColor(const sf::Color& normal, const sf::Color& focus)
{
	m_rect.setFillColor(normal);
	m_normal_color = normal;
	m_focus_color = focus;
}


bool BasicButton::isFocus(const sf::Vector2f& vec)
{
	return m_rect.getGlobalBounds().contains(sf::Vector2f(vec));
}


void BasicButton::setFocus(const sf::Vector2f& vec)
{
	if (this->isFocus(vec))
	{
		m_rect.setFillColor(m_focus_color);
	}
	else if (m_rect.getFillColor() != m_normal_color)
	{
		m_rect.setFillColor(m_normal_color);
	}
}


void BasicButton::draw(sf::RenderWindow& window)
{
	window.draw(m_rect);
	window.draw(m_text);
}
komentarz 23 sierpnia 2017 przez criss Mędrzec (172,590 p.)

Z tego co udało mi się wydedukować to fakt, że dzieląc liczbę nieparzystą szerokości tekstu na pół w konstruktorze mogę tracić 1 piksel, ale to rozwiązywało mi tylko połowę problemu.

Jeśli z tym sobie poradziłeś, to gdzie jeszcze jest problem? 

komentarz 23 sierpnia 2017 przez niezalogowany
To co napisałem rozwiązało mi problem w poziomie. Został jeszcze brakujący pixel w pionie.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
3 odpowiedzi 664 wizyt
pytanie zadane 19 lutego 2017 w C i C++ przez Munvik Dyskutant (9,350 p.)
0 głosów
1 odpowiedź 196 wizyt
0 głosów
4 odpowiedzi 602 wizyt
pytanie zadane 24 maja 2018 w Nasze projekty przez Maciej Szostak Początkujący (290 p.)

92,552 zapytań

141,399 odpowiedzi

319,533 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...