Fenster skalieren

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Zwer99

Betreff: Fenster skalieren

BeitragDi, Nov 08, 2011 17:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

Ich habe folgendes Problem:
Mein Spiel läuft mit einer Auflösung von 1280 x 800, jedoch lässt sich das Spiel nicht auf einem Netbook starten, da die Auflösung zu hoch ist Sad

Ich kann jetzt nicht einfach alles um einen gewissen Wert herunterskalieren, da Objekte an fixe Positionen am Bildschirm platziert werden. Ich habe die Idee alle Positionen durch eine Funktion mit dem Skalierungsfaktor zu berechnen, aber das ist mir zu umständlich.

Per Zufall habe ich bemerkt, dass, wenn ich meinen PC an einen Beamer hänge und dort die Auflösung auf 1280 x 800 stelle, den Laptop schließe, den Beamer ausstecke und dann den Laptop wieder öffne (also zurück zum Anmeldebildschirm) und die Auflösung wieder bei noch immer gestarteten Spiel wieder umstelle, plötzlich das Fenster des Spiels um den Faktor der Auflösungen vergrößert bzw. verkleinert wurde.

Also muss es folglich eine Möglichkeit geben (wahrscheinlich mit der WinAPI) ein Fenster wirklich zu skalieren, ohne etwas im Programm ändern zu müssen. Leider habe ich von der WinAPI keine Ahnung. Es wäre nett, wenn mir jemand helfen könnte Wink



Dankeschön,

Zwer99
1. Platz: BAC #126 BAC #60 | 2.Platz: BCC #36 | 3. Platz: BCC #18 | Pfurz: BCC #20

Ovion Entertainment
 

jsp

