2017-12-26 3 views
4

Visual Studio Windows Form 응용 프로그램을 사용하여 C#으로 간단한 게임을 만들려고합니다. 사용자가 해당 키를 사용하여 파란색 상자를 위쪽, 오른쪽, 아래쪽 및 왼쪽으로 자유롭게 이동할 수있게하려고합니다.KeyDown 이벤트를 사용하여 컨트롤을 부드럽게 움직입니다.

나는 상자의 새로운 위치를 0.1 초마다 감지하는 타이머와 실제로 상자의 위치를 ​​변경하는 keydown 이벤트를 사용하고 있습니다. 키를 누르고있는 동안 상자가 해당 방향으로 계속 움직여야합니다.

내 문제는 내 현재 프로그램이 작업을 수행한다는 것입니다. 단, 사용자가 처음으로 키를 누르면 상자가 조금 움직이고 잠시 멈춰서 계속 이동합니다. 나는이 상자를 멈추지 않고 첫 번째 키 누름에서 더 부드럽게 움직이기를 원합니다. 단어로 설명하기 어려울 수 있으므로 gif 파일을 추가했습니다.

enter image description here

이 문제를 해결하는 방법이 있나요? 여기에 현재 코드가 있습니다.

private int posX, posY; //Both initialized in Form Load event 

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Up) 
     posY -= 3; 
    else if (e.KeyCode == Keys.Right) 
     posX += 3; 
    else if (e.KeyCode == Keys.Down) 
     posY += 3; 
    else if (e.KeyCode == Keys.Left) 
     posX -= 3; 
} 

//Timer ticks every 0.1 second 
private void Timer_Tick(object sender, EventArgs e) 
{ 
    Box.Location = new Point(posX, posY); 
    labelPosX.Text = posX.ToString(); //Testing purposes 
    labelPosY.Text = posY.ToString(); //Testing purposes 
} 

나는 이것을 달성하기 위해 KeyDown 이벤트를 사용 싶지만, 실제로 실제 게임 세계에서 사용되는 더 이상 일반적인 방법이 있다면, 나도 그것에 대해 알고 싶어요!

답변

4

Timer_Tick 메서드에서 Keyboard.IsKeyDown 메서드를 사용하고 keydown 이벤트를 수신하지 않습니다. 그래서 같이

는 :

double posX, posY; 

private void Timer_Tick(object sender, EventArgs e) 
{ 
    double velocity = /*(speed: pixels per seconds)*/ 100 * /*(timer tick time in seconds)*/ 0.003; 

    if (Keyboard.IsKeyDown(Keys.Up)) 
    { 
     posY -= velocity; 
    } 
    else if (Keyboard.IsKeyDown(Keys.Down)) 
    { 
     posY += velocity; 
    } 
    //Also, don't put else here, so you can go diagonally. 
    if (Keyboard.IsKeyDown(Keys.Left)) 
    { 
     posX -= velocity; 
    } 
    else if (Keyboard.IsKeyDown(Keys.Right)) 
    { 
     posX += velocity; 
    } 

    Box.Location = new Point((int)posX, (int)posY); 
    labelPosX.Text = posX.ToString(); //Testing purposes 
    labelPosY.Text = posY.ToString(); //Testing purposes 
} 

public static class Keyboard 
{ 
    private static readonly HashSet<Keys> keys = new HashSet<Keys>(); 

    public static void OnKeyDown(object sender, KeyEventArgs e) 
    { 
     if (keys.Contains(e.KeyCode) == false) 
     { 
      keys.Add(e.KeyCode); 
     } 
    } 

    public static void OnKeyUp(object sender, KeyEventArgs e) 
    { 
     if (keys.Contains(e.KeyCode)) 
     { 
      keys.Remove(e.KeyCode); 
     } 
    } 

    public static bool IsKeyDown(Keys key) 
    { 
     return keys.Contains(key); 
    } 
} 

그리고 키보드 클래스를 사용하려면 InitializeComponent 방법 Form1에의에서 KeyDown과의 keyup 이벤트를 설정합니다.

KeyDown += Keyboard.OnKeyDown; 
KeyUp += Keyboard.OnKeyUp; 

속도를 변경하여 속도를 제어 할 수 있습니다.

+0

감사합니다. .dll 파일 또는 다른 것을 설치해야합니까? Visual Studio에서 '키보드'를 인식하지 못합니다. "Using System.Windows.Input;"을 추가했습니다. 하지만 여전히 그것을 인식하지 못합니다. =/ –

+0

흠. Forms에는 Keyboard 클래스가 없다는 것을 잊어 버렸습니다. 내가 너에게 대답을 편집하게 해줘. – rokkerboci

+0

감사합니다. Keyboard 클래스도 WPF 용이라고 생각했습니다. –

관련 문제