2010-11-28 1 views
1

WinForms 프로그램이 있습니다. 여기에 위, 아래, 왼쪽 및 오른쪽을 누르면 움직이는 특정 애니메이션 개체가 있습니다. 객체의 움직임은 30ms마다 호출되는 타이머 내부에서 움직입니다. 타이머는 KeyDown 이벤트에서 시작하고 KeyUp 이벤트에서 중지합니다.System.Timers.Timer 다른 키가 릴리스 된 후 시작과 관련된 문제

예를 들어 왼쪽으로 누른 다음 왼쪽 키를 놓은 다음 다른 것을 누르면 바로 그 방향으로 이동하기 전에 약간의 일시 중지 (약 0.5 초)가 있습니다. 그 문제는 나타나지 않습니다. 왼쪽으로 잡고 있으면 풀어서 조금 기다려주십시오. then 오른쪽을 누르십시오. 그런 경우에는 즉시 오른쪽으로 움직일 것입니다. 왼쪽을 누르고 있으면 왼쪽으로 계속 누르고있는 동안 오른쪽을 누르고 있습니다. 이 경우, 곧바로 움직이기 시작할 것입니다. 키를 놓은 후 즉시 다른 키를 누르면 문제가 나타납니다.

KeyDown 이벤트 :

private void form_KeyDown(object sender, KeyEventArgs e) 
    { 
     k = 0; 
     watch.Start(); 

     if (e.KeyCode == Keys.Left) 
     { 
      direction = MOVE_LEFT; 
     } 
     else if (e.KeyCode == Keys.Right) 
     { 
      direction = MOVE_RIGHT; 
     } 
     else if (e.KeyCode == Keys.Up) 
     { 
      direction = MOVE_UP; 
     } 
     else if (e.KeyCode == Keys.Down) 
     { 
      direction = MOVE_DOWN; 
     } 
     timerMove.Start(); 
    } 

KeyUp 이벤트 :

private void form_KeyUp(object sender, KeyEventArgs e) 
    { 
     timerMove.Stop(); 
    } 

타이머 이벤트 (애니메이션 이동)

void charMovement(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     if (direction == MOVE_LEFT) 
     { 
       timerMove.Interval = 30; 
       CharSize(11, 15); //mainChar.Size = new System.Drawing.Size(11, 15); 
       //code for movement 

     } 
     else if (direction == MOVE_RIGHT) //... etc. etc. 
+1

WinForms 응용 프로그램에서는 'System.Timers.Timer'가 아닌'System.Windows.Forms.Timer'를 사용해야합니다. 애니메이션이 어떻게 엉망이됩니까? – SLaks

+0

내 애니메이션이 망가 졌기 때문에 사용할 수 없습니다. 나는 이미 그것을 시도했지만 stackoverflow 사람들이 Timers.Timer를 대신 사용하라고했다. 적어도 제 애니메이션은 이제 괜찮습니다, 제가 가진 유일한 문제는 위에서 말한 것입니다. – NoelAramis

+0

애니메이션이 어떻게 엉망이됩니까? – SLaks

답변

1

문제는 타이머가 아니라 키보드의 반복 일시 중지 설정입니다. 키를 누르고 있으면 첫 번째 글자와 두 번째 글자 사이에 일시 중지가 있습니다. 다음 문자들 사이에서 더 긴 일시 정지. 그것이 당신이 보는 것입니다.

키보드 이벤트를 잊어 버리고 하나의 심장 박동 타이머를 사용하고 어떤 키를 눌렀는지 확인한 다음 작동시킬 수 있습니다. WinForms에는 GetKeySate과 같은 것이 없지만 기능은 P/Invoke the win32이 될 수 있습니다.

또는 GetKeyState의 고유 한 버전을 롤인하고 KeyDown의 키가 무엇인지 기억하고 KeyUp에서 플래그를 재설정 할 수 있습니다. 이동 타이머는 적어도 하나의 키가 눌러져있는 한 계속 실행됩니다.

+0

고마워, 나는 그것을 시도하고 작동합니다! – NoelAramis

0

을 시도하고 아직 완료하지 않았다면

FormName.KeyPreview = true;

또한 하나의 방법 만 사용하십시오 .. 두 가지가 아닌 경향입니다. 키 누르기가 두 번 읽히는 이유는 위아래가 있기 때문입니다. KeyPreview = true; KeyDown 및 KeyUp 대신 KeyPress 사용

+0

나는 그것을 이미 시도했다. 기본적으로이 프로그램은 화살표 키를 눌렀다는 것을 알지 못 했으므로 인터넷에서 찾은 일부 메서드를 덮어 쓰려고했는데 화살표 키가 눌 렸는지 여부를 알 수 있었지만 여전히 그렇지 않았습니다. 작업. – NoelAramis

+0

왜 System.Windows.Forms.Timer를 사용하지 않을까요? 너무 효과적입니다 ... 애니메이션을 위해 ... 언제 멈추어야하는지 정확히 알고 있어야합니다 ... –

+0

나는 그것을 사용했고 정확히 동일하게 작동합니다. 나는 프로그램의 행동에 변화가 없음을 보았다. – NoelAramis