XNA C# Listeneinträge auswählen

phönix

Enthusiast
Thread Starter
Mitglied seit
25.03.2007
Beiträge
2.823
XNA C# Buttons OOP - Abgeschlossen
Moin :)

ich programmiere derzeit ein kleines Spiel mit XNA und C# und bin auf ein Problem gestoßen, das ich einfach nicht lösen kann. :(

Es wird ein simples Strategiespiel und aktuell baue ich ein "Ingame" Menü auf, also womit man dann im Spiel das Spielgeschehen beeinflussen kann. Hierfür benötige ich natürlich einige Buttons :).
Ich habe eine eigene Klasse für die Buttons, in der ich festlege, wann die "Hover" Textur angezeigt werden soll.

Code:
public void C_Resolution()
        {
            int listitems = res.Count;
            
            if(Keyboard.GetState().IsKeyDown(Keys.Up))
            {
                i = i + (-1);
                if (i <= 0)
                {
                   i = listitems;
                }
            }
            else if (Keyboard.GetState().IsKeyDown(Keys.Down))
            {
                i = i + 1;
                if (i >= listitems)
                {
                    i = 0;
                }
            }
          
            
            graphics.PreferredBackBufferWidth = res[i].rWidth;
            graphics.PreferredBackBufferHeight = res[i].rHeight;
            if (Keyboard.GetState().IsKeyDown(Keys.Enter))
            {
                LoadContent();
                graphics.ApplyChanges();
            }
        }
Das klappt auch wunderbar und ich kann mit dieser Klasse ohne große Schreibarbeit Buttons instanziieren lassen(die Buttons werden in einer Map-Klasse instanziiert, die die Spielumgebung aufbaut) . Allerdings besitzen sie so noch keine Funktion. Jetzt kann ich die Funktionen der einzelnden Buttons natürlich in der Map-Klasse festlegen.

Also z.B. wenn Mausposition = Button1 Position ist und geklickt wurde, dann führe das aus,
wenn Mausposition = Button2 Position ist und geklickt wurde, dann führe das und das aus.

Wenn ich das auf diese Weise für jeden Button in der Map-Klasse festlege, ist das aber ein ungeheurer Schreibaufwand.
Ich hoffe es ist bis hier hin verständlich, was mein Problem ist.


Jetzt kann ich ja der Button-Klasse einfach folgenden Befehl geben:

Code:
if (Mouse.GetState().LeftButton == ButtonState.Pressed && oldState.LeftButton != ButtonState.Pressed){

}

Und hier weiß ich nicht mehr weiter. Ich hatte mir gedacht, dass ich dann einen Boolean auf True setze. Allerdings weiß ich nicht, wie ich das dann zur Map-Klasse übertrage, damit die damit dann etwas anfangen kann.
Also z.B. wenn Button1 den Wert true hat, dann mache dies und das.
Vielleicht habt ihr sogar eine bessere Idee, wie man das Lösen kann.

Ich hoffe ich hab mich verständlich genug ausgedrückt :d und ich bedanke mich jetzt schonmal für eure Hilfe.


mfG

eine Klasse -> eine Variable, mehrere Instanzen -> verschiedene Werte - abgeschlossen
Ich bins mal wieder :)

Ich bin in C# auf ein neues Problem gestoßen.
Ich habe von einer Klasse mehrere Instanzen erstellt. Ich nenne die Klasse jetzt mal "Ball". Ball verfügt über eine Int-Variable mit einem Wert von 0.
Jetzt habe ich also z.B. 3 Bälle instanziiert und alle 3 Bälle haben den Wert 0. Ich möchte jedoch, dass die 3 Bälle jeweils einen anderen Wert haben, ohne 2 weitere Variablen erstellen zu müssen.
Also z.B.
Ball 1 hat den Wert 1,
Ball 2 hat den Wert 2 und
Ball 3 hat den Wert 3.

Hat hier jemand einen Tipp für mich, wie ich das lösen kann? :)

Standard XNA C# Listeneinträge auswählen - Abgeschlossen
Ich arbeite aktuell an einer kleinen simplen 2D Engine und habe mehrere 16:9 Auflösungen in einer Liste abgelegt. Nun möchte ich mit den Pfeiltasten aus dieser Liste eine dieser Auflösungen auswählen und sie durch drücken der Enter Taste aktivieren. Ich habe es so gelöst, dass beim drücken der Pfeiltasten entweder ein Wert addiert oder subtrahiert wird. So bestimme ich, welcher Listeneintrag ausgewählt wurde. Dann musste ich noch ein Limit einfügen, da die Liste ja nur eine bestimmte Anzahl von Einträgen hat :)
Allerdings funktioniert das aktuell nur, wenn ich einen Wert dazu addiere und damit die Liste von oben nach unten abarbeite. Umgekehrt, also wenn ich einen Wert subtrahiere, schmiert mir die "Engine" ab.

