Laden...

Windows Forms Tastatureingabe über Pfeiltasten

Erstellt von PeterVoss vor 6 Jahren Letzter Beitrag vor 6 Jahren 4.715 Views
P
PeterVoss Themenstarter:in
15 Beiträge seit 2017
vor 6 Jahren
Windows Forms Tastatureingabe über Pfeiltasten

Hallo zusammen,

folgendes Problem. Ich habe ein Labyrinth und eine Spielfigur (@ Zeichen). Diese Figur möchte ich mit den Pfeiltasten der Tastatur durch das Labyrinth bewegen und die Items (Punkte) aufsammeln.
Wie kann ich die Steuerung in meinem Code implementieren?

string figur = "@";

            Rectangle rectangle1 = new Rectangle(x, y, 400, 310);
           
            Rectangle rectangle2 = new Rectangle(newx,newy,400,310);
                   

            Font drawFont = new Font("Century Gothic", 17);
            SolidBrush drawBrush = new SolidBrush(Color.Green);
            SolidBrush drawBrush2 = new SolidBrush(Color.Red);

            

            for (int i = 0; i < Labyrinth.GetLength(0); i++)
            {
                
                for (int j = 0; j < Labyrinth.GetLength(1); j++)
                {
                    rectangle1 = new Rectangle(x+(20*j), y+(20*i), 380, 260);
                   
                    e.Graphics.DrawString(Char.ToString(Labyrinth[i, j]), drawFont, drawBrush, rectangle1);
                    
                }
            }
            e.Graphics.DrawString(figur, drawFont, drawBrush2, rectangle2);

        }
16.834 Beiträge seit 2008
vor 6 Jahren

Musst eben in einer Endlosschleife (ja, das macht man bei Spielen so!) die Keys der Eingabe abfragen und dann auf den jeweiligen Key reagieren.

PS: bitte den Thread nur ein mal erstellen.

1.696 Beiträge seit 2006
vor 6 Jahren

Du musst die Key-Event von dein Control abonieren und auswerten.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

4.939 Beiträge seit 2008
vor 6 Jahren

Hallo Abt,

aber nur bei Echtzeit-Rendering Spielen (also auf Grundlage von DirectX oder OpenGL).
Hier bei WinForms reichen die von vbprogger erwähnten Key-Events (KeyPress, KeyDown oder KeyUp).

PeterVoss: In diesen Methoden dann auf die Tasten reagieren und Invalidate() oder Refresh() aufrufen (s.a. Whats the difference between Control.Invalidate, Control.Update and Control.Refresh?).

P
PeterVoss Themenstarter:in
15 Beiträge seit 2017
vor 6 Jahren

Hey danke schon mal für die Antworten. Habe jetzt folgendes eingebaut

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.Up)
            {
                MessageBox.Show("Pfeiltaste nach oben");
                Refresh();
                return true;
            }
            if (keyData == Keys.Down)
            {
                MessageBox.Show("Pfeiltaste nach unten");
                Refresh();
                return true;
            }
            if (keyData == Keys.Right)
            {
                MessageBox.Show("Pfeiltaste nach rechts");
                Refresh();
                return true;
            }
            if (keyData == Keys.Left)
            {
                MessageBox.Show("Pfeiltaste nach links");
                Refresh();
                return true;
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }

Ich müsste jetzt irgendwie meine Figur beim Drücken einer Pfeiltaste neuzeichen lassen, ist das korrekt? Wie bekomme ich jetzt in die if Abfrage irgendwie den Drawstring für die Figur rein? Oder gibt es bessere Lösungen für das Problem?

4.939 Beiträge seit 2008
vor 6 Jahren

Am besten, du merkst dir die X,Y-Position der Spielfigur in einer eigenen Membervariablen (noch besser wäre eine eigene Spiellogik-Klasse) - anstatt direkt als Zeichen im Labyrinth-Array. In den Ereignismethoden änderst du dann diese Position und in der Paint-Methode zeichnest du dann nach dem Labyrinth dann noch die Spielfigur explizit an dieser aktuellen X,Y-Position.