2008-11-03 4 views
1

저는 300x300 크기의 창 안에 800x600 크기의 캔버스가 있습니다. 특정 키를 누를 때 캔버스가 그 방향으로 움직이기를 원합니다.
난 뒤에 윈도우의 코드 내에서 이런 짓을했습니다WPF의 저속 움직임

 
protected override void OnKeyDown(KeyEventArgs e) 
{ 
    base.OnKeyDown(e); 
    Key keyPressed = e.Key; 

    if (keyPressed == Key.W) 
    { 
     gcY += 5; 
    } 
    if (keyPressed == Key.S) 
    { 
     gcY -= 5; 
    } 
    if (keyPressed == Key.A) 
    { 
     gcX += 5; 
    } 
    if (keyPressed == Key.D) 
    { 
     gcX -= 5; 
    } 

    gameCanvas.RenderTransform = new TranslateTransform(gcX, gcY); 
} 

음, 작동하지만 운동은 육포입니다. 예를 들어 W 키를 누르고 있으면 이동하기 전에 1 초 동안 일시 중지됩니다.
어쨌든 움직임을 부드럽게하고 키를 누르고있을 때 일시 중지를 제거 할 수 있습니까?
감사합니다.

답변

3

현재 설정에서 스팸성 키 입력 (키를 누른 상태)을 수락하고 있습니다. 이벤트 기반 입력을 사용하는 대부분의 게임에서이 방식을 사용하는 방법은 부울 배열 keydown[256]을 사용하여 키보드 (키 값이되는 인덱스)를 매핑하는 것입니다. 모든 값은 false으로 초기화됩니다. 키를 누르면

, 당신이를 keyDown 방법 및 게임/렌더링 루프에서 true에 적절한 인덱스를 설정, 당신은 true이다 배열에서 어떤 키에 따라 gameCanvas.RenderTransform = new TranslateTransform(gcX, gcY);를 호출합니다. keyrelease 이벤트 메서드에서 키가 해제 될 때 키 값을 false으로 설정합니다 (C#의 내용이 확실하지 않습니다).

이 방법을 사용하면 부드러운 스크롤이 가능하며 시작이 지연되지 않습니다.

+0

안녕하세요, 감사합니다. 하지만 그 작품과 이전에 내가 가진 방식이 왜 그렇게되지 않았는지 아십니까? – jkidv

1

예, 계산에 시간을 통합 할 수 있습니다. 현재 이벤트가 발생할 때마다 5를 더하거나 뺍니다. 실제로는 예측할 수 없습니다.

움직임을 부드럽게하려면 DateTime을 사용하여 초당 X 번보다 자주 발사하지 않도록하십시오.

처럼 :

private static DateTime nextUpdate 

if (nextUpdate <= DateTime.Now) 
{ 
//Move 
nextUpdate = DateTime.Now.AddMilliseconds(100); 
} 

지금은 VS이없는, 그래서 구문 완벽하게 잘 모르겠지만, 당신은 아이디어를 얻을.