Unterschied zwischen Funktionen und normalem Code

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Seven

Betreff: Unterschied zwischen Funktionen und normalem Code

BeitragMi, Okt 12, 2011 17:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Tag,
ich arbeite hin und wieder gerne mit Funktionen, da ich diese Abschnitte auch in anderen Programmen noch
verwenden will, aber leider habe ich ab und an Probleme den normalen Code in eine Funktion umzuformen.

Was genau muss man alles beachten? Welche Nachteile haben Funktionen?
Mir geht es genauer gesagt darum:
Code:
RX=300
RY=500

Graphics RX,RY,16,2
SetBuffer BackBuffer()


drawdrop=False
words$=RX + "x" + RY

While Not KeyHit(1)
Cls

If RectsOverlap(125,50,25,20,MouseX(),MouseY(),10,10) And MouseHit(1)
If drawdrop=False
drawdrop=True
Else
drawdrop=False
End If
End If

anz = CountGfxModes ()

If drawdrop=True
Rect 50,50,100,200,0
For i=1 To anz Step 2

If i Then pickedword$=GfxModeWidth (i) + "x" + GfxModeHeight(i)


Text 50,60+(i*10),pickedword

If RectsOverlap(50,50+(i*10),75,20,MouseX(),MouseY(),10,10) And MouseDown(1)
words=pickedword
drawdrop=False
Graphics words,words,16,2
End If


Next
End If

Rect 50,50,100,20,0
Rect 125,50,25,20,0
Text 50,50,words

Flip
Wend
End


(Zu Übersichtsverbesserung bin ich bisher nicht gekommen^^)

Das ganze soll einfach ein Dropdown Menu sein, dass die Auflösung ändert.
In Funktion Form sieht das bisher so aus:
Code:
Global RX
Global RY
Global pickedword$
Global drawdrop
Global words$
;--------------------------------------
RX=300
RY=500

Graphics RX,RY,16,2
SetBuffer BackBuffer()
;--------------------------------------
Function Resolution()

drawdrop=False
words$=RX + "x" + RY

If RectsOverlap(125,50,25,20,MouseX(),MouseY(),10,10) And MouseHit(1)
If drawdrop=False
drawdrop=True
Else
drawdrop=False
End If
End If

anz = CountGfxModes ()

If drawdrop=True
Rect 50,50,100,200,0
For i=1 To anz Step 2

If i Then pickedword$=GfxModeWidth (i) + "x" + GfxModeHeight(i)

Text 50,60+(i*10),pickedword

If RectsOverlap(50,50+(i*10),75,20,MouseX(),MouseY(),10,10) And MouseDown(1)
words=pickedword
drawdrop=False
Graphics words,words,16,2
End If

Next
End If

Rect 50,50,100,20,0
Rect 125,50,25,20,0
Text 50,50,words

Return drawdrop And RX And RY
End Function
;-----------------------------------------------

While Not KeyHit(1)
Resolution()


Flip
Wend
End


Und die Funktion geht natürlich in der Form nicht... Am meisten wundert mich,
dass sich das Menü aufklappen, aber nicht zuklappen lässt...

Midimaster

BeitragMi, Okt 12, 2011 17:23
Antworten mit Zitat
Benutzer-Profile anzeigen
hier ein Tutorial zu Funktionen:

https://www.blitzforum.de/foru...hp?t=33468

Das solltest Du unbedingt lesen!
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Xeres

Moderator

BeitragMi, Okt 12, 2011 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktionen können durchaus komplex sein, aber einfach einen längeren Codeblock mit Function/End Function umrahmen, ist nicht die beste Lösung. Eine Funktion sollte eine spezifische Aufgabe lösen oder den Code in einen Zusammenhängenden Block zusammenfassen.
Ein Menu brauchst schon mal ein paar mehr Funktionen und mit Sicherheit Types um die ganzen Informationen sauber zu verwalten.

Ein paar Hinweise:
Du solltest deinen Code Einrücken und alle Variablen deklarieren - dann können wir deinen Code besser lesen und verstehen.
Zu "MouseHit(1)" siehe Wie kann ich Mausklicks richtig abfragen ?
Zu "Return drawdrop And RX And RY" du kannst keinen Logischen Operator dazu benutzen, mehrere Werte zurück zu geben... Funktionen geben einen Wert zurück. Immer.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Seven

Betreff: soo...

BeitragMi, Okt 12, 2011 20:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun gut. Ich habe eure Verlinkungen etc. durchgelesen.

MouseHit(1) hat mir weiter verholfen. Das war wohl wirklich einer der Fehler.
Field ist praktisch, aber ich denke, bei einer Abfrage von Auflösungen ist das noch nicht
nötig. Wenn ich ein allgemeines dropdown Menü erstelle, dann werde ich aber nicht drumherum
kommen.

Leider funktioniert es immer noch nicht. Es liegt meiner Meinung nach nicht mehr an MouseHit(1),
sondern eher daran, dass das Programm die Funktion durchfährt und nicht abwartet, ob noch etwas
passiert. (Oder etwas in der Art^^)

Das ganze sieht bisher so aus: (Die Variablen werden nun alle vorher aufgerufen und ich habe die
Zeilen nicht mehr gekürzt stehen. Wenn noch etwas ist -> bescheid sagen)
Code:
Local  RX
Local  RY
Global mh

RX=300
RY=500

Graphics RX,RY,16,2
SetBuffer BackBuffer()
;--------------------------------------
;--------------------------------------
;--------------------------------------
Function Resolution(RX,RY)
Local drawdrop
Local words$
Local anz
Local pickedword$

Cls

drawdrop=False
words$=RX + "x" + RY


 If MouseHit(1) Then mh=1

 If RectsOverlap(125,50,25,20,MouseX(),MouseY(),3,3) And mh=1 Then
  If drawdrop=False Then
drawdrop=True
  Else
drawdrop=False
  EndIf
 EndIf

anz = CountGfxModes ()

  If drawdrop=True Then
Rect 50,50,100,200,0
 For i=1 To anz Step 2

   If i Then pickedword$=GfxModeWidth (i) + "x" + GfxModeHeight(i)

 Text 50,60+(i*10),pickedword

   If RectsOverlap(50,50+(i*10),75,20,MouseX(),MouseY(),3,3) And MouseDown(1) Then
   words=pickedword drawdrop=False Graphics words,words,16,2 mh=0
   EndIf
   If RectsOverlap(125,50,25,20,MouseX(),MouseY(),3,3) And mh=1 And drawdrop=True Then
   drawdrop = False mh=0
   EndIf

 Next
  EndIf

Rect 50,50,100,20,0
Rect 125,50,25,20,0
Text 50,50,words
Text 5,20, MouseX()
Text 5,35, MouseY()


End Function
;--------------------------------------
;--------------------------------------
;--------------------------------------
While Not KeyDown(1)

Resolution(rx,ry)
Text 5,5, mh

Flip
Wend
End
 

