Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Encounter

Frischling

  • »Encounter« ist der Autor dieses Themas

Beiträge: 22

Wohnort: Aachen

  • Private Nachricht senden

11

30.03.2016, 22:03

Ich werde vermutlich ohnehin mit dem View später arbeiten, aber ich versuchte halt trotzdem zu verstehen wieso das hier nicht so geht wie ich denke das es gehen müsste.
Ich habe mal ein paar Bilder gemacht, die Hitbox ist immer in der Mitte nach meiner letzten gesendeten Code Änderung, aber der Button wandert halt.(Mit View klappt es korrekt, da müsste ich dann nur das Hintergrundbild noch mit skalieren, aber ich verstehe halt nicht wieso es nicht auch so geht, da ich ja die Positionen eigentlich anpasse)

Eigentlich frage ich doch die neue Fenstergröße ab und setzte den Sprite wieder in die Mitte, mit dem Scale möchte ich den Sprite wieder auf Normalgröße setzen so dass das automatsische Stauchen zurückgesetzt ist. (Theoretisch müsste ich also bei einem winzige Fenster einen Button haben, der das ganze Fenster ausfüllt.

Vielleicht helfen die Screenshoots um mein Problem zu verstehen:


(Link)


(Link)


(Link)
Ich war hier und hab ALLES gesehen!

12

30.03.2016, 22:16

Mir fällt aktuell nur noch ein, jeden schleifen durchlauf die Position zu setzten.

Ich weiß nicht wann das ResizeEvent greift, bei der ersten Änderung der Größe oder beim abschluss der altion.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Encounter

Frischling

  • »Encounter« ist der Autor dieses Themas

Beiträge: 22

Wohnort: Aachen

  • Private Nachricht senden

13

30.03.2016, 22:24

Zitat

Mir fällt aktuell nur noch ein, jeden schleifen durchlauf die Position zu setzten.

Hatte ich auch schon probiert, leider selbes Ergebnis.

Vielen Dank für die hilfreichen Kommentare und die Mühe. Ich werde jetzt erstmal mit View arbeiten und dann eben alles manuell skalieren.

Das Resize Event greift immer beim händichen größer/kleiner ziehen. Auch das Ziehen an einen seitlichen oder den oberen Rand stellt kein Problem dar. Nur per vergrößern durch den Maximize button oder doppelklick auf die Titelleiste verhält es sich anders und es wird alles einfach gestreckt.

Wenn noch jemand weiß wo ich vielleicht einen Denkfehler bezüglich der beiden Probleme habe, kann hier ja noch drunterschreiben.
Ich war hier und hab ALLES gesehen!

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

14

31.03.2016, 05:06

Für mich sieht es so aus, als würde durch das eigenartige Strecken und Stauchen des Fesnterinhalts der Fehler zu Stande kommen.
Einerseits hast du die "SFML"-Koordinaten (vermutlich durch die Initialisierung bedingt), die sich durch ein Skalieren des Fensters verändern (im Vergleich zu den Pixel-Koordinaten des Fensters).
Und andererseits gibt es die absoluten Koordinaten auf dem Fenster, die durch die Skalierung nicht verändert werden.
Wahrscheinlich wird der Button anhand der Fenstergröße positioniert, nur werden die Pixelkoordinaten in die "SFML"-Koordinaten uminterpretiert, was zu dem sichtbaren Fehlverhalten führt.
Du müsstest auf jeden Fall dafür sorgen, dass bei einem Skalieren des Fensters auch die neuen Ausmaße übernommen werden, da ein verzerrtes Programm keinen Mehrwert bringt (soll heißen: da kann man sich sonst auch einfach auf feste Auflösungen beschränken).
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Encounter

Frischling

  • »Encounter« ist der Autor dieses Themas

Beiträge: 22

Wohnort: Aachen

  • Private Nachricht senden

15

31.03.2016, 09:24

Hey Sacaldur,

Ich glaube du hast mit deinem Ansatz recht. Ich habe es jetzt für mich so gelöst, dass ich die View Funktion nutze und dann manuell die View Distanz einstelle.

Allerdings habe ich noch immer das Problem, dass durch das Maximieren durch den Button oder doppelklick auf die Titelleiste meine Resize Abfrage nicht aufgerufen wird.
Ebenso verhält es sich, wenn ich das Fenster per window.setSize verändere. Da muss ich nochmal schauen ob ich das irgendwie abfragen kann.

Mit folgender Bedingung frage ich das bisher ab.

C-/C++-Quelltext

1
if (event.type == sf::Event::Resized){...}
Ich war hier und hab ALLES gesehen!

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

16

31.03.2016, 09:57

Und andererseits gibt es die absoluten Koordinaten auf dem Fenster, die durch die Skalierung nicht verändert werden.
Wenn ich mich recht erinnere, ist diese Annahme verkehrt. Der aktuelle View des Windows hat meines Wissens nach sehr wohl Einfluss auf die Maus-Koordinaten. Das heißt bei einem View von 800x600 ist die untere rechte Maus-Ecke immer (799/599), egal wie das Fenster gestreckt oder gestaucht wird.

da ein verzerrtes Programm keinen Mehrwert bringt
Das ist höchst subjektiv. Es kann durchaus sinnvoll sein, dass das Programm mit skaliert. Letterboxen wären zwar eine schönere Lösung für die Beibehaltung der Aspect-Ratio, aber Skalieren / Verzerren an sich, halte ich erstmal nicht für generell schlecht. Unter Umständen sogar ein Mehrwert.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Encounter

Frischling

  • »Encounter« ist der Autor dieses Themas

Beiträge: 22

Wohnort: Aachen

  • Private Nachricht senden

17

31.03.2016, 10:18

Ich war doof...

Logisch das es mein Fehler war und man sollte immer vollständigen Code posten :D
Ich hab so sehr versucht den Fehler an Ort und Stelle zu suchen, dass ich nicht gesehen habe, dass meine if abfrage ja gar nicht in der pollEvent Schleife ist -.-
So klappt dann auch das maximieren per Button, doppelklick und setSize.

Edit: Danke nochmal an alle mit euren Hilfeversuchen. Ich bin immer wieder überrascht wie freundlich, nett und hilfsbereit hier alle sind.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
//FALSCHE VERSION (Ich war so blind)
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        if (event.type == sf::Event::EventType::Resized)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
//So gehts RICHTIG (logischerweise)
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();

            if (event.type == sf::Event::EventType::Resized)
            {

            }
        }
