So, hier mal ein Tutorial von mir.

[b]Wie kann ich leicht, schnell und einfach ein Men erstellen[/b]

[u]Worum geht's?[/u]
Jeder kennt das Problem: Das Spiel ist fertig, es fehlt nurnoch ein Men. Aber das ist immer so Zeitaufwndig,
vorallem wenn man es mit der Maus bedienen will. Dafr gibt es aber eine Lsung! :P

[b]1. Die Grundstruktur eines Mens[/b]

Klar, jeder macht seine Mens, wie er will, aber ich persnlich bevorzuge diese Methode:

[code]
Graphics 800, 600, 32, 2
SetBuffer BackBuffer()

Global menu = 1
Global Timer = CreateTimer(30)

Repeat
	WaitTimer(Timer)
	Cls
	
	Flip
Until menu = 0
End
[/code]

So, das drfte erstmal fr jeden klar sein. Eine Schleife, die mit 30FPS und BackBuffer luft.
Soweit hiermit, jetzt gehts weiter...

[b]2. Der Eindruck ist alles[/b]

Zu einem guten Men gehrt die Gute Grafik, denn das Auge hrt mit, (oder wie war das? :P).
Also erstellen wir in einem Grafik-Programm unserer Wahl eine absolut non-topp-bare Grafik. Die "GrundGrafik".
Hier ist meine:
[img]http://img150.imageshack.us/img150/1671/mainpf9.png[/img]

Damit das ganze auch etwas "Animiert" wird, noch eine 2. Grafik des Exit-Buttons:
[img]http://img171.imageshack.us/img171/3539/exitoveruf2.png[/img]

[b]3. Die Struktur[/b]

berlegen wir also, wie das Men aufgebaut werden soll. Grundstzlich ist das immer so in etwa:

[code]
Men
|-Einzelspieler
  |-Deathmatch
  |-Etc.
|-Mehrspieler
  |-Internet
  |-LAN
  |-Bots
|-Einstellungen
  |-Grafik
    |-Benutzerdefiniert
  |-Sound
|-Beenden
[/code]

Natrlich ist das hier nur Beispielhaft, dein Men kann antrlich variieren.

[b]4. Der MenuState[/b]

Ich lse das ganze so: Jedem "Teil" des Mens wird eine Status zugerdnet. Das ist eine Zahl:

[code]
Men           |Status
|-Einzelspieler 1
  |-Deathmatch  2
|-Mehrspieler   3
  |-Internet    4
  |-LAN         5
  |-Bots        6
|-Einstellungen 7
  |-Grafik      8
...
|-Beenden       
[/code]

[quote]Beachte: Der Beenden-"Teil" hat absichtlich keinen Status![/quote]

Jetzt hat jeder "Teil" des Mens einen Status. Diesen Fragen wir in der Schleife jetzt ab:
[code]
Select menustate
	Case 1
		; Einselspieler
	Case 2
		; Einzelspieler - DeathMatch
	...
End Select
[/code]

Nun knnen wir hinter jedes Case das entsprechende Men setzen. So bleibt alles schn geordnet und sauber.

In unserem Fall haben wir eigentlich nur 2 Statuse.

[code]
Men
|-Hauptmen 1
  |-Daddln  2
|-Beenden
[/code]

[b]5. Die Grafik[/b]

Jetzt, da unser Gerst schon steht, werden wir anfangen, in jedem Status die gewnschte Grafik(/Sound) einzusetzen:

[code]
Graphics 800, 600, 32, 2
SetBuffer BackBuffer()

Global MainImage = LoadImage("main.png")
Global menu = 1
Global Timer = CreateTimer(30)
Global menustate = 1

Repeat
	WaitTimer(Timer)
	Cls
	
	Select menustate
		Case 1
			; Hauptmen	
				; Das Men-Bild malen
				DrawImage MainImage, 0, 0
		Case 2
			; daddln
				Cls
				Color 255, 255, 255
				Text 10, 10, "Zurck."
	End Select
	
	Flip
Until menu = 0
End
[/code]

Somit wird in jedem Status der entsprechende Teil angezeigt. Im "daddln"-Status haben wir nur einen billigen Zurck-Button, der aus einem Text (Kein Image) besteht.

[b]6. Die Bedienung[/b]