PacMani

BeitragMi, Okt 12, 2011 22:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Nur mal so nebenbei: Diesen Code
Code:
If drawdrop = False Then
    drawdrop = True
Else
    drawdrop = False
End If

kannst du gegen
Code:
drawdrop = Not(drawdrop)

ersetzen. Not liefert immer das Gegenteil des in Klammern übergebenen Wertes zurück.

Midimaster

BeitragMi, Okt 12, 2011 23:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Tipp I

Also...wenn Du zukünftig Hilfe willst (also zumindest von mir...), wirst Du Dir wohl oder übel einen anderen Schreibstil angewöhnen müssen. Zwar "fehlte Dir die Zeit die "Übersichtverbesserung" vorzunehmen". Dafür sollen nun alle Anderen, die dir helfen sollen sich jeder die Mühe machen, oder was?

Denn ohne Einrücken kann kein Fremder Deinen Code durcharbeiten! Also bitte! Nicht so respektlos!

Im Forums-Texteditor gibt es extra einen Button für BB-Code. Statt [ CODE ] [ /CODE ] verwende also besser [ syntax="bb" ] und [ /syntax ]


Tipp II

Dann rücken wir alles schön ein, und schon sieht das Ganze übersichtlicher aus:
BlitzBasic:
If drawdrop=True Then
Rect 50,50,100,200,0

For i=1 To anz Step 2

If i Then pickedword$=GfxModeWidth (i) + "x" + GfxModeHeight(i)
Text 50,60+(i*10),pickedword
If RectsOverlap(50,50+(i*10),75,20,MouseX(),MouseY(),3,3) And MouseDown(1)
words=pickedword drawdrop=False
Graphics words,words,16,2
mh=0
EndIf
EndIf

If RectsOverlap(125,50,25,20,MouseX(),MouseY(),3,3) And mh=1 And drawdrop=True
drawdrop = False mh=0
EndIf
Next
EndIf


Eingerückt wird immer nur über die TAB-Taste! und wenn Du das gleich beim Coden machst, werden auch die nachfolgenden Zeilen in der BB-Ide automatisch eingerückt. Schön, gell!

Ach und gleich noch was: 3 Befehle kommen auf 3 Zeilen. Nie hintereinander in eine Zeile. "Geht zwar..." ist aber schlechter Stil und bei der Fehlersuche echt unübersichtlich


[Tipp III]
Alle Funktionen schreibst Du immer nach dem END, so dass alle Zeilen, die außerhalb von Funktionen sind, ganz oben im Code bleiben!

BlitzBasic:
Local  RX% , RY% , mh%
RX=300
RY=500

Graphics RX,RY ;,16,2
SetBuffer BackBuffer()
FPS=CreateTimer(60)
While Not KeyDown(1)
Resolution(rx,ry)
Text 5,5, mh
Flip 0
WaitTimer FPS
Wend
End

Function Resolution(RX,RY)
Local drawdrop
......


Nebenbei siehst Du hier, dass die LOCAL-Anweisungen auch auf eine Zeile dürfen und auch ganz wichtig. Während der Testphase erst mal kein Fullscreen Graphics rx,ry,16,2 sondern bitte ins Fenster, damit man an die IDE rankommt und den Debugger sieht! Die beiden Timer-Zeilen machst du einfach immer so wie hier im Beispiel, bis Du dich mal in das Thema reingelesen hast. Sie sorgen für eine ungestreßte CPU.


TIPP IV
Nochmal zu dem Graphics()-Befehl... Der streßt den Computer und die Grafikkarte und sollte nur ausgeführt werden, wenn wir uns bereits 100% sicher sind, dass wir ihn korrekt ansprechen. Besser ist ein
BlitzBasic:
DebugLog "SET: GRAPHICS " + Words + "," + Words + ",16,2"


Wenn du so deinen Code ausführst, merkst du hoffentlich, dass deine Graphics()-Anweisung nicht korrekt ist, den der DEBUGGER gibt aus:
Zitat:
SET: GRAPHICS 1280x1024,1280x1024,16,2

...das war ja wohl nix!!!


Tipp V

Funktionen sind vergesslich! Wenn du sie verlässt, habe sie auch schon alles vergessen. Deshalb gibt es nur zwei Möglichkeiten, wie sie sich was merken könnten:

Entweder Vergessliches GLOBAL machen.

Oder Funktion nicht verlassen!

z.b. brauchst Du deine Variablen drawdrop% oder mh% um zu wissen, ob die Box aktuell angezeigt werden soll. Beim Wiedereintritt in die Funktion sind sie aber wieder 0.

Ich zeige Dir hier, wie man die Funktion nicht mehr verlässt:

BlitzBasic:
Local  RX% , RY% , mh%

RX=300
RY=500

Graphics RX,RY ;,16,2
SetBuffer BackBuffer()

Global FPS=CreateTimer(60)

While Not KeyDown(1)
Resolution(rx,ry)
Flip 0
WaitTimer FPS
Wend

End




Function Resolution(RX,RY)
Local anz% , pickedword$ ,Words$
Repeat
Cls
If MouseHit(1)

If RectsOverlap(125,50,25,20,MouseX(),MouseY(),3,3) Then
If drawdrop=False Then
drawdrop=True
Else
DebugLog "SET: GRAPHICS " + Words + "," + Words + ",16,2"
drawdrop=False
EndIf
EndIf
EndIf
Rect 50,50,100,20,0
Rect 125,50,25,20,0
Text 50,50,words

If drawdrop=True Then
Rect 50,50,100,200,0
anz = CountGfxModes()
For i=1 To anz Step 2
pickedword$=GfxModeWidth(i) + "x" + GfxModeHeight(i)
Text 50,60+(i*10),pickedword
If RectsOverlap(50,50+(i*10),75,20,MouseX(),MouseY(),3,3) And MouseDown(1) Then
words=pickedword
EndIf
Next
EndIf
Flip 0
WaitTimer FPS
Until drawdrop=False
End Function


Der Trick ist, das die Funktion eine eigene Repeat/Until-Schleife bekommt. Unschöner Stil aber für'n Anfänger tolerierbar. Das Ganze ist dann wie ein "Programm im Programm".
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Sir Gauss der III

BeitragDo, Okt 13, 2011 14:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mir mal deinen Code angeschaut. Dein Menü klappt immer wieder zu, da sich die Function den zustand von drawdrop nicht merkt. siehe zur übergabe mehrer Variablen weiter unten.
Aber auch aus weiteren gründen. zum einen setzt du die Variable, die deinen Mausdruck abfragt, nicht mehr auf null. so drückst du in jedem Durchgang deine Maus.also entweder
BlitzBasic:
mh=0
If MouseHit(1)=1 Then mh=1

oder, eleganter:
BlitzBasic:
mh=MouseHit(1)


dann fragst du zwei mal ab ob man das menü aus bzw. einklappt:
BlitzBasic:
	If RectsOverlap(125,50,25,20,MouseX(),MouseY(),3,3) And mh=1 Then
