Local Anfängerprobleme

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Raiden93

Betreff: Local Anfängerprobleme

BeitragDi, Aug 09, 2011 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey,
ich habe mir mal gedacht ich fange so langsam mal an, Locale Variablen zu benutzen doch leider habe ich gerade ein bisschen Schwierigkeiten und Hoffe das mir der ein oder andere vielleicht 1,2 Tipps geben könnte.

Also ich wollte mal ein kleines Retro Pong Programmieren, doch leider kriege ich Local nicht meine Menü Auswahl Punkte zum laufen.
Sobald ich (Pfeil Oben) benutze soll die Selektion ein Hoch gehen und bei (Pfeil Runter) die Selektion nach unten. Meine Selektion bleibt aber solange sie Local ist so stehen wie sie ist da sie ja bei jedem Durchlauf neu erstellt wird.
Wie würdet ihr das Problem Lösen?

Code: [AUSKLAPPEN]
Function Gui (Game_Modus, Font_Blitz_Logo, Font_Blitz)
   Select Game_Modus
      Case 1 ;Hauptmenü
         Local Menu_Auswahl = 3
         
         ;Logo
         SetFont Font_Blitz_Logo
         Color 255,255,255
         Text 180,10,"Retro Pong"
         
         If KeyHit (200) And Menu_Auswahl >1 ;Hoch
            Menu_Auswahl = Menu_Auswahl -1
         Else If KeyHit (208) And Menu_Auswahl <3 ;Runter
            Menu_Auswahl = Menu_Auswahl +1
         End If
         
         ;Menü Punkte
         If Menu_Auswahl = 1
            SetFont Font_Blitz
            Color 255,255,0
            Text 270,230,"Spiel Starten"
            
            Color 255,255,255
            Text 310,280,"Optionen"
            
            Color 255,255,255
            Text 320,340,"Beenden"
         Else If Menu_Auswahl = 2
            SetFont Font_Blitz
            Color 255,255,255
            Text 270,230,"Spiel Starten"
            
            Color 255,255,0
            Text 310,280,"Optionen"
            
            Color 255,255,255
            Text 320,340,"Beenden"
         Else If Menu_Auswahl = 3
            SetFont Font_Blitz
            Color 255,255,255
            Text 270,230,"Spiel Starten"
            
            Color 255,255,255
            Text 310,280,"Optionen"
            
            Color 255,255,0
            Text 320,340,"Beenden"
         End If
      Case 2 ;Spiel
         
         
      Case 3 ;Optionen
   End Select
End Function

Xeres

Moderator

BeitragDi, Aug 09, 2011 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würd's lösen, indem ich Menu_Auswahl Global mache... Das ist einer der Dinge, die übersichtlicher und besser im Globalen Raum aufgehoben sind, eben, weil sie von überall änder- und einsehbar sein sollten.
Anderer Tipp: Gewöhne dir an, Konstanten zu benutzen, statt Zahlen.
Code: [AUSKLAPPEN]
Case 1 ;Hauptmenü
vs.
Case Game_State_Mainmenu
Lesbarer, und weniger Fehleranfällig.
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)

Raiden93

BeitragDi, Aug 09, 2011 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
wie meinst du das mit dem

Code: [AUSKLAPPEN]
Case 1 ;Hauptmenü
vs.
Case Game_State_Mainmenu


Soll ich für jede Zahl eine Konstante Variable erstellen?

Xeres

Moderator

BeitragDi, Aug 09, 2011 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Erst mal: "Konstante Variable" gibt es nicht Wink
Jeder Wert, der sich nicht ändert, kann eine Konstante werden. Dann kannst du auf Kommentare an der Seite verzichten, die kryptische Zahlen erklären müssen. True und False sind 1 und 0 vor zu ziehen - wenn die Werte Wahr und Falsch repräsentieren.
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)

BladeRunner

Moderator

