Menü-Boxen erstellen

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Golden Age

Betreff: Menü-Boxen erstellen

BeitragSa, Dez 27, 2008 13:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Dez 27, 2008 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Dez 27, 2008 14:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder Types, und frag die in einer For->Each Schleife ab.

Eingeproggt

BeitragSa, Dez 27, 2008 14:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
(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 Wink
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Golden Age

BeitragSa, Dez 27, 2008 14:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen dank, ich werd mir das jetzt mal anschauen und versuchen zu kapieren:)

Golden Age

BeitragSa, Dez 27, 2008 15:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Xeres

Moderator

BeitragSa, Dez 27, 2008 15:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Klar. Um in Funktionen vorhanden zu sein, muss Menu_Button Global deklariert sein.
(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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Golden Age

BeitragSa, Dez 27, 2008 15:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Mensch, hätt ich auch selbst drauf kommen können^^ Danke! Aber die Buttons werden garnicht erstellt...

Xeres

Moderator

BeitragSa, Dez 27, 2008 15:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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 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)

Golden Age

BeitragSa, Dez 27, 2008 16:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Xeres

Moderator

BeitragSa, Dez 27, 2008 16:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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 auf das Frisch erstellte Bild zeichnen. Das Bild das Createimage zurückliefert, musst du auch in einer Variable Speichern! Sonst kommst du nie wieder dazu, es zu zeichnen.
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)

Golden Age

BeitragSa, Dez 27, 2008 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Xeres

Moderator

BeitragSa, Dez 27, 2008 17:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Golden Age

BeitragSa, Dez 27, 2008 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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.....

Xeres

Moderator

BeitragSa, Dez 27, 2008 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Until KeyHit(a)
A ist keine Definierte Variable; Keyhit erwartet einen der möglichen Scancodes.
Code: [AUSKLAPPEN]
Local Button_Neu.TButton = Create_Button("Menu_Button.jpg","Neu", 350, 150, 100, 50)
[...]
Function Create_Button.TButton(fbild, ftxt$, fx, fy, fb, fh)
Das funktioniert auf 2 Arten, du hast aber leider beide vermischt.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Golden Age

BeitragSa, Dez 27, 2008 18:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Dez 27, 2008 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst das Buttonbild erst laden.
MfG

Xeres

Moderator

BeitragSa, Dez 27, 2008 18:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Golden Age

BeitragSa, Dez 27, 2008 18:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Dez 27, 2008 18:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group