If drawdrop=False Then
drawdrop=True
Else
drawdrop=False
EndIf
EndIf
...
If drawdrop=True Then
For i=1 To anz Step 2
If RectsOverlap(125,50,25,20,MouseX(),MouseY(),3,3) And mh=1 And drawdrop=True Then
drawdrop = False mh=0
EndIf
Next
EndIf

da mh noch nicht gelöscht wurde, schließt sich das Fenster soffort wieder.

..................


Um mehr als einen wert aus einer Function auszulesen kannst du einen string (also text) zurück geben und aus diesem dann die werte auslesen.

Benötigte Befehle: left, instr, Rset, Len

In deinem Fall benötigst du drei informationen.
1. ist das Menüfeld aus oder eingeklappt
2. x-auflösung
3. y-auflösung

innerhalb der Function sammelst du die werte in einem String. so benötigst du nur noch eine Globale Variable, die du dann mit deinen Functionen in das jeweilige Programm übernimmst.
Da du beim auslesen später die anzahl der Zeichen kennen musst, ist es etwas komplizierter da die x-auflösung 3-4 zeichen haben kann. daher trennen wir die Informationen zusätzlich mit einem beliebigen symbol. nehmen wir mal ";".

Der Code würde dann in etwa so aussehen:
BlitzBasic:
Global gebvar$


Resolution()

;ermittelt die gesamtlänge des Textes
lange=Len(gebvar)
;lese die zeichen_anzahl_ aus bis zum Trennzeiche ;
n=Instr (gebvar,";")
;lese nun die 1.werte aus (eine stelle weniger da Trennzeichen nicht gewollt wird)
an=Left (gebvar,n-1)
;lösche nun den gelesenen teil
gebvar=RSet(gebvar,lange-n)

;lese nun x und y aus
lange=Len(gebvar)
n=Instr (gebvar,";")
rx=Left (gebvar,n-1)
gebvar=RSet(gebvar,lange-n)
ry=gebvar

Print an
Print rx
Print ry
WaitKey()



Function Resolution()

;Locale Variable
Local x
Local y
Local drawdrop

;sammel der Inforamtionen und bearbeiten
x=600
y=300
drawdrop=1

;übergabe an eine Variable
gebvar$=drawdrop+";"+x+";"+y
Return gebvar$

End Function

Ich hab in schrittweise kommentiert, denke das und die Hilfe sollten in verständlich machen.
Nun kannst du deiner function von außen mitteilen, ob sie an oder aus ist
BlitzBasic:
Resolution(an)
...
Function Resolution(drawdrob)




......................



Kommentiere etwas mehr deinen Code. dies hilft dir, bei späteren verbesserungen und verwendung des Cods, der Function, dich zurecht zu finden, berechnungen zu verstehen etc...



.........................



prüfe die Maus nur ganz am anfang deines Hauptcodes. Wenn du nun 10 Menüpunkte hast (grafik, Spiel, Hilfe....) rufst du die Maus auch 10 mal auf wenn sie in den Functionen ist. besser ist es, alle benötigten abfragen zu begin fest zu halten, und wenn nötig an die functionen zu übergeben
BlitzBasic:
Repeat
maushit=0
mausdruck=0
;positionen der Maus
mausx=MouseX()
mausy=MouseY()
;ob und welche Taste gedrückt wird
If MouseHit(1)=1 Then maushit=1
If MouseHit(2)=1 Then maushit=2
If MouseHit(3)=1 Then maushit=3
;ob und welche taste gehalten wird
If MouseDown(1)=1 Then mausdruck=1
If MouseDown(2)=1 Then mausdruck=2
If MouseDown(3)=1 Then mausdruck=3
;bewegung der Maus
mausgeschwx=MouseXSpeed()
mausgeschwy=MouseYSpeed()
mausgeschwz=MouseZSpeed()
.....


so benötigst du in deiner Function nicht immer eine RectsOverlap-abfrage, sondern kannst die schnellere (und einfachere) variante nehmen:
BlitzBasic:
If mausx>100 And mausx<150	Then
If mausy>100 And mausy<120 Then
If maushit=1 Then
...
EndIf
EndIf
EndIf

nebenbei: es ist besser, weniger Abfragen in eine If bedingung zu packen. so wird, nur wenn die erste auch zutrift, die weitere bedingungen geprüft. schreibt man alles in eine If-zeile, so wird jedes mal jeder Punkt überprüft.

in eine Function verpackt wäre das dann so:
BlitzBasic:
;prüft ob eine taste in einem Feld gedrückt oder gehalten wird.
;wird sie gehalten, liefert sie den Tastenwert *10 zurück
;x,y: ab wo das Feld beginnt
;x2,y2;bis wohin das Feld reicht
Function mausfrag(x,y,x2,y2)

;im x bereich?
If mausx>x And mausx<x2 Then
;im y bereich?
If mausy>y And mausy<y2 Then
;rückgabe
If maushit<>0 Return maushit
If mausdruck<>0 Return mausdruck*10
EndIf
EndIf

End Function






...............




Wenn du etwas variabel Programmierst, wie die abfrage aller möglichen Bildschirmmodis, solltest du darauf achten dass alles zusammenpasst. so ist bei mir deine feldumrahmung zu klein



...........


BlitzBasic:

For i=1 To anz Step 2
If i Then pickedword$=GfxModeWidth (i) + "x" + GfxModeHeight(i)
Text 50,60+(i*10),pickedword

anstatt i mit step 2 zu erhöhen, könntest du bei der textausgabe eunfach (i*20) machen. das hätte den selben effekt, ist weniger schreibarbeit und lässt sich besser einstellen (z.B. (i*19))


So, hoffe das hilft dir weiter.
 

Seven

BeitragDo, Okt 13, 2011 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für Ratschläge. So bin ich zu einigen Erkenntnissen gekommen.
Das Words funktioniert, hat mich schon, als ich die Zeile schrieb,
stutzig gemacht, aber da es mich vorerst weitergebracht hat,
kümmerte ich mich nicht weiter darum.
Jedenfalls sieht das ganze jetzt so aus:

BlitzBasic:

Local RX% , RY% , mh%

RX=300
RY=500

Graphics RX,RY ;,16,2
SetBuffer BackBuffer()

Global FPS=CreateTimer(60)

While Not KeyDown(1)
Resolution(rx,ry)
Flip 0
WaitTimer FPS
Wend

End




Function Resolution(RX,RY)
Local anz% , pickedword$ ,Words$, PickedWidth%, PickedHeight%
Repeat
Cls
If MouseHit(1) Then

If RectsOverlap(125,50,25,20,MouseX(),MouseY(),3,3) Then
drawdrop = Not (drawdrop)
EndIf
EndIf
Rect 50,50,100,20,0
Rect 125,50,25,20,0
Text 50,50,words

