![]() |
Re: Suche Ideen für Game Menü (bin bald am verzweifeln)
Find ich doof :-D
Maus muss im Hauptmenü sein, finde ich, aber das überlasse ich natürlich dir. Mit Nur-Tastatur machst du's dir natürlich noch viel einfacher, denn jetzt musst du dir nur noch merken, welches Menuitem gerade den Fokus hat, und zeichnest dieses dementsprechend etwas anderes. Wenn der Spieler dann Eingabe drückt, hast du ja schon automatisch den richtigen Tastenindex. |
Re: Suche Ideen für Game Menü (bin bald am verzweifeln)
Zitat:
Also wenn mal die ganzen Sachen zusammen fassen darf: :arrow: Für jeden "Button" erstellt man ein (eventuell leeres) Bild :arrow: Darauf wird die Caption ausgegeben :arrow: Bei Maussteuerung erhält man das aktive Item über Kollisionen mit dem Mouse-Sprite :arrow: Bei Tastatur wird zum Beispiel auf die Pfeil-hoch- Pfeil-runter-Tasten reagiert und immer das aktive Item gespeichert :arrow: Man könnte immer beim Aktiven Item das Bild ändern (zB gleiches Bild mit rotem Rahmen drum oder leuchtend) :arrow: Bei einem Klick bzw. Enter wird auf das aktive Item raegiert (Methode der MenüSprites?) Stimmt das soweit? |
Re: Suche Ideen für Game Menü (bin bald am verzweifeln)
Hier noch ein anderer Weg für das Main-Menü meines Spiels. Ist ein Vollbild-Menü mit einer rotierende Münze als Cursor und Text für "Spiel", "Optionen", etc.
Über MouseMove fange ich erstmal die Koordinaten der Maus ab und ordne sie dem gewählten Menüpunkt zu:
Delphi-Quellcode:
Wenn die Maustaste gedrückt wird, "fade" ich die Hintergrundmusik aus, zerstöre den Münzen-Cursor und setze eine Variable, damit die "Menu.pas" weiß, was jetzt passieren soll:
procedure TfrmMain.DXDraw1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer); begin MouseCursor.X := X; MouseCursor.Y := Y; if assigned(spCoin) AND (Gamestate=gsMenu) then begin if (Y>250) AND (Y<=300) then begin spCoin.Y:=250; iMenuselect:=1; end else if (Y>350) AND (Y<=400) then begin spCoin.Y:=350; iMenuSelect:=2; end else if (Y>450) AND (Y<=500) then begin spCoin.Y:=450; iMenuSelect:=3; end else if (Y>550) AND (Y<=600) then begin spCoin.Y:=550; iMenuSelect:=4; end else if (Y>650) AND (Y<=700) then begin spCoin.Y:=650; iMenuSelect:=5; end; end; end;
Delphi-Quellcode:
In der Menu.pas passiert dann folgendes:
procedure TfrmMain.DXDraw1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin if (Assigned(spCoin)) AND (GameState=gsMenu) then begin if Button=mbleft then begin bFadeBGSound:=true; frmMain.DXWL1.Items.Find('menuok').Play(false); spCoin.Dead; DXSpriteENgine1.Dead; end; end; if Button=mbleft then bMBLEFT:=true else bMBLEFT:=false; end;
Delphi-Quellcode:
Dann wird die entsprechende "GameState"-Variable gesetzt, die wiederum im Timer-Event verarbeitet wird:
procedure doMenu;
begin frmMain.DXIL2.Items[0].draw(frmMain.DXDraw1.Surface, 0, 0, 0); frmMain.DXIL2.Items.Find('menu1').Draw(frmMain.DXDraw1.Surface, 350, 250, 0); frmMain.DXIL2.Items.Find('menu2').Draw(frmMain.DXDraw1.Surface, 400, 350, 0); frmMain.DXIL2.Items.Find('menu3').Draw(frmMain.DXDraw1.Surface, 450, 450, 0); frmMain.DXIL2.Items.Find('menu4').Draw(frmMain.DXDraw1.Surface, 500, 550, 0); frmMain.DXIL2.Items.Find('menu5').Draw(frmMain.DXDraw1.Surface, 350, 650, 0); with frmMain.DXDraw1.Surface.Canvas do begin Brush.Style := bsClear; Font.Color := clwhite; Font.Size := 12; Textout(0,0,inttostr(frmMain.DXWL1.Items.Find('introbeat').Volume)); Textout(0,20,inttostr(iMenuSelect)); end; if bFadeBGSound=true then begin if frmMain.DXWL1.Items.Find('introbeat').Volume>-2000 then frmMain.DXWL1.Items.Find('introbeat').Volume:=frmMain.DXWL1.Items.Find('introbeat').Volume-20 else begin frmMain.DXWL1.Items.Find('introbeat').Stop; if iMenuSelect=1 then GameState:=gsGameInit else if iMenuSelect=4 then GameState:=gsCreditsInit else if iMenuSelect=5 then begin frmMain.DXTimer1.Enabled:=false; frmMain.Close; end; end; end;
Delphi-Quellcode:
Und das passiert in "ProcessGamestate":
procedure TfrmMain.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin try DXDraw1.Surface.Fill( clwhite ); ProcessGamestate; if bShowCardSprite=false then CardSprite.Visible:=false; DXSpriteENgine1.Dead; DXSpriteEngine1.Move(2); DXSpriteEngine1.Draw; bmbleft:=false; except dxtimer1.Enabled:=false; messagedlg('An error has occurred',mterror,[mbok],0); end; dxdraw1.Flip; end;
Delphi-Quellcode:
Wie gesagt, das ist supernervig umzusetzen, da ich mein Spiel im Vollbildmodus laufen lassen will und mich daher um jeden Mist selbst kümmern muß - man darf ja nicht vergessen, dass neben der reinen Anzeige des Menüs auch noch weitere Aktionen wie Musik abspielen, Cursor animieren, etc. weiter laufen sollen (bzw. müssen).
procedure TfrmMain.ProcessGamestate;
begin case GameState of gsInit : doInit; gsStart : doStart; gsIntro1 : doIntro1; gsMenuInit : doMenuInit; gsMenu : doMenu; gsGameInit : doGameInit; gsGame : doGame; gsCreditsInit : doCreditsInit; gsCredits : doCredits; end; end; Gruß Kay |
Re: Suche Ideen für Game Menü (bin bald am verzweifeln)
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab auch mal was gemacht. Exe Datei ist im Anhang wenn ihr wollt häng ich auch die Source dran.
Menue runter: a Menue hoch: q |
Re: Suche Ideen für Game Menü (bin bald am verzweifeln)
:thuimb:
Zitat:
|
Re: Suche Ideen für Game Menü (bin bald am verzweifeln)
Liste der Anhänge anzeigen (Anzahl: 1)
xD Hier ist er.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz