brauche dringend hilfe bei meinem menü

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

dennis94

Betreff: brauche dringend hilfe bei meinem menü

BeitragSa, Dez 19, 2009 13:55
Antworten mit Zitat
Benutzer-Profile anzeigen
;anfangs menu
Graphics 800, 500
While Not KeyHit(28);enter
Menu=LoadImage("menu.bmp")

SetBuffer BackBuffer() ;Flüssige Bewegung

DrawImage menu,1,1;Malt das Bild bei den Koordinaten x,y
Flip
Wend


If KeyDown (31);s
EndIf
Menu2=LoadImage("menu2.bmp")

SetBuffer BackBuffer() ;Flüssige Bewegung

DrawImage menu2,1,1;Malt das Bild bei den Koordinaten x,y


Flip



If KeyHit(14) Then Return To menu ;backspace




If KeyDown (19);r
EndIf
Menu3=LoadImage("menu3.bmp")

SetBuffer BackBuffer() ;Flüssige Bewegung

DrawImage menu3,1,1;Malt das Bild bei den Koordinaten x,y


Flip



If KeyHit(14) Then Return To menu ;backspace
 

mDave

BeitragSa, Dez 19, 2009 14:11
Antworten mit Zitat
Benutzer-Profile anzeigen
warum lädst du bilder in der schleife?
und warum benutzt du keine code-tags?
und was ist überhaupt deine frage?

Tankbuster

BeitragSa, Dez 19, 2009 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ersten: Was willst du genau?
Hilfe?

Ein Paar kleine Tipps bekommst du auf jedenfall.

1. Du kannst deinen Code in eine CodeBox einrücken. Das sieht erstens viel schöner aus und verschwendet auch nicht soviel Platz.
2. Man merkt, dass du grade erst angefangen hast zu Programmieren. Sry, aber da sind soviele Fehler drin...

Du solltest deinen Code immer so aufbauen:

Code: [AUSKLAPPEN]

Graphics 800,600
SetBuffer Backbuffer()

;Bilder laden

Timer=CreateTimer(60)

While Not Keydown(1)
Cls

;Berechnen

;Anzeigen

WaitTimer(Timer)
Flip 0
Wend


Das ist quasi eine Form, die man eigentlich sogut wie bei jedem Programm benutzt. Du rufst SetBuffer BackBuffer() immer in einer Schleife auf. Das kannst du einmal am Anfang machen, dann reicht es.
Ebenso lädst du jeden Schleifendurchlauf das Hintergrundbild neu in den Speicher. Einmal davor reicht ebenfalls.
Flip wird eigentlich auch nur einmal pro Schleife benötigt, nachdem alle Bilder gezeichnet wurden.

Noch ein Tpp zum Abschluss...
Es kommt einem so vor, als ob du nicht viel Ahnung hättest, was die Befehle überhaupt machen bzw, was ihre genaue Funktion ist. Du kannst hier im Portal die Hilfe benutzen, und erstmal, wenn du einen neuen Befehl verwendest die Dokumentation lesen. Da ist meistens ein Beispiel bei, wo auch gezeigt wird, wie man die Sache richtig anwendet.
Ansonsten... tutorials lesen! Wink

MFG
Tank


EDIT: Hier noch der Link zur Hilfe: https://www.blitzforum.de/help/
 

dennis94

BeitragSa, Dez 19, 2009 14:19
Antworten mit Zitat
Benutzer-Profile anzeigen
sry
meine frage ist wie man ein menu bekommt mit "spielen" , "steuerung "... das wenn man z.b die taste s drückt zu steuerung kommt und wenn man die taste backspace drückt zurück zum menu kommt
i hab das hier versucht aba wir ham das nicht soo ausführlich in der schule durchgenimmen
deshalb brauch i eure hilfe!Smile

Midimaster

BeitragSa, Dez 19, 2009 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Jedes Programm besteht aus einem Vorspann. Dort schreibst Du alles rein, was nur 1x gemacht werden muss:

Graphics..

LoadImage

Variablen definieren

...dann kommt die Hauptschleife, die meist so aussieht:

Code: [AUSKLAPPEN]