BeitragDi, Nov 08, 2011 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau dir doch mal den Befehl SetVirtualResolution( width#,height# )
Logic Gui Professional a Gui Designer for MaxGui

Lobby

BeitragDi, Nov 08, 2011 17:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Dazu noch ein kurzes Beispiel:

BlitzMax: [AUSKLAPPEN]
SuperStrict

Graphics(400, 300)
SetVirtualResolution(800, 600)
Local timer:TTimer = TTimer.Create(60)

While(Not(KeyHit(KEY_ESCAPE) Or AppTerminate()))
Cls()

SetScale(2, 2) 'Damit man den Text noch lesen kann
DrawText("Virtual resolution: " + VirtualResolutionWidth() + "x" + VirtualResolutionHeight(), 0, 0)
SetScale(1, 1)
DrawRect(VirtualMouseX(), VirtualMouseY(), 200, 200)

Flip()
timer.Wait()
Wend


Sicher, Du wirst einige Änderungen in deinem Code vornehmen müssen (z.B. MouseX() zu VirtualMouseX() abändern usw., falls Du das nicht wrappen lassen willst), aber im Endeffekt sollte das doch die sinnvollste Lösung für dein Problem sein.
 

Zwer99

BeitragDi, Nov 08, 2011 18:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hui!

Das ist schon ein ziemlich gutes Ergebnis und ich muss nicht einmal eine Änderung machen! Dankeschön!

Nur leider scheint der Befehl das Fenster selbst nicht zu skalieren, wisst ihr, was ich meine?

Aber auch wenn es keine andere Möglichkeit gibt, dann bin ich damit eigentlich schon ziemlich zufrieden Smile
1. Platz: BAC #126 BAC #60 | 2.Platz: BCC #36 | 3. Platz: BCC #18 | Pfurz: BCC #20

Ovion Entertainment

Der Eisvogel

BeitragDi, Nov 08, 2011 19:18
Antworten mit Zitat
Benutzer-Profile anzeigen
SetVirtualResolution ist die bessere Wahl für dich. Du musst halt einfach bei Graphics ein kleineres Fenster erstellen.

Ansonsten hast du Recht, man kann mittels WinAPI die Größe eines Fensters ändern. Der Befehl dazu lautet SetWindowPos. Allerdings ist dadurch das Bild nicht skalliert, sondern "verzehrt", bzw sieht es nicht so schön aus wie mit SetVirtualResolution. Deswegen würde ich dir von dieser Methode abraten.

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
 

Zwer99

BeitragDi, Nov 08, 2011 19:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber ich könnte theoretisch folgendes machen:

Ich habe eine Auflösung von 1280 x 800. Alles ist auf diese Auflösung ausgelegt und ich möchte "kleinere" Auflösungen unterstützen.

Also könnte ich mit SetVirtualResolution 1280*2, 800*2 auf ein Viertel reduzieren (so als Beispiel) und dann mit der WinAPI das Fenster verkleinern.

Weil auf größeren Bildschirmen ist es doch egal, wenn man auf einem kleinen Bildschirm spielt Smile

@Eisvogel: Wie müsste ich das in BlitzMax genau eingeben, wenn ich auf die WinAPI zugreifen möchte? Weil ausprobieren wäre trotzdem nicht schlecht Wink
1. Platz: BAC #126 BAC #60 | 2.Platz: BCC #36 | 3. Platz: BCC #18 | Pfurz: BCC #20

Ovion Entertainment

BtbN

BeitragDi, Nov 08, 2011 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Setz halt die VirtualResolution auf die, die dein Code erwartet, und ändere die Tatsächliche des Fensters. Dann benutz du das system auch so, wie es gedacht ist.

Der Eisvogel

BeitragDi, Nov 08, 2011 20:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Einbinden eines Befehls aus der WinAPI erfolgt über einen Extern-Block nach dem folgenden Schema:
BlitzMax: [AUSKLAPPEN]
Extern "Win32"
Function DeineFunktion:Typ(param1:Typ, param2:Typ, ...)
End Extern


Infos zu SetWindowPos findest du auf MSDN. Bedenke, dass du hier auch den Fensterrahmen und die Titelleiste bei der Skalierung berücksichtigen musst.
Aber ich würde dir dringend empfehlen die BlitzMax eigene Skalierung zu nutzen, da sie besser ist. Dazu erstellst du einfach ein Grafik-Fenster in der Größe, die du haben willst und setzt die virtuelle Auflösung auf deine 1280*800. Das ist das einfachste und es ist Plattformunabhängig.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
 

PhillipK

BeitragDi, Nov 08, 2011 20:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn mich nicht alles täuscht, könntest du trotzdem diverse probleme kriegen.
Nun, du hast 1280 x 800 als auflösung, auf die du dein Programm auslegst.
Wenn nun jemand daher kommt und gerne zb 16:10 oder 4:3 als auflösung nutzen möchte, KÖNNTE das funktionieren.
Schöner wäre es allerdings, wenn du solche geschichten mit einplanst, und - zumindest für jedes seitenverhältnis - ein Set zusammenprogrammierst.

Wenn mich nicht alles irrt, musst du am ende nurnoch mit Graphics ein XYZ großes fenster erstellen und - je nach seitenverhältnis - die auflösung einstellen.

Beispiel:
Graphics 800,600 - SetVirtualResolution(1024, 768)
Graphics 1920, 1080 - SetVirtualResolution(1280, 720) 'odersowas Very Happy
Graphics 1024, 768 - SetVirtualResolution(1024,768)

Das heißt im klartext: Wähle eine auflösung, auf die du deine Seitenverhältnisse, die du unterstützen magst, trimmst - und egal welche auflösung eingestellt ist, setze die Virtuelle auflösung auf eben diese Optimierte variante.
(wenn ich nicht ganz blöd bin, sollte es so funktionieren. Wichtig ist am ende nurnoch, das du zb Mousex() durch VirtualMouseX() ersetzt.)
 

Zwer99

BeitragMi, Nov 09, 2011 0:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Jea!!!

Danke an alle! Es funktioniert alles wunderbar!
Ich hätte wirklich nicht gedacht, dass es so einfach geht Wink

Blöder Denkfehler mit den Auflösungen von mir: Ist doch logisch, dass man das Fenster auf die gewünschte Größe einstellen muss Laughing

Naja, jetzt funktionierts und ich bin froh darüber Smile
Thx, nochmal


Zwer99
1. Platz: BAC #126 BAC #60 | 2.Platz: BCC #36 | 3. Platz: BCC #18 | Pfurz: BCC #20

Ovion Entertainment

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group