If drawdrop=True Then
Rect 50,50,100,200,0
anz = CountGfxModes()
For i=1 To anz Step 2
pickedword$ = GfxModeWidth(i) + "x" + GfxModeHeight(i)
PickedWidth = GfxModeWidth(i)
PickedHeight = GfxModeHeight(i)
Text 50,60+(i*10),pickedword
If RectsOverlap(50,50+(i*10),75,20,MouseX(),MouseY(),3,3) And MouseDown(1) Then
words = pickedword
RX = PickedWidth
RY = PickedHeight
DebugLog "SET: GRAPHICS " + RX + "," + RY + ",16,2"
drawdrop = Not(drawdrop)
EndIf
Next
EndIf
Flip 0
WaitTimer FPS
Until drawdrop=False
End Function



Und mit Graphics sieht das dann so aus:
BlitzBasic:
Local  RX% , RY% , mh%

RX=300
RY=500

Graphics RX,RY ;,16,2
SetBuffer BackBuffer()

Global FPS=CreateTimer(60)

While Not KeyDown(1)
Resolution(rx,ry)
Flip 0
WaitTimer FPS
Wend

End




Function Resolution(RX,RY)
Local anz% , pickedword$ , Words$ , PickedWidth% , PickedHeight%
Repeat
Cls
If MouseHit(1) Then

If RectsOverlap(125,50,25,20,MouseX(),MouseY(),3,3) Then
drawdrop = Not(drawdrop)
EndIf
EndIf
Rect 50,50,100,20,0
Rect 125,50,25,20,0
Text 50,50,words
If drawdrop=True Then
Rect 50,50,100,200,0
anz = CountGfxModes()
For i=1 To anz Step 2
pickedword$ = GfxModeWidth(i) + "x" + GfxModeHeight(i)
PickedWidth = GfxModeWidth(i)
PickedHeight = GfxModeHeight(i)
Text 50,60+(i*10),pickedword
If RectsOverlap(50,50+(i*10),75,20,MouseX(),MouseY(),3,3) And MouseDown(1) Then
words = pickedword
RX = PickedWidth
RY = PickedHeight
Graphics RX, RY
drawdrop=False
EndIf
Next
EndIf
Flip 0
WaitTimer FPS
Until drawdrop=False
End Function


Und es geht trotzdem nicht^^
Zumindest funktioniert es unzuverlässig. Mir klar, dass Graphics
den Speicher entfernt, aber die Funktion sollte das doch durch die
Schleife wieder ins Reine bringen...

PS: drawdrop = not (drawdrop) hab ich diesmal eingesetzt:)
Spart doch einige Zeilen.

Sieht mit dem BB Syntaxhighlighting deutlich besser aus^^

EDIT: @ Sir Gauss der III
Dieser Post entstand, bevor ich deinen Post gelesen habe.
Ich werde ihn mir jetzt durchlesen.

;-----------------------------------------------------
So, zu deinen Ratschlägen:
Vor allem die Aufteilung des Strings kommt mir sehr zu gute.
(Hatte vorhin ein Problem damit und musste mir anders behelfen,
aber die Stringabfrage kommt mir trotzdem sehr zu gute:) )

Die Kommentare werde ich hinzufügen.


BlitzBasic:
Repeat
maushit=0
mausdruck=0


Als Verständnis Frage: z.B. maushit muss ich nicht in die Repeat
Schleife packen, sondern könnte sie auch einfach als globale
Variable deklarieren, um den selben Effekt zu erzielen, oder?
Das nachfolgende kommt mir aber ebenfalls zugute:)

Den Rahmen werde ich gleich anpassen lassen.

Step 2 ist tatsächlich nötig und für mich gerade unumgänglich.
Wenn ich nämlich Step 2 weg lasse, dann sieht das Ergebnis in etwa so aus:
640 x 480
640 x 480
800 x 600
800 x 600
...

Die Auflösungen werden doppelt angezeigt und mit Step 2 umgehe ich das.

Sir Gauss der III

BeitragDo, Okt 13, 2011 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
wie gesagt, ich halte es nicht für sinnvoll, innerhalb der Func zu bleiben. hat den nachteil dass du kein anderes drobdownmenü öffnen kannst ohne es in die Func ein zu binden. dann lieber mit globalen Variablen arbeiten.


zur Maus:
BlitzBasic:
Variable

Systemeinstellungen, laden ...


Hauptprogramm:
Repeat

Mausabfrage

functionen u. Code


Endteil

Until x

functionen

so im groben mal der Aufbau. die Mausabfragen werden im Hauptteil vorgenommen, nicht in den Functionen.
maushit=0 und mausdruck=0 sind nötig, da eine einmal getätigte Taste sonst immer an bleibt. nun hast du 2 möglichkeiten. entweder, du verwendest grundsätzlich, in allen deinen Programmen, die selben abfragevariablen und setzt sie als global ein.
oder du gibst die benötigten werte an die funcs weiter:
BlitzBasic:
Function Resolution(maushit,mausx,mausy)

damit hätte Resolution nun alle infos die sie braucht.

ich arbeite lieber mit der globalen variante, das erspart mir lange übergaben.

Die doppelte ausgabe der Auflösung beruht in der tiefe (16 oder 32), und sollte evtl. mit abgefragt werden. es könnte ja sein, dass ein neuer PC in der Zukunft nur noch 32 anzeigen kann. dann hat er nur die hälfte seiner möglichen Auflösungen parat.
sonst geht es dir wie Microsoft, die konnten früher keine festplatten mit mehr als öhm, glaub 500mb anzeigen. Gates war er meinung, mehr wird es nie geben.

entweder zeigst du die Farbtiefe mit an, oder du prüfst ob die Auflösung die selbe ist, und wenn nicht, soll er von vorne beginnen. (eine zusätzl. zählvariable um die richtige position zu erhalten ist dann notwendig)
 

Seven

BeitragDo, Okt 13, 2011 22:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Sooo... Zu den Variablen: Du hast recht und es leuchtet mir ein, aber vorerst will ich lieber
eine allein stehende Funktion haben. Außerhalb des Codes soll nichts gravierendes vorkommen.

Im Hauptprogramm und vor allem wenn ich eine Ansammlung solcher Funktionen habe,
dann werde ich globale Variablen nutzten. (Speziell denke ich da an MouseX() und MouseY().
Die kommen häufig vor)

Ansonsten habe ich die If Anfragen geändert, die Farbtiefe mit rein genommen und ich habe
die Automatische Menu Anpassung begonnen, aber nicht beendet, da ich die Auswirkungen meiner
Änderungen nicht sehen kann-.-

Wie gesagt, ich bin mir ziemlich sicher, dass es an Graphics liegt und ich bin mir auch ziemlich sicher,
dass diesmal die Auflösung richtig eingestellt wurde.

So sieht das ganze bisher aus:
BlitzBasic:

Local RX% , RY% , mh%

RX=300
RY=500
;-----------------------------------------------------------------
Graphics RX,RY ;,16,2
SetBuffer BackBuffer()

