Menü-Boxen erstellen
Übersicht

![]() |
Golden AgeBetreff: Menü-Boxen erstellen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich möcht jetzt in meinem Menü 3(oder mehr) Boxen erstellen für verschiedene Zwecke(Optionen, Starten und Beenden). Ich würde das bestimmt durch umständlichen Weg auch hinbekommen, aber da ich lernen will sparend und möglichst kurz die Sachen zu programmieren, wüsste ich gern wie ich das am besten mach. Da gibs ja die For-Schleifen, dann könnte ich so 3 Boxen erstellen lassen. Aber wie kann ich dann die 3 auseinanderhalten? Damit ich z.B. allen 3 verschiedene Koordinaten geben kann wo sie im Menü dann stehen sollen? | ||
![]() |
sheldon |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nimm' Arrays
Code: [AUSKLAPPEN] Global Menu$[2]
Menu[0] = "Optionen" ;bla... For i = 0 to 2 Text 0, i*15, Menu[i] Next |
||
![]() |
The_Nici |
![]() Antworten mit Zitat ![]() |
---|---|---|
Oder Types, und frag die in einer For->Each Schleife ab. | ||
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bin grad erst aufgestanden und als "Morgensport" schreib ich dir mal n Beispel:
Code: [AUSKLAPPEN] ;Hauptschleife
mhit=MouseHit(1) ;Muss global sein ;.... If MenuButton(GraphicsWidth()/2,100,"Starten") Then ;Spiel starten Endif If MenuButton(GraphicsWidth()/2,100+100,"Optionen") Then ;Optionen anzeigen Endif If MenuButton(GraphicsWidth()/2,100+200,"Beenden") Then ;Beenden Endif ;... Function MenuButton(x,y,txt$) ;Button zeichnen (Lass deiner Phantasie freien Lauf) Color 255,255,255 Rect x-50,y-15,100,30,0 Text x,y,txt$,1,1 ;Mausabfrage If MouseX()>x-50 And MouseX()<x+50 and MouseY()>y-15 and MouseY()<y+15 Then Color 0,255,0 Rect x-50,y-15,100,30,0 If mhit Then Return True Endif Return False End Function Hmm... Ließe sich sicher noch besser machen... Vor allem die ganzen Zahlen sollte man als Variablen angeben, um nicht jedesmal alles ändern zu müssen wenn man eine andere Button-Größe haben will. GraphicsWidth() und MouseX() bzw MouseY() kann man auch ncoh in Variablen geben... Naja, aber als Anfang sollts gut sein ![]() (Achja, Code wurde nicht getestet sondern hier mal reingeknallt.) mfG, Christoph. EDIT: in Kombination mit den oben genannten Möglichkeiten der Arrays und Types lässt sich das natürlich angenehm verbinden, aber das überlass cih jetzt dir ![]() |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
![]() |
Golden Age |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vielen dank, ich werd mir das jetzt mal anschauen und versuchen zu kapieren:) | ||
![]() |
Golden Age |
![]() Antworten mit Zitat ![]() |
---|---|---|
So, hab auch schon das nächste Problem^^ Beim Erstellen der Buttons bekomm ich eine Access-Violation-Meldung:
Code: [AUSKLAPPEN] Menu_Button = LoadImage ("Menu_Button.jpg")
;...... Function Menu() ; Buttons erstellen If BM = False Create_buttons() EndIf ;.......... End Function Function Create_buttons() For button = 0 To 2 Step 1 DrawImage Menu_Button, GfxW/2, button*15 Next BM = True End Function |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Klar. Um in Funktionen vorhanden zu sein, muss Menu_Button Global![]() (und BM genauso, wenn du diesen Wert nicht als Funktionsparameter übergibst ...) |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Golden Age |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mensch, hätt ich auch selbst drauf kommen können^^ Danke! Aber die Buttons werden garnicht erstellt... | ||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja wenn du zeichnen und erstellen verwechselst. Erst zeichnest du die Buttons, dann schaltest du BM aus (oder ein) und zeichnest sie fortan nicht mehr. Man könnte sie einen Frame lang sehen ![]() |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Golden Age |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja, ich hab das mit der Variable mal weggemacht, es ist trotzdem noch nichts zu sehen. Oder kanns sein dass die Buttons hinter der Menütextur erstellt werden? Aber die Menütextur wird im Code eher gezeichnet.
Anscheinend wird die Funktion garnicht richtig ausgeführt, hab da noch nen Text-Befehl reingebracht aber der Text erscheint auch nicht aufm Desktop... An was liegt das? Mal der gesamte Menü-Code: Code: [AUSKLAPPEN] Function Menu()
DrawImage Menutextur, 0, 0 ; Buttons erstellen Create_buttons() ;Beenden If KeyHit(1) End EndIf ; Text Text GfxW/3+Menutext_weiter, GfxH/10+Menutext_hoehe,"Zum Beenden Escape drücken!", 1 Menutext() End Function Function Create_buttons() For button = 0 To 2 CreateImage Menu_Button, GfxW/2, button*15 Text 500,200,"Anzeige-Test" Next End Function |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eigentlich ist ganz falsch jemandem Fertigen Code hin zu knallen...
Code: [AUSKLAPPEN] AppTitle("Buttons mit Types")
Graphics(800, 600, 0, 2) SetBuffer BackBuffer() Local timer = CreateTimer(60) ;Global Menu_Button = LoadImage ("Menu_Button.jpg") Global mx, my, mh1 Type TButton Field x, y, breit, hoch Field txt$, Bild End Type Local Button_Neu.TButton = Create_Button("Neu", 350, 150, 100, 50) Local Button_Opt.TButton = Create_Button("Optionen", 350, 250, 100, 50) Local Button_End.TButton = Create_Button("Ende", 350, 350, 100, 50) Repeat mx = MouseX() my = MouseY() mh1 = MouseHit(1) Draw_Buttons() If Button_Hit(Button_End) Then End Flip 0 WaitTimer(timer) Cls Until KeyHit(1) Function Create_Button.TButton(ftxt$, fx, fy, fb, fh) Local b.TButton = New TButton b\txt$ = ftxt$ b\x = fx b\y = fy b\breit = fb b\hoch = fh Return b End Function Function Draw_Buttons() Local b.TButton For b = Each TButton If MouseInRect(b\x, b\y, b\breit, b\hoch) Then Color(0, 255, 0) Rect(b\x-5, b\y-5, b\breit+10, b\hoch+10) EndIf Color(0, 0, 255) Rect(b\x, b\y, b\breit, b\hoch) Color(0, 0, 0) Text(b\x+(b\breit/2), b\y+(b\hoch/2), b\txt, True, True) ;DrawImage(Menu_Button, b\x, b\y) Next End Function Function Button_Hit(b.TButton) If mh1 = True Then Return MouseInRect(b\x, b\y, b\breit, b\hoch) End Function ;Prüft, ob sich die Maus in einem angegebenen Rechteck befindet Function MouseInRect(x, y, w, h) If mx <= x Then Return False If my <= y Then Return False If mx >= x + w Then Return False If my >= y + h Then Return False Return True End Function ... aber für Sowas benutzt man Types. "Anzeige-Test" wird nur einmal gezeichnet, wenn du die Bilder erstellst. Mit imagebuffer ![]() ![]() |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Golden Age |
![]() Antworten mit Zitat ![]() |
---|---|---|
Okay, danke, aber meine Buttons werden immernoch nicht gezeichnet. Ich hab auch das ; vor der DrawImgae-Funktion weggemacht, aber sie sind halt nicht zu sehen. Wenn ich das mit dem imagebuffer mach bekomm ich ne AccessViolation-Meldung. | ||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dann einmal deinen Kompletten, aktuellen Code bitte. | ||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Golden Age |
![]() Antworten mit Zitat ![]() |
---|---|---|
Gut, hier:
spiel.bb Code: [AUSKLAPPEN] Graphics3D 1024,768,32, 1
SetBuffer BackBuffer() ;######################## ;Eingeschlossene Dateien ;######################## Include "funktionen.bb" Include "globals.bb" ;####################### ; Haupt-Schleife ;####################### Repeat Cls Menu() Flip Until KeyHit(a) globals.bb Code: [AUSKLAPPEN] ;##################
;Types ;################## Type TButton Field x, y, breit, hoch Field txt$, Bild End Type ;################# ; Globals ;################# Global GfxW=GraphicsWidth() Global GfxH=GraphicsHeight() Global Menutext_weiter = 0 Global Gesamt_Menutext = 0 Global Menutext_hoehe = 0 Global Hoehenaenderung = False Global BM ;################ ; Texturen ;################ Global Menutextur = LoadImage ("Winterlandschaft06.jpg") Global Menu_Button = LoadImage ("Menu_Button.jpg") ResizeImage Menutextur, GfxW, GfxH funktionen.bb Code: [AUSKLAPPEN] ;##############
; Funktionen ;############## ;################# ; Locals ;################# Local Button_Neu.TButton = Create_Button("Menu_Button.jpg","Neu", 350, 150, 100, 50) Local Button_Opt.TButton = Create_Button("Menu_Button.jpg","Optionen", 350, 250, 100, 50) Local Button_End.TButton = Create_Button("Menu_Button.jpg","Ende", 350, 350, 100, 50) ;Menu Function Menu() DrawImage Menutextur, 0, 0 ; Buttons erstellen Draw_Buttons() ;Beenden If KeyHit(1) End EndIf ; Text Text GfxW/3+Menutext_weiter, GfxH/10+Menutext_hoehe,"Zum Beenden Escape drücken!", 1 Menutext() End Function ;Menutext Steuerung Function Menutext() ;Text verschieben Menutext_weiter = Menutext_weiter + 1 Gesamt_Menutext = GfxW/3+Menutext_weiter If Gesamt_Menutext = GfxW MenuText_weiter = 0 EndIf If Menutext_hoehe <= 30 And Hoehenaenderung = False menutext_hoehe = menutext_hoehe+1 If Menutext_Hoehe = 30 Hoehenaenderung = True EndIf Else If Menutext_hoehe >= -30 And Hoehenaenderung = True menutext_hoehe = menutext_hoehe-1 If Menutext_Hoehe = -30 Hoehenaenderung = False EndIf EndIf End Function Function Create_Button.TButton(fbild, ftxt$, fx, fy, fb, fh) Local b.TButton = New TButton b\Bild = fbild b\txt$ = ftxt$ b\x = fx b\y = fy b\breit = fb b\hoch = fh Return b End Function Function Draw_Buttons() Local b.TButton For b = Each TButton Text(b\x+(b\breit/2), b\y+(b\hoch/2), b\txt, True, True) DrawImage b\Bild, b\x, b\y Next End Function Kann man eigentlich dann in den Klammern einer Funktion garkeine Variable angeben? Da kommt dann was mit dublicate..... |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] Until KeyHit(a) A ist keine Definierte Variable; Keyhit![]() ![]() Code: [AUSKLAPPEN] Local Button_Neu.TButton = Create_Button("Menu_Button.jpg","Neu", 350, 150, 100, 50)
Das funktioniert auf 2 Arten, du hast aber leider beide vermischt.
[...] Function Create_Button.TButton(fbild, ftxt$, fx, fy, fb, fh) 1) Du lädst das Bild in einer Variable und übergibst die Bildvariable als Parameter, die dann dem Type Field der Type-Instanz zugewiesen wird Code: [AUSKLAPPEN] b\Bild = fbild
Oder 2) Du übergibst den Bildpfad und lädst das Bild direkt. Code: [AUSKLAPPEN] b\Bild = LoadImage(fbildpfad$)
Dabei daran denken, dass Variablen die Text enthalten sollen auch als String $ deklariert sind. Funktionen kann man jede Variable übergeben; günstiger weise sollte man sie dann aber auch vom passenden Typ sein. |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Golden Age |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmm ich bin jetzt ganz raus:(
Was soll/kann ich denn jetzt statt: (DrawImage b\Bild, b\x, b\y) in Verbindung mit (b\Bild = fbild) dazuschreiben? |
||
![]() |
The_Nici |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du musst das Buttonbild erst laden.
MfG |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Um ein Bild zu zeichnen muss in der Variable eins vorhanden sein. D.H. Irgendwo muss das Bild geladen worden sein.
1) - Das Bild Laden und der Funktion übergeben Code: [AUSKLAPPEN] Local Menu = LoadImage("Menu_Button.jpg")
Local Button_Opt.TButton = Create_Button(Menu, [...] ) Function Create_Button.TButton(fbild, ftxt$, fx, fy, fb, fh) Local b.TButton = New TButton b\Bild = fbild [...] Return b End Function 2) - Den Pfad zum Bild angeben und erst in der Funktion Laden Code: [AUSKLAPPEN] Local Menu_pfad$ = "Menu_Button.jpg"
Local Button_Opt.TButton = Create_Button(Menu_pfad$, [...] ) Function Create_Button.TButton(fbild_pfad$, ftxt$, fx, fy, fb, fh) Local b.TButton = New TButton b\Bild = LoadImage(fbild_pfad$) [...] Return b End Function |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Golden Age |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vielen vielen Dank, es geht nun endlich:)
Nur eine Frage. Wenn ich die Variable GfxW benutze kommt die Fehlermeldung Duplicate variable.... Erst wenn ich die Definition der Variable von der Globals.bb in die Funktionen.bb verlager funktioniert es, an was liegt das? |
||
![]() |
das wurgel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi
Code: [AUSKLAPPEN] Local Button_Neu.TButton = Create_Button("Menu_Button.jpg","Neu", 350, 150, 100, 50)
Du übergibst der Funktion eine Stringvariable mit dem Dateinamen. Code: [AUSKLAPPEN] Function Create_Button.TButton(fbild, ftxt$, fx, fy, fb, fh)
Fblild ist aber keine Stringvariable, die Funktion erwartet eine Zahlenvariable in der die Position des geladenen Bildes im Speicher steht. Diese Zahl kriegt man wenn man ein Bild lädt. In Globals.bb wird das Bild geladen, aber nachdem die Buttons erstellt wurden. Deshalb rate ich dir entweder in der Spiel.bb die Includebefehle zu vertauschen, oder die das Laden der Bilder und das Erstellen der Buttons in die Spiel.bb zu machen. Und dann habe ich noch gesehen dass die Texte hinter den Bildern sind und deshalb warscheinlich nicht zu sehen sein werden. Einfach in dieser Reihenfolge schreiben: Code: [AUSKLAPPEN] DrawImage b\Bild, b\x, b\y
Text b\x+(b\breit/2), b\y+(b\hoch/2), b\txt$, True, True gruß, das Wurgel Edit: Oh sorry zu spät abgeschickt^^ |
||
1 ist ungefähr 3 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group