Hat jemand eine Idee woran es liegen kann?
Falls ihr eine bessere Idee habt, wie man die Listeneinträge einzeln auswählen kann, dann könnt ihr sie mir gerne mitteilen :)

Code:
 public void C_Resolution()
        {


            int listitems = res.Count;
            
            if(Keyboard.GetState().IsKeyDown(Keys.Up))
{
                i = i - 1;
                if (i <= 0)
                {
                  [B] i = listitems - 1;[/B]
                }
            }
            else if (Keyboard.GetState().IsKeyDown(Keys.Down))
            {
                i = i + 1;
                if (i >= listitems)
                {
                    i = 0;
                }
            }
          
            
            graphics.PreferredBackBufferWidth = res[i].rWidth;
            graphics.PreferredBackBufferHeight = res[i].rHeight;
            if (Keyboard.GetState().IsKeyDown(Keys.Enter))
            {
                LoadContent();
                graphics.ApplyChanges();
            }
        }



mit freundlichen Grüßen :)


Lösung:

Die Liste beginnt beim Index 0, wenn die Einträge gezählt werden, wird jedoch nicht bei der Zahl 0 angefangen :)
D.h ich habe 4 Elemente in der Liste, also i = 4. Der letzte Eintrag in der Liste hat jedoch den Index 3, damit greife ich auf ein nicht existenten Eintrag zu und die Engine schmiert ab.
 
Zuletzt bearbeitet:
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
oder einfacher ausgedrückt: wie kann man z.B. einen Boolean aus einer Klasse in einer nicht veerbten anderen Klasse auslesen?
 
Normalerweise reagiert man auf das Drücken eines Buttons durch entsprechende Listener. Wenn also auf einen Button geklickt wurde, werden wird der Listener ausgeführt.

Zu deiner letzten Frage: Einfach durch Zugriff auf die entsprechende Variable... Dazu muss sie natürlich public sein, sonst geht das nicht.
 
dass man Variablen oder Methoden auf public setzen muss, um von außen auf sie zugreifen zu können, das weiß ich auch
ich weiß nur nicht, wie ich dann auf eine public Variable oder eben eine public Methode in einer anderen nicht geerbten Klasse zugreife?
Bsp.:

Code:
//Button Klasse
public Boolean geklickt = false;


if (Mouse.GetState().LeftButton == ButtonState.Pressed && oldState.LeftButton != ButtonState.Pressed){

geklickt = true;

}

Code:
//andere nicht geerbte Klasse

Button neuerButton;

neuerButton = new Button(normal, hover);

usw.

wie greife ich auf den Boolean in der Button-Klasse zu?
 
Zuletzt bearbeitet:
sodele, ich habs mittlerweile zumindest für die Variablen herausgefunden, ist eigentlich auch sehr simpel :d:

Bsp.:
Code:
//Button Klasse

public Boolean geklickt = false;


if (Mouse.GetState().LeftButton == ButtonState.Pressed && oldState.LeftButton != ButtonState.Pressed){

geklickt = true;

}
Code:
//andere nicht geerbte Klasse

Button neuerButton;

neuerButton = new Button();


 public void Draw(SpriteBatch sb)
 {

   if(neuerButton.geklickt == true){
      Irgendwas.Draw(sb)
   }

 }
 
Fehlt nur noch die Sache mit dem Eventlistener. Wenn man es genau nehmen will, darfst du bei OOP auch keine Public Variablen haben.
 
Wenn man es genau nehmen will, darfst du bei OOP auch keine Public Variablen haben.

jaja, die alte "get, set" leier. ich weiss, dass man es macht, ich machs (wenns was ernstes wird) aber ich hab nie verstanden wieso.. :d
 
Von "jaja" werd ich nicht satt und du nicht sauber :d

Bei einem Button mit einem Booleanwert wird man nie die Notwendigkeit für eine Get und Set Funktion erklären können. Das ist der Nachteil von solch einfachen Beispielen. Bei größeren Projekten sieht die Welt schnell ganz anders aus. Wenn du wissen willst was ohne get und set Funktionen passiert, solltest du dir mal eine schlechte API oder ähnliches ansehen. Ohne Hilfe hat man da keine Chance. Baut man ein paar ordentliche get und set Funktionen, wird es bereits spürbar besser.
 
Update :)

---------- Post added at 19:14 ---------- Previous post was at 17:09 ----------

hat sich auch schon erledigt :d

Lösung:
falls man mit "static" arbeitet, so wie in meinem Fall, static vor der Variable löschen ;)
Damit bleiben die Werte in den einzlenden Instanzen unabhängig voneinander.
 
und schon gelöst :d
 
Zuletzt bearbeitet:
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh