내일배움캠프 2주차 5일차 TIL - 키 감지

백흰범·2024년 4월 26일
0

오늘 한 일

  • X

어제 새벽 3시까지 TIL 작성에 무리하다가 오늘 온 몸이 쑤시는 바람에 학습에 제대로된 집중을 하지 못했다.
그래도 오늘 뭐 배웠는지는 적고 가야겠다.

콘솔에서 키 입력을 읽는 방법

Console.ReadKey

  • 사용자가 키를 누를 때까지 실행을 중지시키고, 키가 눌렀으면 ConsoleKeyInfo라는 Struct를 반환한다.

> 사용 예시

ConsoleKeyInfo input = Console.ReadKey(); Console.WriteLine();
Console.WriteLine(input);
  • a를 입력 시

  • 숫자 입력 시

  • F4 입력
  • 아무래도 출력가능한 문자열 말고는 출력되지는 않는 것 같다.

Console.ReadKey(true)와 Console.ReadKey(false)의 차이

-- a키를 입력 시의 차이

  • Console.ReadKey(true)
  • Console.ReadKey(false)

-- true는 콘솔창에 뜨지 않게 하고 false는 콘솔창에 뜨게 해주는 것 같다.

참고 자료
Console.ReadKey 메서드
ConsoleKey Enum
ConsoleKeyInfo Struct


해당 메서드를 어디다 사용할까?

  • 사용자의 키 이벤트 감지용으로 사용이 가능하다.
 ConsoleKeyInfo consoleKey = Console.ReadKey();

 switch (consoleKey.Key)	// !! ConsoleKeyInfo는 구조체이기 때문에 .Key로 키값 비교를 위해서 필요한 정보를 가지고 와야한다.
 {
     case ConsoleKey.LeftArrow:
     case ConsoleKey.A:
         if (pastKey == 1) { break; }
         currentMove = 0;
         pastKey = 0;
         break;
     case ConsoleKey.RightArrow:
     case ConsoleKey.D:
         if (pastKey == 0) { break; }
         currentMove = 1;
         pastKey = 1;
         break;
     case ConsoleKey.UpArrow:
     case ConsoleKey.W:
         if (pastKey == 3) { break; }
         currentMove = 2;
         pastKey = 2;
         break;
     case ConsoleKey.DownArrow:
     case ConsoleKey.S:
         if (pastKey == 2) { break; }
         currentMove = 3;
         pastKey = 3;
         break;
// 위 코드는 스네이크 게임을 위해 구현된 움직임코드입니다. 
 }
  • 움직임이 구현된 모습
  • 키대로 잘 움직인다.

하지만 신경써줘야하는 사항이 있다.
만약에 아무런 조건도 없이 단순히 위와 같이 기입하면 내가 키를 입력할 때까지 스크립트의 실행이 진행되지 않는다.
(하지만 이를 해결할 좋은 방법이 하나 있다.)


Console.KeyAvailable

  • 입력 스트림에서 키 누름을 사용할 수 있는지를 나타내는 값을 가져옵니다(?) 진짜 설명이 이렇게 되어있다.
    Console.KeyAvailable
bool a = Console.KeyAvailable;
Console.WriteLine(a);
  • 실행 결과
    • 실행하자 마자 위와 같이 뜰 것이다.

도대체 뭐하는 놈인가요?

  • 사실 이 친구의 진정한 진가는 이 곳에서 발현된다.
while (!(Console.KeyAvailable)) // KeyAvailabe이 true가 된다면 탈출한다
{
	Console.WriteLine("눌러!!");
	Thread.Sleep(100);
}
Console.WriteLine("누름");
  • 실행 결과
    • 위와 같이 키를 입력하니 반복문을 깨고 누름이라는 문자열이 출력됐다
  • 한번 더 테스트
    • 이번에는 Thread.Sleep을(10000)으로 해봤다.
    • 누름이 나오는 게 늦었지만 이를 보고 확실히 알 수 있는 것은 지연이 얼마나 되든 간에 누르기만 하면 true를 반환하게 된다는 것을 알 수 있다.

조금만 더 분석해볼까?

while (true)
{
	if (Console.KeyAvailable) { Console.WriteLine("누름"); }
	else { Console.WriteLine("눌러!!"); }
	Thread.Sleep(100);
    // 이번에는 이와 같이 코드를 짜 봤다.
}
  • 결과

    • ??? 아무리 봐도 의도된 그게 아니다. 하지만 저 코드에서 코드 한 줄만 넣어주면 된다.

수정 사항

while (true)
{
	if (Console.KeyAvailable)
	{
		Console.WriteLine("누름");
        Console.ReadKey(true); // 수정 사항!
	}
	else { Console.WriteLine("눌러!!"); }
	Thread.Sleep(100);
}
  • 결과

    • 의도된대로 버튼을 누른 시간대만 누름을 출력한다.

유의해야할 점

  • 아래와 같이 키를 꾹 누른 채로 있다보면 입력되었던 키들이 밀리게 된다.
  • 추후에 이걸 고칠 수 있는 방법을 찾는 것도 좋겠다.



오늘 작성하면서 느낀점

어제 열정과다인 채로 TIL 작성하다가 느낀 게 있는데 오늘 TIL 작성 때문에 내일을 팔지 말자는 교훈을 얻었다. 너무 무리하다보면 내일 학습에 무조건 지장이 갈 수 밖에 없더라; 그리고 지금 당장 해야하는 게 무엇인지를 잘 구별하고 되도록이면 계획을 짜서 시간 활용을 최대한 높여주는 것이 좋을 것 같다. 계획이 없는 상태로 과제를 끝내면 과제를 끝냈다는 성취감 때문에 그대로 잘하고 있다가 꼬꾸라지는 것 같다.




profile
게임 개발 꿈나무

0개의 댓글