Laden...

Wie kann ich Benutzereingaben in Konsole blockieren?

Erstellt von MisterXYUnbekannt vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.228 Views
M
MisterXYUnbekannt Themenstarter:in
2 Beiträge seit 2017
vor 6 Jahren
Wie kann ich Benutzereingaben in Konsole blockieren?

Hallo,
hab ein kleines Tetris Spiel in der Konsole geschrieben
funktioniert auch ganz gut nur leider hab ich Probleme damit einen Stein schneller fallen zu lassen
also so das der Spieler danach den Stein bis zum Ablegen nicht mehr bewegen kann
Was ich schon probiert habe ist mit der DLL user32 und der C++ Funktion BlockInput Tastatureingaben zu unterbinden
Nur leider werden die anderen Eingaben von Console.ReadKey trotzdem weiterabgefangen

Hier ist der Code mit dem ich das versuche


        
public partial class NativeMethods
    {
        [System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "BlockInput")]
        [return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
        public static extern bool BlockInput([System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)] bool fBlockIt);

    }

public static void BlockUserInput(int counter2)
        {
            try
            {
                NativeMethods.BlockInput(true);
                while (counter2 == counter)
                {
                    System.Threading.Thread.Sleep(0);
                }
            }
            finally
            {
                NativeMethods.BlockInput(false);
            }
        }

dabei ist counter2 die Variable die ich benutze um zu überprüfen wann der Stein am Boden aufsetzt
und counter ist eine Membervariable meiner Klasse

welche um eins erhöht wird

wann immer der Stein aufsetzt

counter2 ist im Grunde bei der Übergabe an die Funktion dieselbe Variable nur halt bevor sie um eins erhöht wird

In meiner Funktion run() prüfe ich dann in einer Schleife den Rückgabewert von Console.ReadKey
so

if (keyinfo.Key == ConsoleKey.DownArrow)
                    {
                        timerinterval = 50;
                        BlockUserInput(counter);
                    }

Jetzt ist es so das ich zwar den Stein nachdem ich die untere Pfeiltaste gedrückt habe bis zum nächsten
Stein nicht mehr bewegen kann

aber drücke ich inzwischen eine andere Pfeiltaste werden die Eingaben beim nächsten Stein vorgenommen

also drücke ich einmal untere Pfeiltaste und danach zweimal rechte Pfeiltaste
erscheint der nächste Stein um zwei Felder nach rechts versetzt im Spielfeld

Wenn wer interessiert ist kann ich auch den gesamten Code posten aber ich glaube bei 1409 Zeilen
wird es vielleicht etwas schwer sich da hineinzuarbeiten

3.170 Beiträge seit 2006
vor 6 Jahren

Hallo,

warum den Input blockieren und nicht einfach ignorieren?
Sprich, in einer bool-Variablen sich merken, dass Down gedrückt wurde, und wenn der Stein den Boden erreicht, diese wieder zurücksetzen.
Bei den anderen Pfeiltasten dann den Input nur in Abhängigkeit von der Variablen verarbeiten.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

M
MisterXYUnbekannt Themenstarter:in
2 Beiträge seit 2017
vor 6 Jahren

Danke für die Antwort!