Ich war hier und hab ALLES gesehen!

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

18

31.03.2016, 13:41

Das heißt, dass durch das Skalieren keine Verzerrungen mehr auftreten (und das Problem deshalb nicht mehr auftritt)?


@BlueCobold:
Dass die Annahme über die Mauskoordinaten falsch ist, kann durchaus sein. Ich habe anhand des Codes nur gesehen, dass die Mauskoordinaten relativ zum Fenster abgerufen wurden, von einem Viewport war allerdings nichts zu sehen. [Nachtrag: Damn, es bezog sich auf eine andere Stelle. Dennoch wird dort window.getSize() abgerufen, was wahrscheinlich die tatsächliche Fenstergröße in Pixel liefert. Da hatte ich zwischendurch wohl zu sehr auch an andere Threads mit vergleichbaren Problemen gedacht...]

Um es nochmal zu verdeutlichen (auch wenn ich eher den Eindruck habe, dass du es schon richtig verstanden hast): mit "verzerrt" meine ich Skalierungen, die das Seitenverhältnis nicht berücksichtigen.
Letterboxing ist eine möglich Alternative, die meiner Meinung nach schon besser ist, es gibt aber auch andere Möglichkeiten.
Mich würden durchaus Beispiele dafür interessieren, unter welchen Umständen ein verzerrtes Bild eine gute Option darstellt. (Da das aber wahrscheinlich zu offtopic werden würde, wären PNs dafür wohl besser geeignet.)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

19

31.03.2016, 13:45

Mich würden durchaus Beispiele dafür interessieren, unter welchen Umständen ein verzerrtes Bild eine gute Option darstellt.
Standard-TGGC-Antwort: Tetris. Beste Ausnutzung des Platzes, wozu das Bild durch Letterbox unnötig klein halten? ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

20

31.03.2016, 13:51

Dem kann ich nur teilweise zustimmen. Beim Inhalt (also bei den Blöcken) kann man durchaus überlegen, diese gestreckt/gestaucht darzustellen, das UI sollte aber idealerweise nicht betroffen sein. (-> ein Verzerren des gesamten Inhalts wäre also nicht wünschenswert.)
Aber auch bei Tetris kommt es wieder darauf an, wie ausgestaltet die Blöcke sind. Einfache Blöcke (Rahmen + einfarbige Füllung) eignen sich dafür, weiter ausgestaltete (mit Mustern, Symbolen o. ä.) aber nicht.
Und es ist auch eine Geschmacksfrage, ob man in seinem Tetris Blöcke zulassen möchte, die ggf. 1x2 Ausmaße haben.

(Und ich habe meinen letzten Beitrag zwischenzeitlich leicht angepasst.)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Werbeanzeige