Seite 5 von 5

Verfasst: 30.07.2008 10:51
von Kaeru Gaman
> worum es Kaeru hierbei ja geht.
richtig

> den Kunden entscheiden lässt
genau

> Also fragen wir ihn mit einem Requester welchen Screenmodus er gerne
> hätte und mit welcher Frequenz

und genau da kommen wir zum Kernpunkt.
sieh dir die Listen an die alle gepostet wurden.

Als Endbenutzer hätten wir doch alle einen Hals,
wenn uns ein billiger Mini-Requester entgegenpoppen würde,
bei dem wir in einem einzigen Dropdown aus 180 Modes wählen müssen.

wie man an den Listen mit hoher Gesamtzahl auch sieht,
diese Modes stehen nicht unbedingt in einer sehr übersichtlichen Ordnung,
die unbearbeitete Liste die ExameScreenModes() zurückgibt ist also nichts,
was man einem Kunden vor die Nase setzen kann.

Hier entsteht dann die Frage, wie teile ich sie sinnvoll auf, was schmeiße ich raus,
damit ich im endeffekt meinem Kunden nur 3-8 Modes im Dropdown anbiete (Übersichtlichkeit!)
und vielleicht noch einen "Erweitert" button, hinter dem er Wide/Normal umschalten kann und die Refreshrate wählen.

das wäre mein momentanes Ziel für Verfahren 1.)

wie gesagt, das hat keine high-priority, also ich setz mich jetzt nicht heute
sechs stunden hin und stricke das fertig (was ich könnte wenn ich bock hätte)
sondern mach das mehr so nebenbei immer mal wenn ich bock habe etwas.

insgesamt denke ich aber, dass die öffentliche Diskussion jedem von uns
der hier mitmacht und der mal was mit Screen macht zusätzliche
Informationen bietet, damit sein nächstes Projekt besser werden kann.

Verfasst: 30.07.2008 11:19
von Danilo
Kaeru Gaman hat geschrieben:und genau da kommen wir zum Kernpunkt.
sieh dir die Listen an die alle gepostet wurden.

Als Endbenutzer hätten wir doch alle einen Hals,
wenn uns ein billiger Mini-Requester entgegenpoppen würde,
bei dem wir in einem einzigen Dropdown aus 180 Modes wählen müssen.

wie man an den Listen mit hoher Gesamtzahl auch sieht,
diese Modes stehen nicht unbedingt in einer sehr übersichtlichen Ordnung,
die unbearbeitete Liste die ExameScreenModes() zurückgibt ist also nichts,
was man einem Kunden vor die Nase setzen kann.
Die Liste kannst Du sortieren, kein Ding.

Und dann stellt natürlich niemand eine Liste mit 180 Einträgen dar.
Erstmal kannst Du alles unterhalb Deiner Minimalanforderung fürs
Spiel weglassen. Ist diese z.B. 800x600, dann sieht die letzte Liste
von C4rizz zum Beispiel so aus:

Code: Alles auswählen

800x600  |   8bit |  60Hz
848x480  |  16bit |  75Hz
960x600  |  32bit | 100Hz
1024x768 |
1152x864 |
1280x720 |
1280x768 |
1280x800 |
1280x960 |
1280x1024|
1360x768 |
1400x900 |
1440x900 |
1600x900 |
1600x1024|
1600x1200|
Die erste Reihe ist meist eine Listbox mit Scrollbars, 5-6 Einträge sichtbar,
der Rest durch scrollen.
Die nächsten 2 könnten auch Comboboxen sein, oder eben auch Listboxen.

Als erster Schritt ist nur die Modes-Liste enabled.
Wird ein Modus ausgewählt, wird in der internen Liste aller Modi geschaut
welche Farbtiefen für *diesen* Modus verfügbar sind, ins 2. Gadget eingetragen,
und zur Auswahl freigegeben. Danach wird geschaut welche Hz mit XxYxBPP
verfügbar sind und das 3. Gadget gefüllt und zur Auswahl freigegeben.
Beim 2. und 3. Gadget kannst Du default immer das höchste Verfügbare
anwählen, beim 1. was Dir beliebt (z.B. 1024x768 wenn vorhanden).

Das sollte doch zu bewältigen sein?

Du kannst dazu vielleicht auch mal -als Anregung- ein Spiel anschauen,
bei dem vorm Start so ein Optionen-Dialog kommt.
Kaeru Gaman hat geschrieben:insgesamt denke ich aber, dass die öffentliche Diskussion jedem von uns
der hier mitmacht und der mal was mit Screen macht zusätzliche
Informationen bietet, damit sein nächstes Projekt besser werden kann.
:allright:

