"Graphics" zur Laufzeit ändern

Übersicht BlitzBasic FAQ und Tutorials

Neue Antwort erstellen

DivineDominion

Betreff: "Graphics" zur Laufzeit ändern

BeitragSo, Aug 22, 2004 2:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Kam auch schon etwas öfter in letzter Zeit.

Also man kann den Grafikmodus ändern.
Dafür gibt es keinen extra Befehl, man ruft einfach Graphics neu auf. Damit ist die Sache aber nicht erledigt, denn "Graphics" oder "Graphics3D" initialisieren DirectX neu. Damit ist alles, was man vorher mal "geladen" hat, wieder weg.
Man muss also alle Bilder neu laden, Modelle, Texturen, ...

Das ganze könnt ihr machen indem ihr am Anfang des Programmes alle nötigen Mediendateien global setzt aber noch keinen Wert vergebt und dann eine Funktion aufruft, wie z.B. Init(). Dort ladet ihr dann die Dateien und könnt sie verwenden.
Alternativ macht ihr es auf einer schneller dahingeschmierte, aber bestimmt nicht hübschere Art:

Code: [AUSKLAPPEN]

;Startwerte
Global Modus = 2
Global Bild

;Sprungmarke
.Start
Graphics 800, 600, 0, Modus

;!!! Mediendateien ALLE neu laden !!!

;Bild erstellen und mit Rechteck füllen
Bild = CreateImage( 100, 100 )
SetBuffer ImageBuffer( Bild )
Rect 0, 0, 100, 100
SetBuffer FrontBuffer(  )

;Malen
DrawImage Bild, 0, 0

;Warten
WaitKey(  )

;Beim zweiten mal beenden
If Modus = 1 Then End

;Ansonsten in Vollbild schalten und Bilder löschen (Damit nicht zuviel speicher versemmelt wird)
Modus = 1
FreeImage Bild
Goto Start


Hier werden alle Startwerte etc. Vor dem Graphics gesetzt. Direkt davor kommt dann eine Sprungmarke, die man mit GOTO ansprechen kann. Man läd also erstmal alles und zeigt es an, dann, nach Tastendruck, wechselt man den Modus von Fenster auf Vollbild und löscht das Bild aus dem Speicher. Das ist wichtig, das muss man auch mit allen Sounds und Modellen machen, weil sonst der alte Speicher nicht freigegeben wird und so erstmal nutzlos besetzt ist.

Schließlich springt man an den Start zurück, mit dem neuen Bildschirmmodus im Gepäck und initialisiert auch das Bild neu.
Wenn ihr eine Minute zum Starten eures Spieles braucht, weil die Dateien so groß sind die ihr laden müsst, so wird es mit großer Sicherheit ebenso lange dauern wenn ihr den Modus neu setzt. Es ist so als würdet ihr einfach das Programm neustarten.

Include-Anweisungen, die ja für gewöhnlich nur Variablenwerte, Kosntanten, Typedefinitionen, Arrays und Funktionen enthalten und den Code nicht wesentlich durch ihre schiere existenz beeinflussen, sollten VOR die Sprungmarke. Möglicherweise macht es aber auch nichts, wenn man das danach macht. Bin mir aber nicht 100%ig sicher, wie es ist wenn man Types nochmal setzt und die BB da arbeitet. Einfach mal ausprobieren, könnt ihr ja für euch ausmachen.

Viel Erfolg mit eurem Moduswechsel. Empfehlenswert ist weiterhin das Erstlellen einer Config-Datei in denen diese Daten stehen, aber das mal außen vor Smile
christian.tietze@gmail.com - https://christiantietze.de
macOS
  • Zuletzt bearbeitet von DivineDominion am Mo, Aug 23, 2004 22:32, insgesamt einmal bearbeitet
 

Dreamora

BeitragSo, Aug 22, 2004 13:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja aber es bringt neulinge schon von Anfang an auf den falschen Pfad.

Es gibt 2-3 Gebiete wo Goto seine existenzberechtigung hat weil Subs / Functions den Algorithmus sehr komplex wirken lassen. Aber ansonsten gibt es eigentlich keinen Grund für Goto

Darum hier der goto freie Code

Code: [AUSKLAPPEN]

;Startwerte
Global Modus = 2
Global Bild

gosub Start

while Modus <> 1
;Malen
DrawImage Bild, 0, 0

;Warten
WaitKey(  )

;Beim zweiten mal beenden
If Modus = 1 Then End

;Ansonsten in Vollbild schalten und Bilder löschen (Damit nicht zuviel speicher versemmelt wird)
Modus = 1
FreeImage Bild
Gosub Start
end while

end

; Sub
.Start
Graphics 800, 600, 0, Modus

;!!! Mediendateien ALLE neu laden !!!

;Bild erstellen und mit Rechteck füllen
Bild = CreateImage( 100, 100 )
SetBuffer ImageBuffer( Bild )
Rect 0, 0, 100, 100
SetBuffer FrontBuffer(  )
return
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

DivineDominion

BeitragMo, Aug 23, 2004 22:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Sachew mit Sounds hab ich gefixt, danke Smile

Dieser GOTO-Kram war zum veranschaulichen gedacht. Ich hätte das eher so gemacht, für ein echtes Projekt:

Code: [AUSKLAPPEN]

Init( 640, 480, 0, 2 )

While Not Keyhit( 1 )
  Cls

  if Keyhit( 27 ) then Init( 800, 600, 0, 1 )

  UpdateGfx(  )

  Flip
Wend

Function Init( W, B, D, M )
  ;Bilder ggf. FREE'n

  Graphics W, B, D, M
 
  ;Bilder etc. laden
End Function


Fände mich so hübscher. Smile

Was soll EndGraphics() sein? FreeImage und so?
christian.tietze@gmail.com - https://christiantietze.de
macOS

wunderkind

BeitragMo, Aug 23, 2004 23:32
Antworten mit Zitat
Benutzer-Profile anzeigen
http://www.blitzbase.de/befehle2d/endgraphics.htm
http://www.blitzbasic.com/b3dd...ref=2d_a-z

BladeRunner

Moderator

BeitragDi, Aug 24, 2004 13:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Und zum "Lanzebrechen" für Endgraphics() welcher ja eigentlich vollkommen unbekannt ist und von den meisten als unnütz angesehen wird:
Vor kurzem wurde gefragt ob man in einem laufenden Programm vom Fenster- in den Vollbildmodus wechseln kann.
Das geht nicht so ohne weiteres:
Code: [AUSKLAPPEN]
Graphics 640,480,16,1
waitkey()
Graphics 640,480,16,2
waitkey()
end

Dieser Code führt zu einem "Unable to set GraphicsMode"-Error.
Durch einfügen von Endrgraphics jedoch, also:
Code: [AUSKLAPPEN]
Graphics 640,480,16,1

waitkey()
EndGraphics() ;jo, check that!
Graphics 640,480,16,2
waitkey()
end

wird es Lauffähig. Ich bin nu was DX angeht wirklich nit ein Crack, vermute aber dass Endgraphics() einige CleanUps vornimmt ohne die Graphics beim neuerlichen Aufrufen ins Trudeln gerät.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Neue Antwort erstellen


Übersicht BlitzBasic FAQ und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group