Repeat
    Cls
    Drawimage Hintergrund,0,0
    If KeyDown(28) Then
        End
    ElseIf KeyDown(31) Then
        Blabla...
    ElseIf Keydown(...) Then
        Blablabla...
    Endif
   
    Flip
Forever


Bei blabla schreibst Du dann hin ,was in den einzelnen Teilen passieren soll

Damit nun der Bildschirm nach einen Tastendruck in dem zuletzt gewählten "Mode" bleibt, kannst Du z.b. eine Variable AktMode% einführen, die dann im Zeichenteil ein dazu passenden Bild anzeigt:

SpielBild=LoadImage(...
SetupBild=LoadImage(...
StartBild=LoadImage(...

Code: [AUSKLAPPEN]

Repeat
    Cls
    Select AktMode%
       Case 0
            Drawimage StartBild,0,0
       Case 1
            Drawimage SetupBild,0,0
       Case 2
            Drawimage SpielBild,0,0
    If KeyDown(28) Then
        End
    ElseIf KeyDown(31) Then
        AktMode=1
    ElseIf Keydown(...) Then
        AktMode=2
    Endif
   
    Flip
Forever


In dem folgenden Beispiel wir dann auch noch eine abgestimmter Spielablauf möglich. spätestens jetzt solltest Du erste Funktionen einfügen. Das ist nichts anderes als "augelagerter Codetext, der eigentlich an die Stelle in der Hauptschleife gehört. Aber so bleibt alles übersichtlich:

Code: [AUSKLAPPEN]

Repeat
    Cls
    Select AktMode%
       Case 0
            Drawimage StartBild,0,0
            StartFunktion
       Case 1
            Drawimage SetupBild,0,0
            Einstellungen
       Case 2
            Drawimage SpielBild,0,0
            Spielen
    End Select
    If KeyDown(28) Then
        End
    ElseIf KeyDown(31) Then
        AktMode=1
    ElseIf Keydown(...) Then
        AktMode=2
    Endif
   
    Flip
Forever


Function StartFunction()
    Text 100, 100, "Herzlich willkomen"
    blabla....
end function

Function Einstellungen()
    Text 100, 100, "Einstellungen"
    blabla....
    Repeat
        Cls
        Select EinstellungsMode%
            Case 1
                Gegnerzahl=1000
            Case 2
                 blabla
        End Select

           If KeyDown(28) Then
               EinstellungsMode=99
           ElseIf KeyDown(31) Then
               EinstellungsMode=1
           ElseIf Keydown(...) Then
               EinstellungsMode=2
          Endif
         
          Flip
    Until EinstellungsMode=99
end function


Function Spielen()
       If Gegner = WasAuchImmer then
          blabla
       else
             ......
      endif
End Function

  • Zuletzt bearbeitet von Midimaster am Sa, Dez 19, 2009 15:11, insgesamt einmal bearbeitet

Jamagin

Betreff: wg. menu

BeitragSa, Dez 19, 2009 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Am besten man fängt mal nicht mit dem menü an sondern mit dem eigentlichen Kern der Sache. Menü und grafisches Schnickschnack eher erst am Ende. Da sonst für die grafischen Spielerein zuviel Zeit draufgeht und man irgendwann die Lust verliert und das Projekt in der Schublade landet! Schade dann.

Am besten zuerst mal ein Konzept erstellen, was man proggen will und das dann eben Schritt für Schritt umsetzen. Für grafische Objekte kann man ja Platzhalter verwenden. Aber das bleibt jeden selbst überlassen. Und wie die anderen schon sagen, zuerst Tutorials lesen oder kleine Programme anschauen wie diese funktionieren und dann ein eigenes Projekt starten, sodaß man einmal die Befehle kennt.

Will nicht kritisieren, aber programmieren besteht nicht aus, wie geht das, mach mir das, sondern sich selbst Gedanken machen und wenn es dann nicht geht, kann man ja Lösungsansätze oder Fragen posten!

Bitte sehe das nicht als Müll an was ich schreibe, ich hab auch klein begonnen aber ich hab zu Beginn auch den gleichen Fehler gemacht. Zuerst ein schönes Titelbild erstellt, dann ein Menü und da ich in der Hauptsache (wo das eigentliche Spiel gesteuert wird) steckenblieb, landete mein erstes Projekt im Müll! Schade

Also zuerst ein Konzept und dann den Rest...

lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

Midimaster

BeitragSa, Dez 19, 2009 15:17
Antworten mit Zitat
Benutzer-Profile anzeigen
@jamagin

ja, aber dennis94 hat ja eine echt wichtige Frage zum Startkonzept seines Programms. Er sollte schon zu Beginn die anstehenden Arbeiten in sinnvolle Abschnitte unterteilen.

Und er sollte gleich weg vom Spaghetti-Code zu einem Konzept "Vorbereitung-Haupschleife" mit Sprüngen in Unterfunktionen.

Mal sehen, wie sein nächster Versuch aussieht...
 

dennis94

BeitragSa, Dez 19, 2009 15:26
Antworten mit Zitat
Benutzer-Profile anzeigen
das eigentiche spiel hab i ja schon gemacht^^
i cecks imma noch netwie dat geht??
so funktionierts auch nicht^^




Graphics 800, 500


Menu=LoadImage("menu.bmp")
Menu2=LoadImage("menu2.bmp")
Menu3=LoadImage("menu3.bmp")




Repeat
Cls
DrawImage menu,1,1;
If KeyDown(28) Then
End
ElseIf KeyDown(31) Then ;s
DrawImage menu2,1,1;
ElseIf KeyDown(19) Then ;r
DrawImage menu3,1,1;
EndIf

Flip
Forever

SpielBild=LoadImage("menu.bmp")

SetupBild=LoadImage("menu2.bmp")

StartBild=LoadImage("menu3.bmp")




Repeat

Cls

Select AktMode%
Case 0
DrawImage StartBild,1,1;

Case 1
DrawImage SetupBild,1,1;

Case 2
DrawImage SpielBild,1,1;

If KeyDown(28) Then
End

ElseIf KeyDown(31) Then
AktMode=1
ElseIf KeyDown(19) Then
AktMode=2
EndIf

Flip
;Forever

Jamagin

Betreff: wg. Menü

BeitragSa, Dez 19, 2009 15:26
Antworten mit Zitat
Benutzer-Profile anzeigen
@midimann

huch! Dann hab ich diese wichtige Frage ganz einfach übersehen! Klar Einteilung ist alles. Sorry, hab es nur gut gemeint. Hab wieder mal zu weit gedacht!!

Du hast schon recht - Der Aufbau ist ungemein wichtig, dennoch würde ich ein Menü eher zum Ende hin machen, weil ich nicht ständig die Lust habe, wenn ich das Programm starte, immer auswählen mag...
Aber wie gesagt, das bleibt jeden selbst überlassen und wenn dennis94 schon etwas weiter ist mit dem Programmieren, dann wird er auch auf Include... setzen. Damit alles schön sauber bleibt. So mach ich das halt!

Variablen, Bilderladen, Sounddateien, etc. alles in externen Dateien, somit hab ich die volle Übersicht und mein Code bleibt sauber...!
Aber mein Grundsatz war ja das Konzept!!

lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

Jamagin

Betreff: wg. menu

BeitragSa, Dez 19, 2009 15:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

Graphics 800, 600, 0, 2
setbuffer backbuffer()                  ; <---------------  WICHTIG

Menu=LoadImage("menu.bmp")
Menu2=LoadImage("menu2.bmp")
Menu3=LoadImage("menu3.bmp")

Repeat
   Cls
   DrawImage menu,1,1;
   If KeyDown(28)                         ; <---- das THEN kannst dir sparen
      End
   ElseIf KeyDown(31)                  ;s
      DrawImage menu2,1,1;
   ElseIf KeyDown(19)                  ;r
      DrawImage menu3,1,1          ;
   EndIf

Flip
Forever

SpielBild=LoadImage("menu.bmp")            ; <--- warum nochmals laden?
SetupBild=LoadImage("menu2.bmp")        ; <---- ??
StartBild=LoadImage("menu3.bmp")         ; <---- ??



ha, wieso ladest die bilder 2x??

lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

Midimaster

BeitragSa, Dez 19, 2009 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Alles unter Forever muss weg!!! Da kommt das Programm sowieso nie hin. Unterhalb von Forever stehen normalerweise nur noch Funktionen.

Mein Beispiel 2 sollte hier helfen: Die Unterscheidung erfolgen immer innerhalb der Repeat-Schleife. Dort gehört der Code zu jeden Menü hin, oder der Aufruf einer Funktion in der dieser Code steht.
 

dennis94

BeitragSa, Dez 19, 2009 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
danke funktioniert super
aber wie kombiniert man das mit einem anderen programm?
Eigentlich sollte doch das programm starten wenn man enter(28) drückt?
wie kombiniert man die 2 programme?

Jamagin

Betreff: wg. menü

BeitragSa, Dez 19, 2009 16:39
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn du key(28) drückst, steht da end und nicht exit!!

lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

das wurgel

BeitragSa, Dez 19, 2009 16:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein anderes Programm starten kann man mit
Code: [AUSKLAPPEN]
ExecFile "Programm.exe startparameter"

Ich glaube aber kaum, dass das im Sinne deines Vorhabens ist. Das Spiel und das Menü sind beide in einem Programm. Oder habe deine Frage falsch vertstanden?
Wie auch immer, ich geb dir nochmal einen Grundgerüst, das mit Kommentaren erklärt ist.
Code: [AUSKLAPPEN]

Graphics 800, 500, 16, 2

timer=CreateTimer(40) ; Ein Timer erstellen. Nötig damit das Programm nicht die komplette CPU-Auslastung verbraucht, um so schnell wie möglich zu laufen.
; Mehr als 40 Bilder pro sekunde sind nicht nötig, da man sowieso keinen Unterschied festsellen wird

Global AktMode=0 ;Modus auf "Anfangsmenü" setzen

SetBuffer BackBuffer() ; Backbuffer setzen. Alles was ab hier gezeichnet wird, wird nicht direkt angezeigt, sondern ist erst unsichtbar

; Bilder laden
SpielBild=LoadImage("menu.bmp")
SetupBild=LoadImage("menu2.bmp")
StartBild=LoadImage("menu3.bmp")

Repeat
   AppTitle AktMode
   
   Select AktMode
      Case 0 ; Anfangsmenü
         AnfangsMenuFunktion()
         If KeyHit(1) Then Exit ;Schleife wird beendet, sobald man im Anfangsmenü Escape drückt
      Case 1 ; Einstellungen
         EinstellungenFunktion()
      Case 2 ; Spiel
         Spiel()
   End Select
   
   Flip 0 ; Inhalt des Backbuffers auf den Bildschirm tun
   Cls ; Inhalt des BackBuffers löschen
   WaitTimer timer ;Solange warten, bis eine 40tel sekunde seit dem letzen Aufruf vergangen sind
Forever

End


Function AnfangsMenuFunktion()
   ; Mit R wird das Spiel gestartet, mit S kommt man zu den Einstellungen
   If KeyHit(19) Then ;Taste R
      AktMode=2 ; Modus auf "Spiel" setzen
   ElseIf KeyHit(31) Then ;Taste S
      AktMode=1 ; Modus auf "Einstellungen setzen"
   EndIf
   
   DrawImage StartBild, 0, 0 ;Menu zeichnen
   ; 0,0 sind die Anfangskoordinaten in BB
End Function

Function EinstellungenFunktion()
   ; Mit Escape gehts zurück in das Anfangsmenü
   If KeyHit(1) Then ;Taste Esc
      AktMode=0 ; Modus auf "Anfangsmenü" setzen
   EndIf
   
   DrawImage SetupBild, 0, 0 ;Menu zeichnen
End Function

Function Spiel()
   ; Mit Escape gehts zurück in das Anfangsmenü
   If KeyHit(1) Then ;Taste Esc
      AktMode=0 ; Modus auf "Anfangsmenü" setzen
   EndIf
   
   ;Hier kann die Steuerung der Spielfigur hin
   
   ;Hier können Gegner Bewegt werden
   
   
   DrawImage SpielBild ; Hintergrundbild zeichnen
   
   ;Hier können Dinge gezeichnet werden, die vor dem Hintergrundbild erscheinen sollen
   
End Function

Das sollte dir mit deinen Problemen weiterhelfen

MfG

PS: Wie bereits erwähnt, solltest du hier im Forum die Codetags benutzen wenn du Code postest. Das macht den Thread übersichtlicher. Die gehen so: [*code] Hier steht der Quelltext [*/code]
Wäre cool wenn du das in deinen vorherigen Beiträgen noch editierst. Danke.
1 ist ungefähr 3

Jamagin

Betreff: wg. menu

BeitragSa, Dez 19, 2009 16:57
Antworten mit Zitat
Benutzer-Profile anzeigen
@das wurgel

CreateTimer(60) wenn schon, denn die FPS bei den Monitoren sind standard auf 60 eingestellt bzw. 70-72. Die älteren Modelle hatten auch noch höhere Frequenzen aber mit 60 Frames/Sek fährt man gut!!

lg. Jamagin Cool

NB: Noch was, wenn man mit CreateTimer(40) oder eben auf 60 hat Flip 0 keinen Unterschied zu Flip, da ja die FPS mit Variable = CreateTimer(Wert) und Waittimer(Variable) gedrosselt wird.
Bevor du etwas neues beginnst, erledige das alte

Tankbuster

BeitragSa, Dez 19, 2009 17:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Für ein Menü reicht es aber durchaus, wenn es nur mit 20~40 Fps läuft. Es sei denn es sind irgendwelche Bewegungsspilereien oder HintergrundSzenen im Menü..
Twitter
Download Jewel Snake!
Windows|Android

Midimaster

BeitragSa, Dez 19, 2009 17:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Leute.....

dennis94 weiss noch nicht so recht, wie sein Programm in einer Dauerschleife laufen könnte, da kommt Ihr ihm mit Timern und CPU-Auslastung und FPS....

Das ist ihm doch bei seinem ersten Programm total schnuppe und verwirrt hier nur!

Der hat Repeat/Until noch nicht richtig verdaut!

@dennis94

Deine anderen Programmteile werden zu Funktionen der ersten Hauptschleife. Alles das, was bei Deinem anderen Programm an "Vorarbeit" zu leisten ist, schreibst Du jetzt vor die Repeat-Schleife. Alles was, z.B. während des eigentlichen Spiels passiert gehört in eine...

Code: [AUSKLAPPEN]
Function Spielen()
     blablabla
End Function


Alles was zum "Menü" gehört, gehört in eine
Code: [AUSKLAPPEN]
Function Menue()
     blablabla
End Function


Das was Du als Menü bezeichnest, ist also im Grunde nichts anderes als ein "anderes Spiel". Das wie das "Spielen()" von der Hauptschleife Repeat/Until im Bedarfsfall gerufen wird.

Diese Funktionen dürfen im Prinzip wieder einen Vorab-Teil und eine "Repeat/Until" enthalten, aus der Du dann mit z.B. ESC zum Hauptschleife zurückkehrst, oder eventuell gleich in die "Menue()" rüberwechselst:

Code: [AUSKLAPPEN]
Function Spielen()
    vorweg-blablabla
    Repeat
        laufen()
        schiessn()
        schlagen()
        Bildaufbau
        If Keydown( blabla)
            Spieler nachrechts
        else
           ......
    Until KeyDown(1)
    nachher blabla
    AktMode=1   ; sofort ins menü, wenn zurück in die hauptschleife
End Function

das wurgel

BeitragSa, Dez 19, 2009 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Midimaster
Das mit dem Timer habe ich ja auch nur reingebaut, weil ich nicht ruhig schlafen kann, wenn ich weis, dass irgendwo weit weg ein Rechner sehr leiden muss... nur wegen meinem beispielcode Crying or Very sad
1 ist ungefähr 3
 

dennis94

BeitragSa, Dez 19, 2009 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
viielen dank

Jamagin

Betreff: wg. menu

BeitragSa, Dez 19, 2009 17:56
Antworten mit Zitat
Benutzer-Profile anzeigen
@das wurgel

ha ha, eine gute Ausrede... ein armer leidender PC! *ich keks mi ab...*

außerdem hab ich dennis94 eine pm (privatnachricht) geschickt, aber anscheinend will er das nicht! Ist ja auch egal...

Wie midimaster schon erwähnte, jep das is es...!

lg. Jamagin Cool

NB: lasst eam doch probieren
Bevor du etwas neues beginnst, erledige das alte

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group