Verfasst: 30.07.2008 12:11
von Kaeru Gaman
> Das sollte doch zu bewältigen sein?

ja klar, ich hab nur heut keinen bock ein paar stunden zu coden. :lol:
kommt vielleicht noch. Bild


> Die Liste kannst Du sortieren, kein Ding.
Sortieren alleine genügt nicht, Aussondern muss auch stattfinden.
hier sind mehrere Beispiele gefallen, wo insgesamt über hundert Modi zur Verfügung stehen.


deine Anregung geht schon ziemlich in die Richtung die ich wollte,
allerdings schwebt mir durchaus eine Begrenzung der Liste auf ein bestimmtes
Seitenverhältnis vor, das man zusätzlich per OptionButtons auswählen kann.
drei Optionen: Normal, Widescreen und Special,
wobei in Letzterem Hochkant und ähnliches aufgelistet wird.

Außerdem würde ich die Farbtiefen auf 16/32 begrenzen und 8bit komplett weglassen,
weil die mit einer komplett anderen Farbverwaltung arbeiten.
man braucht also entweder nur 8bit, oder man braucht 8bit garnicht.

die Refreshrate nun würde ich nicht von vorne herein anwählbar machen.
wenn man einfach nur einen Screen öffnet und der Befehl SetRefreshRate()
nicht verwendet, erstellt er ja auch einen Screen in einem brauchbaren Modus.
nur wenn dort wirklich Probleme auftauchen (flackern) muss der Benutzer umstellen,
dafür würde dann also ein Submenu genügen, damit der Durchschnittsnutzer
nicht versucht ist, daran rumzuschrauben wenn er noch kein Problem hat.


als Anregung hatte ich mir unter anderem den Beispielcode Screen3DRequester
angeschaut, der zwar ein paar features anbietet, aber im Endeffekt
doch nur rudimentäre Funktion und Listenverwaltung beinhaltet.

viele Beispiele professioneller Spiele die sehr unterschiedlich vorgehen sind mir bekannt und bewußt.

:allright:
THNX! :D

Verfasst: 30.07.2008 20:40
von Danilo
Kaeru Gaman hat geschrieben:als Anregung hatte ich mir unter anderem den Beispielcode Screen3DRequester
angeschaut, der zwar ein paar features anbietet, aber im Endeffekt
doch nur rudimentäre Funktion und Listenverwaltung beinhaltet.
Ist kein gutes Beispiel. ;)

Das Screen3DRequester sollte man so eh nicht verwenden, da dort Screens
immer mit 16bit geöffnet werden, weshalb die PB3D-Beispiele auch alle
nicht schön aussehen. Hab Fred schon darauf hingewiesen, als ich PB4.20
installierte und die Beispiele ausprobierte.

Hier mal noch ein schneller 15-Minuten-Ansatz:

Code: Alles auswählen

#BITS16 = 1
#BITS24 = 2
#BITS32 = 4

Structure ScreenModes
  Width.l
  Height.l
  Hz.s
  Bits.l
EndStructure

Global NewList ScreenModes.ScreenModes()

Procedure AddScreenMode(w,h,bpp,hz)
  ForEach ScreenModes()
    If ScreenModes()\Width = w And ScreenModes()\Height = h
      found = 1
      Break
    ElseIf ScreenModes()\Width > w Or ScreenModes()\Height > h
      InsertElement(ScreenModes())
      found = 1
      Break
    EndIf
  Next
  ;
  If Not found
      InsertElement(ScreenModes())
  EndIf
  ;
  ScreenModes()\Width  = w
  ScreenModes()\Height = h
  Select bpp
    Case 16 : ScreenModes()\Bits | #BITS16
    Case 24 : ScreenModes()\Bits | #BITS24
    Case 32 : ScreenModes()\Bits | #BITS32
  EndSelect
  ScreenModes()\hz + Str(hz)+"|" ; fuer zerlegen mit Stringfield |
EndProcedure

InitSprite()
n=0
If ExamineScreenModes()
  While NextScreenMode()
    Width  = ScreenModeWidth()
    Height = ScreenModeHeight()
    Depth  = ScreenModeDepth()
    Rate   = ScreenModeRefreshRate()
    If Width >= 800 And Height >= 600 And Depth >= 16 ; 15 Bits?
      AddScreenMode(Width,Height,Depth,Rate)
    EndIf
  Wend

  
  ForEach ScreenModes()
    With ScreenModes()
      out$ = RSet(Str( \Width ),4," ") + "x" + RSet(Str( \Height ),4," ")
      out$ + " BitMask: " + RSet(Bin( \Bits ),3,"0")
      out$ + " Hz: " + \Hz
      Debug out$
    EndWith
  Next
  
