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 +選項卡到另一個程序,然後回到它的蛇計劃它的工作。
什麼是ormen? Invalidate()方法做什麼? keydown事件處理程序不是你的問題,排除。語法很好,它只是分配給一個Int變量。儘管如此,還需要更多關於代碼其他部分的更多上下文。 –
不知道這是否是正確的地方迴應你的評論,但無論如何.. Ormen是來自類名爲蛇的引用,並在第4行創建,invalidate()方法使屏幕更新據我所知這就是我所教的。我試圖找出它究竟做了什麼,但目前爲止沒有。但它似乎每次我打電話時都運行Onpaint函數。 – Novie
所有我能想到的是你的表格一開始沒有關注,所以它不會收到關鍵事件 – slawekwin