Global FPS=CreateTimer(60)

While Not KeyDown(1)
Resolution(50,150,rx,ry)
Flip 0
WaitTimer FPS
Wend

End
;----------------------------------------------------------------
;------------------------Funktion--------------------------------
;----------------------------------------------------------------
Function Resolution(PX, PY, RX, RY)
Local anz% , pickedword$ , Words$ , PickedWidth% , PickedHeight% , Width%
Width = 100
Repeat
Cls
If MouseX() < (PX + 100) And MouseX() > PX Then ;Abfrage, ob das Menu geöffnet ist,
If MouseY() < (PY + 20) And MouseY() > PY Then;oder nicht.
If MouseHit(1) Then
drawdrop = Not(drawdrop)
EndIf
EndIf
EndIf
If Width < (StringWidth(words) + 10) Then Width = ResW + 10
Rect PX,PY,Width,20,0 ;Menu Rechteck
Rect PX + Width - 25 ,PY,25,20,0 ;Aufklapp Rechteck
Text 50,50,words
If drawdrop=True Then ;Wenn das Menu geöffnet ist...
anz = CountGfxModes()
Rect PX,PY,Width,PY + 10 * anz,0 ;Auswahl Rechteck
For i=1 To anz
pickedword$ = GfxModeWidth(i) + "x" + GfxModeHeight(i) + "->" + GfxModeDepth(i) + "bit"
PickedWidth = GfxModeWidth(i)
PickedHeight = GfxModeHeight(i)
Text PX,PY+10+(i*15),pickedword
If MouseX() < (PX + 100) And MouseX() > PX Then ;...und wenn etwas innerhalb
If MouseY() < (PY + 20 + i * 15) And MouseY() > (PY + 20) Then;des Menus gewählt wird,...
If MouseDown(1) Then
words = pickedword ;Dann...
RX = PickedWidth
RY = PickedHeight
Graphics RX, RY
drawdrop=False
EndIf
EndIf
EndIf
Next
EndIf
Flip 0
WaitTimer FPS
Until drawdrop=False
End Function


PS: Die Tiefe ist doch nicht mit drin. Sie wird nur im Menu angezeigt, aber nicht
umgesetzt. Ich ändere es später...

Neben der Graphics Frage noch was:
Gibt es irgendwo eine Auflistung von recourcensparenderen Wegen,
oder wo gezeigt wird, welche schleife wie viel verbraucht.

In der Hilfe z.B. heißt es auch Rect wäre bis zu 1.500 mal schneller als Line.
Sowas eben.

PS: Energie sparen am PC habe ich gelesen:)
*kurz lob*

Midimaster

BeitragFr, Okt 14, 2011 3:05
Antworten mit Zitat
Benutzer-Profile anzeigen
und du bist der Meinung, dass das so jetzt funktioniert? Rolling Eyes

also...


I. GRAPHICS

entgegen meinem Ratschlag hast Du bereits wieder den Graphics als echten Befehl und nicht also DEBUGLOG eingesetzt. Wenn du ihn als DEBUGLOG einfügst, merkst Du dass da ein SCHWERER Fehler im Code ist: Der Graphics-Befehl wird aktuell dutzende Male hintereinander ausgeführt. Arme Grafikkarte!!! Aber ist ja Deine...


II. Diese Zeile ist Unsinn:

BlitzBasic:
	If Width < (StringWidth(words) + 10) Then Width = ResW + 10
Da Funktionen ja vergesslich sind, wissen sie beim Neueintritt gar nix. Alle Variablen sind also an der Stelle, an der sie zum ersten Mal im Code verwendet werden GARANTIERT leer. So auch deine words. Da an dieser Stelle word noch leer ist, macht ein StringWidth(words) keinen Sinn! Nachzuprüfen über eine DEBUGLOG-Zeile:

BlitzBasic:
DebugLog " String Width = " + StringWidth(words)
If Width < (StringWidth(words) + 10) Then Width = ResW + 10



III. MouseHit()

Man kann die Zeilen-Reihenfolge von MouseHit() und Mousex() nicht einfach umdrehen. Probier mal folgendes in deinem Programm: Klicke zuerst in die rechte untere Ecke, dann bewege die Maus in das Menü ohne zu klicken...

MouseHit() "merkt" sich, ob es früher mal geklickt wurde. Gelöscht wird die Information erst, wenn man MouseHit() einmal verwendet. Also sollte die Abfrage von MouseHit() ganz weit oben im der Funktion stehen. Dort wo sie vom Programm sicher erreicht werden kann.


IV Graphics ...

woran liegt es nun, dass dein Grafikmode dutzende Male umgeschaltet wird? Du hast den Befehl in die FOR/NEXT-Schleife reingesetzt. Und die wird auch weiter abgearbeitet, auch wenn die Maus gedrückt wurde. Eine mögliche Abhilfe wäre ein RETURN:

BlitzBasic:
For i=1 To anz	
pickedword$ = GfxModeWidth(i) + "x" + GfxModeHeight(i) + "->" + GfxModeDepth(i) + "bit"
.....
If MouseX() < (PX + 100) And MouseX() > PX Then ;...und wenn etwas innerhalb
If MouseY() < (PY + 20 + i * 15) And MouseY() > (PY + 20) Then;des Menus gewählt wird,...
If MouseDown(1) Then
.....
DebugLog "Graphics" + RX + "," + RY
drawdrop=False
Return
EndIf
.....




V. Ausblick

Vorsicht! Jetzt wirds kompliziert... Schon mal mit TYPEN gearbeitet? Die wären die Lösung vieler Deiner Probleme. Ein TYPE ist eine Art Spezialvariable: Sie kann weitere Unter-Variable enthalten. Sie kann in einer Funktion erstellt werden und ist dennoch beim nächsten Wiedereintritt noch gültig.

Harmloses Beispiel (bitte sofort ausprobieren):

BlitzBasic:
Type ResoBoxTyp
Field Breite% , i%
End Type


While Not KeyDown(1)
Print "Hauptprogramm"
Resolution()
Wend

End



Function Resolution()
Local ResoBox.ResoBoxTyp=First ResoBoxTyp
If ResoBox=Null Then ResoBox=New ResoBoxTyp

Print " Unterprogramm
Print " Boxbreite zu beginn: " + ResoBox\Breite + " und i=" + ResoBox\i
Print " taste...
WaitKey()
ResoBox\Breite = 100
ResoBox\i = ResoBox\i+1
End Function


Zur Erklärung: Ein Type wird zwischen TYPE und END TYPE definiert. Dazwischen kommen die Untervariablen hinter das Wort FIELD:
BlitzBasic:
Type ResoBoxTyp
Field Breite% , i%
End Type


Dann muss diese gewöhnungsbedürftige Zeile rein:
BlitzBasic:
	Local ResoBox.ResoBoxTyp=First ResoBoxTyp