Else
  Debug "ExamineScreenModes failed!"
EndIf
Das sollte sortiert sein nach ScreenGröße. Ist aber halt nur eine schnell
zusammengehackte Idee zum einlesen. Irgendwie muß man ja mal anfangen... ;)

Meinen Vorschlag mit den 3 Gadgets solltest Du so easy umsetzen
und an Deine Ideen anpassen können. Du hast so eine sortierte Liste
mit allen Modes über 800x600, mit 16/24/32Bits und alle verfügbaren Refreshraten.

Verfasst: 31.07.2008 08:34
von Danilo
Und hier mal noch eine erweiterte und veränderte Version, mit der
man flexibel die Minimal- und eventuelle Maximalanforderungen der
Screenmodi angeben kann, sowie einen String mit allen erlaubten
ScreenModes:

Code: Alles auswählen

;
; by Danilo, 31th July 2008
;
#BITS8  = 1
#BITS16 = 2
#BITS24 = 4
#BITS32 = 8


Structure ScreenModes
  Width.l
  Height.l
  Hz.s
  Bits.l
EndStructure


Structure ScreenModePreferences
  minWidth.l     ; minimum requested screen width,  0 = not checked
  maxWidth.l     ; maximum requested screen width,  0 = not checked
  minHeight.l    ; minimum requested screen height, 0 = not checked
  maxHeight.l    ; maximum requested screen height, 0 = not checked
  minHz.l        ; minimum requested refresh rate,  0 = not checked
  maxHz.l        ; maximum requested refresh rate,  0 = not checked
  BitDepths.l    ; requested bit depth for the screen (this flag is required!),
                 ; can be a combination of the following flags: #BITS8 | #BITS16 | #BITS24 | #BITS32
  allowedModes.s ; string with only allowed screen modes after all other checks, "800x600,1024x768"; "" = not checked
EndStructure


Procedure.s bppToString(bits.l)
  Define retstring.s
  If bits&#BITS8 : retstring+"8/" : EndIf
  If bits&#BITS16: retstring+"16/": EndIf
  If bits&#BITS24: retstring+"24/": EndIf
  If bits&#BITS32: retstring+"32/": EndIf
  ProcedureReturn Mid(retstring,1,Len(retstring)-1)
EndProcedure


Procedure addScreenMode(sml.ScreenModes(),w,h,bpp,hz)
  Protected found.l
  ;
  ForEach sml()
    If sml()\Width = w And sml()\Height = h
      found = 1
      Break
    ElseIf sml()\Width > w Or sml()\Height > h
      InsertElement(sml())
      found = 1
      Break
    EndIf
  Next
  ;
  If Not found
      InsertElement(sml())
  EndIf
  ;
  sml()\Width  = w
  sml()\Height = h
  Select bpp
    Case  8: sml()\Bits | #BITS8
    Case 16 : sml()\Bits | #BITS16
    Case 24 : sml()\Bits | #BITS24
    Case 32 : sml()\Bits | #BITS32
  EndSelect
  If Not FindString(sml()\hz,Str(hz),1)
    If sml()\hz
      sml()\hz + ","
    EndIf
    sml()\hz + Str(hz)
  EndIf
EndProcedure


Procedure getScreenModeList(sml.ScreenModes(), *p.ScreenModePreferences )
   Protected Width.l, Height.l, Depth.l, Rate.l, bits.l
   ClearList(sml())
   If *p And ExamineScreenModes()
     While NextScreenMode()
       Width  = ScreenModeWidth()
       Height = ScreenModeHeight()
       Depth  = ScreenModeDepth()
       Rate   = ScreenModeRefreshRate()
       Select Depth
         Case 8 : bits = #BITS8
         Case 16: bits = #BITS16
         Case 24: bits = #BITS24
         Case 32: bits = #BITS32
         Default: bits = 0
       EndSelect
       If (*p\BitDepths & bits)
         If *p\minWidth  And Width  < *p\minWidth  : Continue : EndIf
         If *p\minHeight And Height < *p\minHeight : Continue : EndIf
         If *p\minHz     And Rate   < *p\minHz     : Continue : EndIf
         If *p\maxWidth  And Width  > *p\maxWidth  : Continue : EndIf
         If *p\maxHeight And Height > *p\maxHeight : Continue : EndIf
         If *p\maxHz     And Rate   > *p\maxHz     : Continue : EndIf
         If *p\allowedModes And FindString(*p\allowedModes,Str(Width)+"x"+Str(Height),1)=0 : Continue : EndIf
         addScreenMode(sml(),Width,Height,Depth,Rate)
       EndIf
     Wend
     ProcedureReturn #True
   Else
     ProcedureReturn #False
   EndIf