BeitragDi, Aug 09, 2011 21:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Local vs. global ist ein heikles Thema.
Globale vereinfachen Dir den Zugriff auf Daten, bergen aber das Risiko von Fehlmanipulation.
Daher sind lokal gültige Variablen idR. vorzuziehen. Hier in diesem Fall ist es jedoch so dass Du ja einen Wert über mehrere aufrufe erhalten willst, und das geben die BB-Möglichkeiten nicht wirklich her (Unter Bmax wäre es kein Problem eine Globale mit Gültigkeit nur in der Funktion anzulegen).

In deinem Beispiel gäbe es mehrere Möglichkeiten:
- deklariere deine Auswahl global. Einfach umzusetzen. Torpediert jedoch die Datentrennung. ede beliebige Stelle des Programmes kann deine Auswahl verändern.
- Übergib der Funktion die aktuelle Auswahl und lasse sie die veränderte zurückgeben. Spart die Globale, ist jedoch auch nicht wirklich gekapselt.
- Erstelle einen Hilfstype / eine Bank / ein Array. Auch hier ist die Datenkapselung nur unvollständig. In Kombination mit eindeutig benannten Konstanten wäre es jedoch ein Schritt in die richtige Richtung.
Unter BB würde ich - auch wenn es mir schwerfällt- dennoch die erste Möglichkeit die sinnigste, sprich: eine globale für solche Fälle zu erlauben. ( hier ist es auch sehr schwer das Design so umzukrempeln dass auf eine Globale verzichtet werden kann).
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Midimaster

BeitragDi, Aug 09, 2011 23:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Xeres weist Dich auf eine andere Optimierungsmöglichkeit im Code hin. Sie hat gar nichts mit Deiner Frage zu tun, ist aber ein sehr sinnvoller Tipp und dient der besseren Lesbarkeit von Programmen und hilft Fehler zu vermeiden.

Du verwendest für die Select /Case-Struktur Zahlen zur Unterscheidung:

BlitzBasic: [AUSKLAPPEN]
Function Gui (Game_Modus, Font_Blitz_Logo, Font_Blitz)
Select Game_Modus
Case 1 ;Hauptmenü
...
Case 2 ;Spiel
...
Case 3 ;Optionen
...
End Select
End Function


Xeres rät Dir nun lieber symbolische Konstanten zu verwenden, wie etwa:

BlitzBasic: [AUSKLAPPEN]
Const HAUPT_MODUS=1 , SPIEL_MODUS=2 , OPTIONEN_MODUS=3

Function Gui (Game_Modus, Font_Blitz_Logo, Font_Blitz)
Select Game_Modus
Case HAUPT_MODUS
....
Case SPIEL_MODUS
....
Case OPTIONEN_MODUS
.....
End Select
End Function


So benötigst Du keine Kommentare mehr hinter den Zahlen, weil die "Zahl" selbst schon informativ ist. Das solltest D u dir unbedingt angewöhnen.

Wenn man es weitertreibt lassen sich so alle direkten Zahlen in Computerprogrammen durch erklärende Ausdrücke ersetzen:
BlitzBasic: [AUSKLAPPEN]
Const HAUPT_MODUS=1 , SPIEL_MODUS=2 , OPTIONEN_MODUS=3
Const MENU_STARTEN=1 , MENU_OPTIONEN=2 , MENU_BEENDEN=3
Const KEY_HOCH=200 , KEY_RUNTER=208

Function Gui (Game_Modus, Font_Blitz_Logo, Font_Blitz)
Select Game_Modus
Case HAUPT_MODUS
Local Menu_Auswahl = MENU_BEENDEN

;Logo
......

If KeyHit (KEY_HOCH) And Menu_Auswahl > MENU_STARTEN
Menu_Auswahl = Menu_Auswahl -1
Else If KeyHit (KEY_RUNTER) And Menu_Auswahl < MENU_BEENDEN
Menu_Auswahl = Menu_Auswahl +1
End If

