Cześć,
Proszę, wytłumacz mi o co Ci chodzi
czy można zrobić wskaźnik który będzie sam w sobie zmieniał kolor danego sf::Text ?
Dla mnie brzmi jak fragment poezji Cypriana Kamila Norwida
Wskaźnik może wskazywać na zmienną/tablicę zmiennych lub funkcję, a wskaźnik który sam w sobie będzie zmieniał zmienną to coś nowego dla mnie :D
Stworzyłeś funkcję która chyba miała zmieniać kolor, i pewnie działała, ale nie jest ona wydajna, choćby dlatego, że tworzysz w niej niepotrzebny obiekt klasy sf::Text, a argumentem funkcji jest cała tablica tekstów zamiast jednego...
Pozwoliłem sobie poprawić kod, tak byś sam mógł zauważyć błędy lub ewentualne poprawki wydajności.
#include <SFML\Graphics.hpp>
#include <iostream>
void changeColor(sf::Text& text)
{
static bool isRed = true;
if(isRed)
{
text.setColor(sf::Color::Green);
isRed = false;
}
else
{
text.setColor(sf::Color::Green);
isRed = true;
}
}
int main()
{
sf::RenderWindow window(sf::VideoMode(1024, 768), "SFML 2.2");
sf::Font s;
if (!s.loadFromFile("arial.ttf"))
{
//wg mnie tutaj program powinien się kończyć
//bo dalej tylko masz błędny obiekt font i program się wysypie
//przy próbie narysowania tekstu lub nic się nie pojawi
std::cout << "BLAD!";
//return 0; //w razie czego wystarczy odkomentować
}
sf::Text tekst[3];
for (int i = 0; i <= 2;i++)
tekst[i].setFont(s);
tekst[0].setString("Nowa Gra");
tekst[1].setString("Wczytaj");
tekst[2].setString("Zapisz");
tekst[0].setPosition(412, 10);
tekst[1].setPosition(412, 70);
tekst[2].setPosition(412, 130);
int pos = -1;
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
if (event.type == sf::Event::KeyPressed)
{
if(event.key.code == sf::Keyboard::S) //eventy dla S (menu w dół)
{
for (int i = 0; i <= 2; i++) //wyzeruj wszystkie kolory
tekst[i].setColor(sf::Color::White);
if (++pos == 3) pos = 0; //zmień tylko aktualny kolor na którym jesteś
text[pos].setColor(sf::Color::Green);
}
if(event.key.code == sf::Keyboard::E)
{
std::cout << "włączam opcję nr" << pos + 1 << std::endl; //pos + 1 bo adresowanie od 0
}
}
}
window.clear(); //wyczyść okno
for (int i = 0; i <= 2; i++)
window.draw(tekst[i]); //narysuj tekst
window.display(); //wyświetl okno
}
}
Napisałem funkcję do zmiany koloru, wystarczy podać obiekt klasy sf::Text i przy każdym kolejnym wywołaniu powinien zmienić kolor ale nie testowałem jej więc nie wiem czy działa.
Uwaga, nie kompilowałem i nie uruchamiałem kodu, pisałem wszystko z pamięci w notatniku więc zastrzegam sobie uwag dotyczących błędów logicznych lub składniowych.