EndProcedure

;
;- Main
;
InitSprite()

NewList myScreenModes.ScreenModes()

prefs.ScreenModePreferences
prefs\minWidth = 800
;prefs\maxWidth = 1600
prefs\minHeight = 600
;prefs\maxHeight = 1200
prefs\BitDepths = #BITS16|#BITS24|#BITS32;|#BITS8
;prefs\minHz        = 60
;prefs\maxHz        = 100
;prefs\allowedModes = "800x600,1024x768,1280x1024,1600x1200"

If getScreenModeList( myScreenModes() , prefs )

  If Not CountList( myScreenModes() )
    Debug "no matching screen modes found!"
  Else
     ForEach myScreenModes()
       With myScreenModes()
         out$ = RSet(Str( \Width ),4," ") + "x" + RSet(Str( \Height ),4," ")
         out$ + " Depth: " + RSet( bppToString( \Bits ), 10, " ")
         out$ + "    Refreshrates: " + \Hz + " Hz"
         Debug out$
       EndWith
     Next
   EndIf
Else
  Debug "getScreenModeList failed"
EndIf
Oder?

Verfasst: 31.07.2008 11:18
von Kaeru Gaman
hmyoah...
800x 600 Depth: 16/32 Refreshrates: 60,72,75,56,56 Hz
1024x 768 Depth: 16/32 Refreshrates: 60,70,75,60,70,75 Hz
1280x1024 Depth: 16/32 Refreshrates: 60,60 Hz
800x 600 Depth: 16 Refreshrates: 60,72,75 Hz
die Ausgabe ist etwas doppelt und undurchsichtig....

Verfasst: 31.07.2008 11:38
von Danilo
Kaeru Gaman hat geschrieben:hmyoah...
800x 600 Depth: 16/32 Refreshrates: 60,72,75,56,56 Hz
1024x 768 Depth: 16/32 Refreshrates: 60,70,75,60,70,75 Hz
1280x1024 Depth: 16/32 Refreshrates: 60,60 Hz
800x 600 Depth: 16 Refreshrates: 60,72,75 Hz
die Ausgabe ist etwas doppelt und undurchsichtig....
Hmm... das zweimal 800x600 vorkommt, sollte nicht passieren,
und kann ich hier auch nicht nachvollziehen.

Verfasst: 31.07.2008 12:07
von Kaeru Gaman
auch dass in jeder zeile einige Hz-werte doppelt stehen ist etwas befremdlich.

ich werd aber heut nicht deinen code auseinanderpulen, vielleicht another day... ;)

wie gesagt, mir ging's primär darum, mehr background-info zu sammeln,
um irgendwann später wenn ich selber nen mode-requester schreibe,
weniger stolpersteine zu haben.

Verfasst: 31.07.2008 14:11
von Andreas_S
Ich hab mich mal an einen eigenen ScreenRequester ran gemacht, hänge leider am GUI, aber vil. kannst du diese Prozeduren gebrauchen..

Code: Alles auswählen

Structure ScreenMode
	size.Size
	factor.d
	
	depth.l
	
	fq.l
EndStructure



Procedure New_SreenModeList(ScreenModes.ScreenMode())
	If Not ExamineScreenModes() : ProcedureReturn : EndIf
	
	While NextScreenMode()
		AddElement(ScreenModes())
		
		ScreenModes()\size\cx	= ScreenModeWidth()
		ScreenModes()\size\cy	= ScreenModeHeight()
		ScreenModes()\factor	= ScreenModes()\size\cx / ScreenModes()\size\cy
		
		ScreenModes()\depth	= ScreenModeDepth()
		
		ScreenModes()\fq	= ScreenModeRefreshRate()
	Wend
EndProcedure

