我正在嘗試使用 WSAD 鍵移動 PictureBox“英雄”。它可以作業,但是每當按下 2 個按鈕時,它就會向按下的最舊按鈕的方向移動(應該如此),但是當釋放其中一個按鈕時,它再次移動之前會有一點延遲。有誰知道如何解決這個問題?
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.S:
hero.SetDirection("down");
break;
case Keys.W:
hero.SetDirection("up");
break;
case Keys.D:
hero.SetDirection("right");
break;
case Keys.A:
hero.SetDirection("left");
break;
}
hero.heroTimer.Start();
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.S || e.KeyCode == Keys.W || e.KeyCode == Keys.A || e.KeyCode == Keys.D)
{
hero.SetDirection("");
hero.heroTimer.Stop();
}
}
這是從類英雄
private void heroTimer_Tick(object sender, EventArgs e)
{
switch (direction)
{
case "down":
this.Top = 5;
break;
case "up":
this.Top -= 5;
break;
case "left":
this.Left -= 5;
break;
case "right":
this.Left = 5;
break;
}
}
PS如果代碼混亂,我很抱歉,我對此很陌生。
uj5u.com熱心網友回復:
但是當其中一個按鈕被釋放時,它再次移動之前會有一點延遲
可能是因為松開任何按鈕都會停止計時器。解決此問題的一種方法是保留按下的鍵的串列,并且僅在釋放所有鍵時停止計時器。這也可以允許您應用多個移動,即向下 向左將沿對角線移動圖片。您可能還想在heroTimer_Tick按下某個鍵時直接呼叫該方法,以便在與按鍵相同的幀上開始移動。
我還建議使用事件之間的實際時間來縮放您的運動。如果 UI 執行緒忙于做其他事情,甚至完全省略,Winforms 計時器事件可能會延遲。因此,秒表可能有助于準確測量每個事件之間的時間并允許您縮放運動。
在游戲中使用通用更新時鐘是相當普遍的。而不是使用不同計時器的多個組件,您只需使用一個以固定速率、盡可能快地滴答或盡可能快地達到某個最大幀速率的單個組件。然后,此計時器將呼叫所有游戲組件上的更新方法,通常帶有 delta-time 引數。這往往會提供更一致的行為,因為所有組件每幀都以相同的順序更新。
最后,使用字串來存盤移動不是一個好習慣,并且可能導致編譯器未檢測到的問題。列舉將是更合適的型別來描述運動。可選擇使用 [Flags] 屬性和單獨的位來同時描述多個移動。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/365946.html
上一篇:如何在使用滾動時阻止winforms面板更改我添加的控制元件的Y坐標?
下一篇:如何在回圈中顯示選中狀態?