If ResoBox=Null ResoBox=New ResoBoxTyp

Bedeutet: Ab jetzt gibt es eine solche Spezial-Variable. Ihr Name ist ResoBox

Ihre Untervariablen werden mit dem Schrägstrich angesprochen:
BlitzBasic:
	ResoBox\Breite=100


Nun kannst du so viele Untervariablen in die Fields setzen wie du Lust hast. Und alle sind beim Wiedereintritt in die Funktion noch voller Inhhalt.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Sir Gauss der III

BeitragFr, Okt 14, 2011 14:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, es gibt eine möglichkeit um zu sehen wie schnell eine Function etc. ist.

dazu benötigst du den Befehl MilliSecs. Der gibt dir aus, wie viel zeit (100stel Secunden) seit dem PC start vergangen sind.

wenn du die zeit vor einer Aktion und direkt danach abfragst, kannst du sehen wie lange sie benötigt:
BlitzBasic:
n=MilliSecs()
For x=1 To 1000
Line 100,10,200,10
Next
a=MilliSecs()-n
Print a
n=MilliSecs()
For x=1 To 1000
Rect 20,20,100,1
Next
a=MilliSecs()-n
Print a
WaitKey()

beim ausführen des codes waren 1000 linien mit line ca 3mal langsamer als mit rect.

...........

[Edit] hatte was falsch verstanden, den Abschnitt nur bei interresse beachten, ansonsten ignorieren ^^

BlitzBasic:
...
Repeat
Cls
If MouseX() < (PX + 100) And MouseX() > PX Then ;Abfrage, ob das Menu geöffnet ist,
If MouseY() < (PY + 20) And MouseY() > PY Then;oder nicht.
If MouseHit(1) Then
drawdrop = Not(drawdrop)
EndIf
EndIf
EndIf
...


mousex() und mousey() machen dein Programm unnötig langsamer. zwar kaum merklich, aber denoch. Beide sind im grunde Functionen, enthalten also mehr code als nur eine Variable. Bei jedem aufruf wird erneut geprüft, wo sich die Maus nun befindet.

das gleiche gilt für mousehit(). hier kommt noch dazu, dass mousehit(1) nach dem erstn abfragen gelöscht und auf null gesetzt wird. es kann (in deinem code zwar nicht) vorkommen, dass du mehrmal hintereinander mousehit aufrufen musst.

frag die Mausvariablen alle zu beginn deiner Hauptschleife einmal ab und speichere sie. dann übergibst du die benötigten an deine Function.
BlitzBasic:

Repeat
maushit=0
mausdruck=0
;positionen der Maus
mausx=MouseX()
mausy=MouseY()
;ob und welche Taste gedrückt wird
If MouseHit(1)=1 Then maushit=1
If MouseHit(2)=1 Then maushit=2
If MouseHit(3)=1 Then maushit=3
;ob und welche taste gehalten wird
If MouseDown(1)=1 Then mausdruck=1
If MouseDown(2)=1 Then mausdruck=2
If MouseDown(3)=1 Then mausdruck=3
;bewegung der Maus
mausgeschwx=MouseXSpeed()
mausgeschwy=MouseYSpeed()
mausgeschwz=MouseZSpeed()
.....
Function Resolution(50,150,rx,ry,mausx,mausy,maushit)

deine function blaibt so immer noch unabhängig von den Variablen die du im HP nutzt, verliert aber keine resourcen mit dem prüfen der Mauszustände. zudem verlierst du keiner informationen durch doppeltes abfragen.

.......

BlitzBasic:
If Width < (StringWidth(words) + 10) Then Width = ResW + 10

Midimaster hat es ja schon angesprochen, diese Zeile sorgt dafür, das Width immer 100 hat. zumindest solange bis ResW einen wert bekommt. Ich geh mal davon aus, dass es noch nicht fertig ist. wenn ich es richtig interpretiere, soll hier die Breite des menüs angepasst werden. wie gesagt, geht mindestens so lange nicht bis ResW einen wert erhält.
(selbes bei Words)

.....

BlitzBasic:

Rect PX,PY,Width,20,0 ;Menu Rechteck
Rect PX + Width - 25 ,PY,25,20,0 ;Aufklapp Rechteck
Text 50,50,words

wenn du das Menü variabel gestaltest, also dem nutzer der Function überlässt wo es eingezeichnet wird, sollte auch die Ausgabe variabel sein. also
Text, PX,PY,words

du willst hier, so wie ich es rauslese, in das Menü die momentane Auflösung schreiben. Da du jedoch das Menü (die Function) mit der Wahl des Graphicmodus verlässt, werden alle Variablen auf null gesetzt. daher hat Words, das erst bei der Wahl eines Modus wieder einen Wert erhält, dauerhaft nichts. dann aber verlässt du die Function und löscht den wert gleich wieder.

Lösung:
Entweder die Funktion anders verlassen, die Werte global setzen oder (was ich rate) über einen String wie gestern beschrieben ans HP zurück und wieder an die Function übergeben.

......

BlitzBasic:
Rect PX,PY,Width,PY + 10 * anz,0	;Auswahl Rechteck

An sich nicht Falsch. nur solltest du "PY + 10 * anz" mit einem Wert mal nehmen, den du als abstand für deinen Text nimmst (derzeit 15). dann noch etwas feinjustierung, und die Tiefe passt schon mal. Die breite aus den oben genannten gründen leider noch nicht.

Zum testen: setze einfach die Anzahl mauel fest, und die Variable pickedword, PickedHeight, PickedWidth auf null. so kannst du eine beliebige menge simulieren und erkennst, ob sich dein Feld anpasst oder nicht.

....

BlitzBasic:
If MouseX() < (PX + 100) And MouseX() > PX Then                   ;...und wenn etwas innerhalb
If MouseY() < (PY + 20 + i * 15) And MouseY() > (PY + 20) Then;des Menus gewählt wird,...
If MouseDown(1) Then

Das hier muss nochmal überarbeitet werden. derzeit kann es sein, dass man eine größere Auflösung bekommt als man möchte. denn jeder schritt prüft, ob man zwischen ganz oben und der momentanen auflösung drückt. wie weit oben ist dabei egal.
  • Zuletzt bearbeitet von Sir Gauss der III am Fr, Okt 14, 2011 17:40, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragFr, Okt 14, 2011 14:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Sir Gauss der III hat Folgendes geschrieben:
100stel Secunden
Milli! Tausendstel! Wink
Aber viel wichtiger: Was schneller ist, hängt auch davon ab, in welcher Reihenfolge man zeichnen kann. Wenn man ein paar Linien hintereinander zeichnen kann, lohnt es sich, den Buffer zu sperren:
BlitzBasic:
Local n,x
n=MilliSecs()
For x=1 To 10000
Line 20,10,200,10
Next
Print MilliSecs()-n

n=MilliSecs()
LockBuffer(FrontBuffer())
For x=1 To 10000
Line 20,20,200,20
Next
UnlockBuffer(FrontBuffer())
Print MilliSecs()-n

