2012-11-16 49 views
1

我對我的代碼中的Keys事件和定時器都很陌生,但由於某種原因,有這個奇怪的錯誤。 (閱讀最後一次編輯)Keydown事件和定時器在一起工作不好

public partial class Form1 : Form 
{ 
    bool start = false; 
    Snake ormen = new Snake(10); 
    short direction = 3; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 
    private void button1_Click(object sender, EventArgs e) 
    { 
     button1.Hide(); 
     timer1.Enabled = true; 
     start = true; 
    } 
    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     Graphics g = e.Graphics; 
     if (start) 
     { 
      ormen.rita(g); 
     } 
    } 
    private void Form1_KeyDown(object sender, KeyEventArgs e) 
    { 
     switch (e.KeyCode) 
     { 
      case Keys.Up: 
       direction = 3; 
       break; 
      case Keys.Down: 
       direction = 1; 
       break; 
      case Keys.Left: 
       direction = 2; 
       break; 
      case Keys.Right: 
       direction = 0; 
       break; 
      default: 
       break; 
     } 
    } 
    private void timer1_Tick(object sender, EventArgs e) 
    { 
     ormen.flytta(direction); 
     Invalidate(); 
    } 
} 
} 

我也嘗試在關鍵事件中使用調試,但它甚至不會在時間段之後激活。任何人都可以告訴我爲什麼?此外,如果有任何明顯的錯誤,我將不勝感激,如果你可以提及它們。我也試圖讓計時器間隔更高來檢查程序是否跟不上,但它可以。 (閱讀最後編輯)

[編輯]我不認爲它會幫助,但這裏是類「蛇」的代碼。無論如何,我懷疑這是一個問題。

 private short diameter = 0; 
    //0 = Right, 1 = Down, 2 = Left, 3 = Up 
    public Snake(short diameter) 
    { 
     this.diameter = diameter; 
     ormensPlatser.Enqueue(new Point(0, 0)); 
     ormensPlatser.Enqueue(new Point(0 + diameter, 0)); 
     ormensPlatser.Enqueue(new Point(0 + diameter + diameter, 0)); 
    } 
    Queue<Point> ormensPlatser = new Queue<Point>(); 
    public void rita(Graphics g) 
    { 
     Point temp; 
     for (int i = 0; i < ormensPlatser.Count; i++) 
     { 
      temp = ormensPlatser.Dequeue(); 
      g.FillEllipse(new SolidBrush(Color.Red), temp.X, temp.Y, diameter, diameter); 
      ormensPlatser.Enqueue(temp); 
     } 
    } 
    private void ormNäraKant(short direction,ref Point ormBit) 
    { 
     switch (direction) 
     { 
      case 0: 
       ormBit.X = ormBit.X + diameter >= 380 ? 0 : ormBit.X + diameter; 
       break; 
      case 1: 
       ormBit.Y = ormBit.Y + diameter >= 360 ? 0 : ormBit.Y + diameter; 
       break; 
      case 2: 
       ormBit.X = ormBit.X - diameter < 0 ? 370 : ormBit.X - diameter; 
       break; 
      case 3: 
       ormBit.Y = ormBit.Y - diameter < 0 ? 350 : ormBit.Y - diameter; 
       break; 
     } 
    } 
    public void flytta(short direction) 
    { 
     Point temp; 
     int temp1 = ormensPlatser.Count - 1; 
     for (int i = 0; i < ormensPlatser.Count; i++) 
     { 
      if (i == temp1) 
      { 
       switch(direction) 
       { 
        case 0: 
         temp = ormensPlatser.Dequeue(); 
         ormNäraKant(0, ref temp); 
         ormensPlatser.Enqueue(temp); 
         break; 
        case 1: 
         temp = ormensPlatser.Dequeue(); 
         ormNäraKant(1, ref temp); 
         ormensPlatser.Enqueue(temp); 
         break; 
        case 2: 
         temp = ormensPlatser.Dequeue(); 
         ormNäraKant(2, ref temp); 
         ormensPlatser.Enqueue(temp); 
         break; 
        case 3: 
         temp = ormensPlatser.Dequeue(); 
         ormNäraKant(3, ref temp); 
         ormensPlatser.Enqueue(temp); 
         break; 
       } 
      } 
      else 
      { 
       ormensPlatser.Dequeue(); 
       temp = ormensPlatser.Peek(); 
       ormensPlatser.Enqueue(temp); 
      } 
     } 
    } 
} 

}

[EDIT2]歐凱,顯然它不是關於時間或類似的東西,代碼工作,但我認爲它有事情做什麼slawekwin在有關評論說,當程序啓動時關注。所以問題仍然是一樣的,但如果我ALT +選項卡到另一個程序,然後回到它的蛇計劃它的工作。

+0

什麼是ormen? Invalidate()方法做什麼? keydown事件處理程序不是你的問題,排除。語法很好,它只是分配給一個Int變量。儘管如此,還需要更多關於代碼其他部分的更多上下文。 –

+0

不知道這是否是正確的地方迴應你的評論,但無論如何.. Ormen是來自類名爲蛇的引用,並在第4行創建,invalidate()方法使屏幕更新據我所知這就是我所教的。我試圖找出它究竟做了什麼,但目前爲止沒有。但它似乎每次我打電話時都運行Onpaint函數。 – Novie

+0

所有我能想到的是你的表格一開始沒有關注,所以它不會收到關鍵事件 – slawekwin

回答

0

所以我終於弄清楚了,我認爲問題是在計時器事件和鍵入輸入事件時他們一起工作,但我的假設是錯誤的。所以我做的是,我經歷了窗體所具有的所有屬性,並且我找到了一個名爲「KeyPrevied」的設置,它是錯誤的,所以我試圖將它設置爲true並且它工作:)。