Ich weiß leider nicht, wie sich SFML genau verhält: wird das Zeichnen mit einem festen Skalierungsfaktor (bspw. 1:1 oder 128:1) durchgeführt oder ist die Skalierung abhängig von der Fenstergröße? Oder anders gefragt: wenn du das Fenster skalierst, verändert sich der Dargestellte Inhalt oder behält er die gleiche Größe bei?
Sollte eine Skalierung abhängig von der Fenstergröße durchgeführt werden, musst du das natürlich auch bei der Darstellung/Abfrage berücksichtigen.
Hey Sacaldur, beim Skalieren werden Grafiken entsprechend gestaucht oder gedehnt. Ja, genau das versuche ich gerade irgendwie
@Koschi Danke erstmal für den Vereinfachungsvorschlag sieht super aus. Leider ist bei meinem ersten schnellen Test damit ein Fehler aufgetreten "Keine Instanz von Überladene Funktion "sf::Rect<T>::contains [mit T=float]" stimmt mit der Argumentliste überein."
Edit:
Wird eigentlich der Code nur 1 mal aufgerufen oder jedes mal wenn die Fenstergröße sich ändert bzw. in jeder Update-Methode?
Alle gezeigten Codeabschnitte befinden sich in einer Schleife.
Verstehe ich das Richtig du Skalierst den Inhalt wenn sich die Fenstergröße ändert?
Da wäre Interesannt zu wissen ob dies über den sf::View machst oder den Inhalt selber skalierst?
Übrigens unter Skalieren verstehe ich jetzt nicht den Button in der Mitte des Fensters zu halten.
Ok du hast recht ich drücke mich unklar aus. Der Button soll an einer Position gehalten werden zusammen mit seiner Hitbox. Beim skalieren durch das Fenster (was SFML ja von haus aus kann) verschiebt sich eben genau diese Hitbox. Das Stauchen der Grafiken möchte ich in Zukunft noch angehen, dass ich da lieber den Bildausschnitt vergrößer oder verkleiner anstatt die Stauchung in Kauf zu nehmen. Damit habe ich aber noch keinerlei erfahrung und werd das mal in Ruhe erörtern müssen. Soll hier aber auch nicht thema sein, sofern nicht notwendig für die Hitbox handhabung.
Hab mal den ganzen Code der main() kopiert. Bitte nicht über die Unordnung wundern, ich habe da erstmal jede menge zeug reingepackt um einfach mal die Grundfunktionen von SFML an meinen Teampartner zu vermitteln. Aber vielleicht liegt genau in der unordnung ja auch der Fehler, nur sehe ich ihn halt nicht.
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
int main()
{
sf::RenderWindow window(sf::VideoMode(1600, 900), "TITEL");
window.setFramerateLimit(200);
GameSprite spBackground("data/graphics/MenüBack.png");
spBackground.Sprite.setScale(window.getSize().x / spBackground.Sprite.getLocalBounds().width, window.getSize().y / spBackground.Sprite.getLocalBounds().height);
GameSprite spEditorButton("data/graphics/EditorButton.png");
spEditorButton.Sprite.setPosition(window.getSize().x/2-spEditorButton.Sprite.getGlobalBounds().width/2, window.getSize().y / 2 - spEditorButton.Sprite.getGlobalBounds().height / 2);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
//kommt beschriebener fehler: if (spEditorButton.Sprite.getGlobalBounds().contains(sf::Mouse::getPosition(window)));
if (sf::Mouse::getPosition(window).x >= spEditorButton.Sprite.getGlobalBounds().left &&
sf::Mouse::getPosition(window).x <= spEditorButton.Sprite.getGlobalBounds().left + spEditorButton.Sprite.getGlobalBounds().width &&
sf::Mouse::getPosition(window).y >= spEditorButton.Sprite.getGlobalBounds().top &&
sf::Mouse::getPosition(window).y <= spEditorButton.Sprite.getGlobalBounds().top + spEditorButton.Sprite.getGlobalBounds().height) {
spEditorButton.Sprite.setColor(sf::Color(255, 255, 255, 255));
if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) {
spBackground.Texture.loadFromFile("data/graphics/EditorGuiBack.png");
spBackground.Sprite.setTexture(spBackground.Texture);
}
}
else spEditorButton.Sprite.setColor(sf::Color(150, 150, 150, 255));
window.clear();
window.draw(spBackground.Sprite);
window.draw(spEditorButton.Sprite);
window.display();
}
return 0;
}
|