n=MilliSecs()
For x=1 To 10000
Rect 20,30,180,1
Next
Print MilliSecs()-n

WaitKey()
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Seven

BeitragDi, Okt 18, 2011 1:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Sry, für die Abwesenheit und danke für die Hilfe.

Types haben mich bisher immer abgeschreckt, aber nun habe ich mich damit ein wenig befasst.
Ich habe nur ein schlechtes Gewissen wegen den vielen Types die ich benutzt habe.
Ist das schlimm? Würde man es beim Aufruf überhaupt merken, selbst mit einem Blick
auf den Taskmanager? Man kann die Types ja wieder entfernen und damit wären
sie für den Rest des Programms nicht mehr hinderlich, oder?

Naja, nun zum eigentlich Code:
BlitzBasic:

Type Dropdown
Field drop% , width% , height%, depth%
Field active% , content$ , count% , KWidth%
Field KHeight%, content1$
End Type

Global MX%, MY%, MH1%
Local RX%, RY%

RX=300
RY=500

Graphics RX,RY
SetBuffer BackBuffer()


Global FPS=CreateTimer(60)
While Not KeyDown(1)
;-----------------------------------------------------------------
MX = MouseX() ;ignorieren. Habe damit noch was vor
MY = MouseY()
;-----------------------------------------------------------------
Cls
Text 0,0, MouseX()
Text 0,15, MouseY()
Resolution(50,50,rx,ry)
Flip 0
WaitTimer FPS
Wend
End
;-----------------------------------------------------------------
;-----------------Funktion----------------------------------------
;-----------------------------------------------------------------
Function Resolution(X,Y,RX,RY)
Cls
Local Menu.Dropdown = First Dropdown
If Menu = Null Then Menu = New Dropdown
Local Width%
Height= 20
Width = 100
If Width < (Menu\KWidth + 40) Then Width = (Menu\KWidth + 40)
If Height< (Menu\KHeight+ 10) Then Height= (Menu\KHeight+ 10)
Rect X ,Y,Width,Height,0 ;langes Rechteck
Rect X+Width-25,Y,25 ,Height,0 ;kleines Rechteck
If MouseHit(1) Then
If MouseX() > X + Width - 25 And MouseX() < X + Width Then
If MouseY() > Y And MouseY() < Y + 20 Then
Menu\drop = Not (Menu\drop)
Menu\count = CountGfxModes()
EndIf
EndIf
EndIf
If Menu\drop = True Then
Rect X,Y+Height,Width,Height*Menu\count,0
For i=1 To Menu\count
Menu\width = GfxModeWidth (i)
Menu\height = GfxModeHeight(i)
Menu\depth = GfxModeDepth (i)
Text X+3,Y + 5 + Height * i, GfxModeWidth(i) + "x" + GfxModeHeight(i) + " - " + GfxModeDepth(i) + " bit"
Menu\content = GfxModeWidth(i) + "x" + GfxModeHeight(i) + " - " + GfxModeDepth(i) + " bit"
If MouseDown(1) Then
If MouseX() > X And MouseX() < (X + Width) Then
If MouseY() > (Y + Height)+12*(i-1) And MouseY() < (Y + Height * i + 13) Then
Menu\drop = False
Menu\active = True
Menu\content1 = GfxModeWidth(i) + "x" + GfxModeHeight(i) + " - " + GfxModeDepth(i) + " bit"
Return
EndIf
EndIf
EndIf
Next
EndIf
If Menu\active = True
If Menu\width > 0 Then
DebugLog "Graphics " + Menu\Width + "," + Menu\Height + "," + "2" + ","+ Menu\depth
Graphics Menu\Width, Menu\Height, 2, Menu\depth
Menu\active = False
EndIf
EndIf
Menu\KWidth = StringWidth (Menu\content)
Menu\KHeight = StringHeight(Menu\content)
Text X + (Width - Menu\KWidth - 25) / 2, Y + (Height - Menu\KHeight) / 2 , Menu\content1
WaitTimer fps
End Function


Ahja, danke für das aufzeigen von "DebugLog". Wirklich äußerst praktisch. Hier sei erwähnt;
Ich habe von vorne begonnen und dem alten Code sehr wenig Beachtung geschenkt.

Die "Features" sind im Grunde drinnen und scheinen zu funktionieren und gerade fällt mir zur späten
Stunde nicht mehr ein, was ich noch brauchen werde.

Mein Problem ist bloß; Es geht nicht xD
Laut Debuglog sollte es eigentlich funktionieren, oder sehe ich es einfach nicht?

Dann noch zu letzt; @ Sir Gauss
Sowohl der erste, als auch der zweite Teil deines Beitrags helfen mir weiter:)
Ich grad gerade aber ein müde, deswegen werde ich mir das morgen genauer
ansehen und die Fragen in dem Bereich folgen auch morgen.
@Xeres
LockBuffer sehe ich hier zum ersten mal in praktischer Benutzung
und gerade fallen mir ein paar Dinge ein, die man damit
verbessern könnte^^
Wird das beim laden benutzt?

Midimaster

BeitragDi, Okt 18, 2011 2:02
Antworten mit Zitat
Benutzer-Profile anzeigen
ich konnte auf die schnelle zwei fehler finden:

1.

diese 3 Befehlszeilen gehören innerhalb der MausDown:
BlitzBasic:
If MouseDown(1) Then
If MouseX() > X And MouseX() < (X + Width) Then
If MouseY() > (Y + Height)+12*(i-1) And MouseY() < (Y + Height * i + 13) Then
;diese:
Menu\width = GfxModeWidth (i)
Menu\height = GfxModeHeight(i)
Menu\depth = GfxModeDepth (i)




2.

Du hast die Parameter bei Graphics versehentlich vertauscht:

BlitzBasic:
	Graphics Menu\Width, Menu\Height ,  Menu\depth , 2

erst Depth, dann Mode!


Außerdem Gratulation bei den TYPES. Den Einstieg ins Thema hast du geschafft. Und nein! Es sind nicht zu viele. Überhaupt, wie meinst Du das? Du benutzt genau ein einziges Type! nämlich DropDown. Und du benutzt nur ein einziges Objekt von Type Dropdown, nämlich Menu . Der Rest sind nur die Fields aus diesem Objekt.

Zeitlich macht es keinen Unterschied, ob du mit oder ohne TYPES arbeitetest, oder ob du 10 oder 1.000 benutzt. Und nein, man kann davon nichts im Taskmanager sehen.

Vielleicht mal mein TYPES-Tutorial lesen: https://www.blitzforum.de/foru...hp?t=33551

STRING ist übrigens im Grunde auch ein TYPE und INTEGER auch eines. Und alle deine Variablen wie RX sind nix anderes als Objekte von Type INTEGER
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Xeres

Moderator

