我试图制作一个简单的乒乓球游戏,但是我遇到了这个问题,每个timer1 tick(间隔设置为1ms)应该移动1个像素的白色桨状矩形,如果' S&#39 ;或者' W'按下按钮,这意味着理论上我的400px高度图片框中的白色矩形应该在0.4-0.8秒内从y = 0移动到y = 400,但显然需要超过4整秒。
我知道计时器刻度事件可能会跳过"跳过"如果cpu已经忙或处理速度问题,但我试图使蛇游戏比这50行代码更复杂,并且绘制的蛇的速度实际上是低时间间隔的准确
为什么需要这么多?
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
pictureBox1.BackColor = Color.Black;
timer1.Interval = 1;
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
PongGame.CheckIfMoving();
PongGame.DrawIt(pictureBox1);
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.S)
{ PongGame.movesDown = true; }
if (e.KeyData == Keys.W)
{ PongGame.movesUp = true; }
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.S)
{ PongGame.movesDown = false; }
if (e.KeyData == Keys.W)
{ PongGame.movesUp = false; }
}
}
public class PongGame
{
public static Rectangle paddle1 = new Rectangle(14, 370, 20, 100);
public Rectangle paddle2;
public static bool movesUp;
public static bool movesDown;
public static Graphics Draw;
public static void DrawIt(PictureBox pb1)
{
Draw = pb1.CreateGraphics();
SolidBrush sb = new SolidBrush(Color.White);
Draw.Clear(Color.Black);
Draw.FillRectangle(sb, paddle1);
}
public static void CheckIfMoving()
{
if (movesUp == true)
{
paddle1.Y -= 1;
}
if (movesDown == true)
{
paddle1.Y += 1;
}
}
}
提前感谢您的回答(:
答案 0 :(得分:0)
计时器不保证它会以您指定的间隔触发。实际上,它可以并且确实以比您指定的间隔更长的间隔触发。
通常,计时器的实际间隔与底层系统和硬件有关。 Windows上的计时器发射频率不超过20Hz,这种情况并不少见。
如果您要制作基于计时器的游戏,请使用计时器为您的游戏提供脉搏,定期心跳。当计时器触发时,使用自上次计时器事件以来更新状态的时间量。您需要使用准确的时间度量。 Stopwatch
类应该足够了。
您还错误地使用了图片框。这是一个事件驱动的控制。您应该在图片框的Paint
事件的处理程序中绘制场景。
答案 1 :(得分:0)
首先,将Timer的间隔设置为1会在这种情况下产生不必要的开销。这是1000fps(好吧,如果你真的可以信任Timer,那就是)
在DrawIt中:
Draw = pb1.CreateGraphics();
SolidBrush sb = new SolidBrush(Color.White);
这一点,因为DrawIt被Timer's tick调用,所以每秒1000次重新创建Graphics和Brush。你要放在那里要小心。
此外,您不应该使用Picturebox的CreateGraphics方法。相反,覆盖它的OnPaint方法,并在其上调用Refresh。
上详细了解相关信息