;Menü Punkte
If Menu_Auswahl = MENU_STARTEN
....
Else If Menu_Auswahl = MENU_OPTIONEN
....
Else If Menu_Auswahl = MENU_BEENDEN
......
End If
Case SPIEL_MODUS


Case OPTIONEN_MODUS
End Select
End Function


Das ganze jetzt noch kombiniert mit einer Straffung des Codes in Bezug auf doppelte Zeilen:
Hier sieht man nun schön, wie der Einsatz von Konstanten den Code stark kürzt:

BlitzBasic: [AUSKLAPPEN]
Const HAUPT_MODUS=1 , SPIEL_MODUS=2 , OPTIONEN_MODUS=3
Const MENU_STARTEN=1 , MENU_OPTIONEN=2 , MENU_BEENDEN=3
Const KEY_HOCH=200 , KEY_RUNTER=208
Const WEISS=1 , GELB=2
Dim MenuText(4)

MenuText(MENU_STARTEN) = "Spiel Starten"
MenuText(MENU_OPTIONEN) = "Optionen"
MenuText(MENU_BEENDEN) = "Beenden"

Function Gui (Game_Modus, Font_Blitz_Logo, Font_Blitz)

Select Game_Modus
Case HAUPT_MODUS
Local Menu_Auswahl = MENU_BEENDEN

;Logo
SetFont Font_Blitz_Logo
SetFarbe WEISS
Text 180,10,"Retro Pong"

If KeyHit (KEY_HOCH) And Menu_Auswahl > MENU_STARTEN
Menu_Auswahl = Menu_Auswahl -1
Else If KeyHit (KEY_RUNTER) And Menu_Auswahl < MENU_BEENDEN
Menu_Auswahl = Menu_Auswahl +1
End If

;Menü Punkte
SetFont Font_Blitz

TextMenu 270,230 , MENU_STARTEN , MenuAuswahl
TextMenu 310,280 , MENU_OPTIONEN, MenuAuswahl
TextMenu 320,340 , MENU_BEENDEN , MenuAuswahl

Case SPIEL_MODUS


Case OPTIONEN_MODUS
End Select

End Function



Function SetFarbe(Farbe%)
Select Farbe
Case WEISS
Color 255,255,255
Case GELB
Color 255,255,0
End Select
End Function



Function TextMenu(X% , Y% , Menu% , Selected%)
If Menu =Selected
SetFarbe GELB
Else
SetFarbe WEISS
EndIf
Text X , Y, MenuText(Menu)
End Function


Der größte Vorteil aber liegt darin, dass Du nun sehr leicht viele weitere Menuzeilen einfügen kannst oder z.b. das gelbe Hervorheben ohne große Code-Änderungen in ein rotes oder grünes Hervorheben ändern kannst.

ZEVS

BeitragMi, Aug 10, 2011 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Sinn der Funktion Gui ist mir schleierhaft... Wieso benutzt du denn eine Funktion für drei völlig verschiedene Aufgaben? Soll das eine Art Front-Controller sein, wie man ihn aus MVC kennt, oder was? Wieso denn keine drei Funktionen: showMenu, showGame und showOptions? Da spart man sich doch das ganze Konzept mit den globalen Variablen.
ZEVS
 

PhillipK

BeitragMi, Aug 10, 2011 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich das nun richtig interpretiert habe, sind Const keinesfalls variablen Wink

Konstanten sind nicht umsonst KONSTANT - sie können niemals im programm geändert werden. Sie sind eine möglichkeit, komplexe programmstrukturen mit Lesbarkeit zu verfeinern. Beim compilevorgang wird jede Const durch ihren eigentlich wert ausgetauscht - im späteren Programmcode findet sich nur die Zahl, kein pointer auf den Wert im speicher Wink

aber nun zurück zum eigentlich thema - hat dir BladeRunner ein wenig helfen können? Smile

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group