BeitragDi, Okt 18, 2011 3:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Seven hat Folgendes geschrieben:
Ich habe nur ein schlechtes Gewissen wegen den vielen Types die ich benutzt habe.
Ist das schlimm?
Viele? Ich sehe nur einen. Wenn du ~10000 Objekte eines Types erstellst oder 5 verschiedene Types für die gleiche Sache benutzt, könnte man Anfangen sich zu wundern. Bis hier hin ist alles Super-duper. Du passt sogar auf, nicht ständig neue Objekte zu generieren!
BlitzBasic:
Local Menu.Dropdown = First Dropdown  
If Menu = Null Then Menu = New Dropdown

Astrein gelöst.

LockBuffer bringt beim Laden leider nichts - Line scheint nur intern mit WritePixelFast zu arbeiten. Derartige Optimierungen sind aber bei dem Codeschnippsel auch noch nicht wirklich nötig (Locken/Unlocken kostet ja auch etwas Zeit).

2 Kleine Hinweise:
- Du benutzt Waittimer 2x - Streich den einen aus der Funktion.
- Du vertauschst Modus und Bittiefe Wink
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Seven

BeitragDi, Okt 18, 2011 12:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, ich meinte Field und danke^^
Aber wenns ok ist...

Depth vertauscht... doch so was einfaches. Ich dachte schon Rolling Eyes

Jedenfalls sieht es jetzt so aus:
BlitzBasic:
Type Dropdown
Field drop% , width% , height%, depth%
Field active% , content$ , count% , KWidth%
Field KHeight%, content1$
End Type

Global MX%, MY%, MH1%
Local RX%, RY%

RX=300
RY=500

Graphics RX,RY
SetBuffer BackBuffer()


Global FPS=CreateTimer(60)
While Not KeyDown(1)
;-----------------------------------------------------------------
MX = MouseX()
MY = MouseY()
;-----------------------------------------------------------------
Cls
Text 0,0, MouseX()
Text 0,15, MouseY()
Resolution(50,50,rx,ry)
Flip 0
WaitTimer FPS
Wend
End
;-----------------------------------------------------------------
;-----------------Funktion----------------------------------------
;-----------------------------------------------------------------
Function Resolution(X,Y,RX,RY)
Cls
Local Menu.Dropdown = First Dropdown
If Menu = Null Then Menu = New Dropdown
Local Width%
Height= 20
Width = 100
If Width < (Menu\KWidth + 40) Then Width = (Menu\KWidth + 40)
If Height< (Menu\KHeight+ 10) Then Height= (Menu\KHeight+ 10)
Rect X ,Y,Width,Height,0 ;langes Rechteck
Rect X+Width-25,Y,25 ,Height,0 ;kleines Rechteck
If MouseHit(1) Then
If MouseX() > X + Width - 25 And MouseX() < X + Width Then
If MouseY() > Y And MouseY() < Y + 20 Then
Menu\drop = Not (Menu\drop)
Menu\count = CountGfxModes()
EndIf
EndIf
EndIf
If Menu\drop = True Then
Rect X,Y+Height,Width,Height*Menu\count,0
For i=1 To Menu\count
Text X+3,Y + 5 + Height * i, GfxModeWidth(i) + "x" + GfxModeHeight(i) + " - " + GfxModeDepth(i) + " bit"
Menu\content = GfxModeWidth(i) + "x" + GfxModeHeight(i) + " - " + GfxModeDepth(i) + " bit"
If MouseDown(1) Then
If MouseX() > X And MouseX() < (X + Width) Then
If MouseY() > (Y + Height)+12*(i-1) And MouseY() < (Y + Height * i + 13) Then
Menu\width = GfxModeWidth (i)
Menu\height = GfxModeHeight(i)
Menu\depth = GfxModeDepth (i)
Menu\drop = False
Menu\active = True
Menu\content1 = GfxModeWidth(i) + "x" + GfxModeHeight(i) + " - " + GfxModeDepth(i) + " bit"
Return
EndIf
EndIf
EndIf
Next
EndIf
If Menu\active = True
If Menu\width > 0 Then
Graphics Menu\Width, Menu\Height, Menu\depth, 2
Menu\active = False
EndIf
EndIf
Menu\KWidth = StringWidth (Menu\content)
Menu\KHeight = StringHeight(Menu\content)
Text X + (Width - Menu\KWidth - 25) / 2, Y + (Height - Menu\KHeight) / 2 , Menu\content1
DebugLog Menu\drop
End Function


Das Tutorial werde ich mir gleich mal durchlesen.
Ich hatte bei meiner Suche ein anderes gefunden und dann sind mir noch robs tutorials eingefallen.

Zu dem Code; Es funktioniert etwas unzuverlässig. Sobald Graphics aktiv wird,
zerstört er mir die ganze Function. Zum einen Funktioniert das ein und ausklappen nicht mehr
Zuverlässig und zum anderen muss ich immer irgendwie rumtippen, damit er den Bildschirminhalt
wieder vernünftig ran zeichnet.

Bei der Gelegenheit noch eine Frage; Kann man sich irgendwo ansehen,
wie die gegebenen Funktionen, wie z.B Rect, aussehen?
 

n-Halbleiter

BeitragDi, Okt 18, 2011 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Zum 1.: Du musst nach einem Aufruf von Graphics Blitz wieder anweisen, den Backbuffer zu verwenden (wusste ich selbst nicht, man lernt nie aus Wink ); scheinbar vergisst der das wieder.

Und 2.: Ich weiß zwar nicht genau, was du meinst, daher rate ich mal: Es gibt hier im Forum die Onlinehilfe, welche du auch runterladen kannst. Da hast du einen Überblick über alle Standardbefehle (sowie die der Befehlsbibliotheken, die eingepflegt wurden): Die Parameter, den eventuellen Rückgabewert, Hinweise zur Benutzung sowie ein Beispiel. Die Befehle kannst du auch hier direkt verlinken, mit "[ [ Befehlsname ] ]" (ohne Leerzeichen) wirst du dann direkt auf die Seite des Befehls geführt. Beipsiel: CountGfxModes
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)
 

Seven

BeitragDi, Okt 18, 2011 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Verdammt, mit Backbuffer funktioniert es wirklich:D
Danke Laughing
Somit ist das erstmal fertig.

Zu 2. : MouseX ist z.B. auch nur eine Function, nur dass diese in Blitzbasic intern abgelegt
ist und als Standartbibliothek beigelegt wird.
Ich habe mir die Online Hilfe durchgeguckt und auch gedownloadet, nur dass ich bei der gedownloadeten
Version die Befehle nicht richtig aufrufen kann. (Chrome hat scheinbar ein Problem damit)

Es wird nicht gezeigt, wie die Function selbst aussieht. (Ich will nicht sehen, wie ich sie benutze)

Xeres

Moderator

BeitragDi, Okt 18, 2011 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Der C++ Quellcode von BlitzBasic ist nicht einsehbar und würde dir vermutlich auch nichts bringen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group