Unser Men sollte man natrlich mit der Maus bedienen knnen. Die meisten, die schoneinmal ein Men gemacht haben, werden jetzt aufsthnen. Ja, das ist aufwndig.
Aber, dafr habe ich fr euch die PButtons-Lib erstellt. Mit dieser (einfachen) Lib knnt ihr das ganze etwas vereinfachen.
Die Lib findet ihr [url=http://www.blitzforum.de/upload/file.php?id=960]hier[/url].

Bisher haben wir ja nur ein Bild in dem 2 Buttons sind (Daddln, Ende). Nun wollen wir diese Buttons auch "Klickbar" machen.

[code]
Global Btn_daddln = PB_CreateButton("Jetzt daddln: Hier klicken!!!", 40, 176, 1, 232, 54)
Global Btn_beenden = PB_CreateButton("Zum Beenden hier drcken.", 610, 536, 1, 164, 43, "exit_over.png")
[/code]

Mit diesem Code erstellt man 2 Buttons. Zur leichteren Erkennung kennzeichne ich alle Buttons mit dem Krzel "Btn_".
Die Parameter der Funktion sind folgende:
Hint, X, Y, Ob der Hint angezeigt werrden soll, Breite, Hhe, Over-Bild

Fr alle, die es nicht wissen: Ein Hint ist dieser "Tooltipp", der immer angezeigt wird, wenn man lnger ber einem Objekt mit der Maus ist.
Das Over-Bild ist ein Bild, das angezeigt wird, wenn man mit der Maus ber dem Button ist.

Wie ihr unschwer erkennen knnt, ist der "daddln"-Btton nicht animiert, dafr aber der Ende-Button.

[b]7. Button-States[/b]

Ein Button kann verschiedene Stadien haben. Hier sind sie aufgezhlt:
-Gedrckt
-Berhrt
-Deaktiviert/Aktiviert

Diese Stadien muss man abfragen. Dazu muss man zuerst in jedem Schleifendurchlauf [code]PB_Update()[/code] aufrufen, damit die Buttons erstmal angezeigt werden.
Um jetzt abzufragen, ob der Button gedrckt/berhrt wurde, kann man folgende Funktionen verwenden:
[code]
If PB_ButtonHit(Btn_daddln) Then ...
If PB_ButtonOver(Btn_beenden) Then ...
[/code]

Soweit, so gut. ;)
Nun, wollen wir aber, das man im Singelplayer-Men nicht die Buttons des Mutliplayer-Mens drcken kann, denn das wre ja mist, also mssen wir in jedem Men-Status die entsprechenden Buttons Deaktivieren/Aktivieren:
[code]
PB_DisableAll()
[/code]
Deaktiviert alle Buttons,
[code]
PB_EnableAll()
[/code]
Aktiviert alle Buttons.

Einzelne Buttons kann man mit folgender Funktion Aktivieren/Deaktivieren
[code]
PB_EnableButton(Btn_daddln)
bzw.
PB_DisableButton(Btn_beenden)
[/code]

[b]8. Das Fertige Men[/b]

Hier also alles fertig eingebaut:

[code]
; Beispiel fr die Nutzung der PButtons-lib.

Include "PButtons.bb"

Graphics 800, 600, 32, 2
SetBuffer BackBuffer()

Global MainImage = LoadImage("main.png")
Global menu = 1
Global Timer = CreateTimer(30)
Global menustate = 1

Global Btn_daddln = PB_CreateButton("Jetzt daddln: Hier klicken!!!", 40, 176, 1, 232, 54)
Global Btn_beenden = PB_CreateButton("Zum Beenden hier drcken.", 610, 536, 1, 164, 43, "exit_over.png")
Global Btn_back = PB_CreateButton("Drcke hier, um zurck zu gelangen.", 10, 10, 1, StringWidth("Zurck."), FontHeight())

PB_SetHintFont("Verdana")
PB_SetHintColor(245, 248, 152, 0, 0, 0, 208, 55, 163)

Repeat
	WaitTimer(Timer)
	Cls
	
	Select menustate
		Case 1
			; Hauptmen	
				; Erst alle anderen Buttons Deaktivieren
				PB_DisableAll()
				PB_EnableButton(Btn_daddln)
				PB_EnableButton(Btn_beenden)
				; Das Men-Bild malen
				DrawImage MainImage, 0, 0
				If PB_ButtonHit(Btn_daddln) Then menustate = 2
				If PB_ButtonHit(Btn_beenden) Then menu = 0
		Case 2
			; daddln
				; Jetzt zuerst alle Buttons deaktivieren, sonst knnte man die Anderen Buttons noch drcken!
				PB_DisableAll()
				PB_EnableButton(Btn_Back)
				Cls
				Color 255, 255, 255
				Text 10, 10, "Zurck."
				If PB_ButtonHit(Btn_back) Then menustate = 1
	End Select

	; Nicht vergessen: Updaten
	PB_Update()	
	
	Flip
Until menu = 0
End[/code]

Was die Befehle PB_SetHintFont und PB_SetHintColor bedeuten, kann man der PButtons.bb entehmen.

Hier sieht man, das bei einem Klick auf "Zurck" einfach der menustate wieder auf 1 gesetzt wird, alles easy halt ;)
Wollen wir das Men beenden, msssen wir einfach menu = 0 setzen, da die Haupt-Schleife ja jedesmal abfrag, ob menu = 1 ist.

Die Lib hat noch mehr Funktionen, ihr knnt sie euch einfach anschauen. Ist eigentlich alles schn kommentiert.

Wenn ihr sie verwendet, wrd ich mich um einen Credits-Eintrag freuen ;)

Fragen/Kritik einfach hier reinschreiben.

Also viel Spass beim Men-basteln :D

mfg Pdd

Und hier nochmal alles zum Runterladen (RAR-Archiv, KB):
[url=]Download[/url]
In diesem Archiv ist die Beispiel-Datei, die Bilder und die Lib enthalten.