Procedure SreenModeList_SortOut(ScreenModes.ScreenMode(), cx, cy, factor.d, depth, fq, Result_ScreenModes.ScreenMode())
	Protected high.b, found.b
	
	If cx <> -1 : high + 1 : EndIf
	If cy <> -1 : high + 1 : EndIf
	If factor <> -1 : high + 1 : EndIf
	If depth <> -1 : high + 1 : EndIf
	If fq <> -1 : high + 1 : EndIf
	
	ForEach ScreenModes()
		If cx <> -1 And ScreenModes()\size\cx = cx
			found + 1
		EndIf
		If cy <> -1 And ScreenModes()\size\cy = cy
			found + 1
		EndIf
		If factor <> -1 And ScreenModes()\factor = factor
			found + 1
		EndIf
		If depth <> -1 And ScreenModes()\depth = depth
			found + 1
		EndIf
		If fq <> -1 And ScreenModes()\fq = fq
			found + 1
		EndIf
		
		If found = high
			AddElement(Result_ScreenModes())
			
			Result_ScreenModes()\size\cx = ScreenModes()\size\cx
			Result_ScreenModes()\size\cy = ScreenModes()\size\cy
			Result_ScreenModes()\factor = ScreenModes()\factor
			Result_ScreenModes()\depth = ScreenModes()\depth
			Result_ScreenModes()\fq = ScreenModes()\fq
		EndIf
		
		found = 0
	Next
EndProcedure

Procedure SreenModeList_Split(ScreenModes.ScreenMode(), Size.s(), BF.s(), Depth.s(), FQ.s())
	Protected size.s, bf.s, depth.s, fq.s
	Protected nFound.b
	
	ForEach ScreenModes()
		size = Str(ScreenModes()\size\cx) + " x " + Str(ScreenModes()\size\cy)
		
		If ScreenModes()\factor = #BF_4_3
			bf = "4 : 3"
		ElseIf ScreenModes()\factor = #BF_16_9
			bf = "16 : 9"
		ElseIf ScreenModes()\factor = #BF_16_10
			bf = "16 : 10"
		EndIf
		
		depth = Str(ScreenModes()\depth)
		fq = Str(ScreenModes()\fq) + " Hz"
		
		
		ForEach Size()
			If Size() = size
				nFound = 1
				Break
			EndIf
		Next
		If nFound = 0
			AddElement(Size())
			Size() = size
		EndIf
		nFound = 0
		
		ForEach BF()
			If BF() = bf
				nFound = 1
				Break
			EndIf
		Next
		If nFound = 0
			AddElement(BF())
			BF() = bf
		EndIf
		nFound = 0
		
		ForEach Depth()
			If Depth() = depth
				nFound = 1
				Break
			EndIf
		Next
		If nFound = 0
			AddElement(Depth())
			Depth() = depth
		EndIf
		nFound = 0
		
		ForEach FQ()
			If FQ() = fq
				nFound = 1
				Break
			EndIf
		Next
		If nFound = 0
			AddElement(FQ())
			FQ() = fq
		EndIf
		nFound = 0
	Next
EndProcedure

Verfasst: 31.07.2008 20:29
von Danilo
Kaeru Gaman hat geschrieben:auch dass in jeder zeile einige Hz-werte doppelt stehen ist etwas befremdlich.
Dafür hatte ich nach Deinem ersten Posting schnell einen QuickFix gemacht.
Der ist nicht gut, nur erstmal ein Workaround:

Code: Alles auswählen

  If Not FindString(sml()\hz,Str(hz),1) ; Quickfix -> "60" in "160" = Findstring=1
    If sml()\hz
      sml()\hz + ","
    EndIf
    sml()\hz + Str(hz)
  EndIf
Ich werde die Hz-Angaben neu machen müssen, am besten mit einer
einfachen LinkedList in der Struktur oder einem Array variabler Größe
in der Struktur. Ohne Strings.
Kaeru Gaman hat geschrieben:ich werd aber heut nicht deinen code auseinanderpulen, vielleicht another day... ;)
Sind ja nur 2 wirklich kleine Prozeduren, aber up to you.
Obs für Dich leicht lesbar ist, kann ich nicht sagen - ist halt mein Style.
Ich hab auch manchmal Probleme Styles und Vorgehensweisen anderer
Coder hier zu verstehen - jeder ist halt im Kopf anders geprägt und hat
dadurch andere Denkweisen.
Kaeru Gaman hat geschrieben:wie gesagt, mir ging's primär darum, mehr background-info zu sammeln,
um irgendwann später wenn ich selber nen mode-requester schreibe,
weniger stolpersteine zu haben.
OK, dann bis irgendwann vielleicht mal. Ich wollte halt nur einen kleinen
Anstoß geben und loslegen. Hab ich mir irgendwie so komisch angewöhnt
über die letzten Jahre... ;)