본문 바로가기
프로그래밍

간단한 버튼이나 메뉴 키이벤트 처리 방법

by 건우아빠유리남편 2009. 7. 14.
반응형

게임 프로그래밍을 하시는 분들이라면 키 이벤트 처리야 아주 초보적인 방법이겠지만 전 시작부터 땅집고 헤엄치다보니 한참 헤매서 도움말 참고로 이제서야 이해했네요. 저같은 소수의 초보분들을 위해서 도움이 되었으면 좋겠다는 생각에 올립니다.

XNA에서 Update 함수에 그냥 키값을 입력받아서 처리할경우 캐릭터가 꾸준히 움직인다거나 할때는 상관이 없겠지만 버튼이라던지, 제경우는 메뉴에서의 키값대로 선택문 이동시에 미친 듯이 메뉴가 파파파파팍~ 움직여버리더군요. 프레임이 바뀌는 속도는 아주 짧은데 비해 키입력은 그보다 길어지니 일어나는 현상입니다. 이를 처리하기 위해선 키값상태를 먼저 알아야 합니다. 아무일도 않했는지, 키를 눌렀는지, 키가 떼어졌는지, 키가 눌린상태로 있는지를 판단해야하는데.. 아주 간단하더군요. -_-;

현재 눌린키와 이전에 눌린 키값만 구해서 비교하면 됩니다.

public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    KeyboardState oldState;
.
.
.
        protected override void Initialize()
        {
            base.Initialize();
            oldState = Keyboard.GetState();
        }

.
.
.
        protected override void Update(GameTime gameTime)
        {
            KeyboardState newState = Keyboard.GetState();

            // 지금 스페이스키가 눌렸는가?
            if (newState.IsKeyDown(Keys.Space))
            {
                // 이전프레임에서 스페이스가 안눌렸다면..
                if (!oldState.IsKeyDown(Keys.Space))
                {
                    // 이곳에  메뉴나 버튼처럼 누르고있어도 한번만 실행되는 행동..
                }
            }
            // 이전프레임에서 스페이스가 눌렸다면
            else if (oldState.IsKeyDown(Keys.Space))
            {
                // 암것도 않하던가.. 총알발사처럼 누르고 있어도 나가야한다면 이곳에 행동을..
            }

            // newState의 키값을 oldState에 저장 (다음 프레임때 oldState는 이전에 눌린 키값을 가지고 있겠죠)
            oldState = newState;

응용으로는..
if (!newState.IsKeyDown(Keys.Space) && !oldState.IsKeyDown(Keys.Space))
    는 아무것도 안한상태

if (newState.IsKeyDown(Keys.Space) && !oldState.IsKeyDown(Keys.Space))
    는 스페이스가 눌려도 명령은 한번만 이뤄지죠.

if (!newState.IsKeyDown(Keys.Space) && oldState.IsKeyDown(Keys.Space))
    는 스페이스 키를 떼었다.. 라는거지만 이건 newState.IsKeyUp(Keys.Space) 로도 알수 있죠.

if (newState.IsKeyDown(Keys.Space) && oldState.IsKeyDown(Keys.Space))
    는 누르고 있는 상태이기 때문에 결과적으로는 oldState관련 부분은 필요없겠네요~

고로 이 방법은 어디까지나 키가 눌리고 있어도 한번만 명령을 처리할때 쓰입니다.

반응형

댓글