Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 蛇游戏意外的滞后_C#_Lag_2d Games - Fatal编程技术网

C# 蛇游戏意外的滞后

C# 蛇游戏意外的滞后,c#,lag,2d-games,C#,Lag,2d Games,我已经创建了一小部分代码来创建一个非常基本的蛇游戏(它还没有完成)。 但它似乎以一种奇怪的方式落后。在比赛开始时,一切都很顺利,但当我转身时,比赛变得越来越落后 (顺便说一句:我知道我不需要重画每一帧,但我觉得它更一般,我知道问题并不存在) 名称空间蛇 { 公共部分类Form1:Form { 公共表格1() { 初始化组件(); } #区域变量 静态列表部件; 静态列表; System.Timers.Timer\u Timer; 静态图形; #端区 私有void Form1\u加载(对象发送方、

我已经创建了一小部分代码来创建一个非常基本的蛇游戏(它还没有完成)。 但它似乎以一种奇怪的方式落后。在比赛开始时,一切都很顺利,但当我转身时,比赛变得越来越落后

(顺便说一句:我知道我不需要重画每一帧,但我觉得它更一般,我知道问题并不存在)

名称空间蛇
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
}
#区域变量
静态列表部件;
静态列表;
System.Timers.Timer\u Timer;
静态图形;
#端区
私有void Form1\u加载(对象发送方、事件参数e)
{
g=this.CreateGraphics();
零件=新列表();
turns=新列表();
添加(新的蛇形部分(“右”,新的矩形(50,10,25,25));
添加(新的Snake_部分(“右”),新的矩形(24,10,25,25));
_定时器=新系统定时器定时器定时器(30);
_timer.appeased+=新的ElapsedEventHandler(timer\u appeased);
_timer.Enabled=true;
}
静态无效计时器(对象发送器,ElapsedEventArgs e)
{
转动();
changePos();
draw();
}
静态私有void draw()
{
尝试
{
g、 清晰(颜色为黑色);
}
捕获{}
foreach(蛇形部分)
{
g、 FillRectangle(笔刷.White,部分.Rect);
}
}
私有void Form1\u KeyDown(对象发送方,KeyEventArgs e)
{
如果(e.KeyCode==Keys.Left){turns.Add(新回合(部分[0].Rect.X,部分[0].Rect.Y,“左”);}
如果(e.KeyCode==Keys.Right){turns.Add(新回合(部分[0].Rect.X,部分[0].Rect.Y,“Right”);}
else if(e.KeyCode==Keys.Up){
添加(新转向(零件[0].Rect.X,零件[0].Rect.Y,“向上”);
}
如果(e.KeyCode==Keys.Down){turns.Add(新回合(部分[0].Rect.X,部分[0].Rect.Y,“Down”);}
}
静态私有void turn()
{
如果(圈数>=1){
foreach(蛇形部分)
{
如果(圈数>=1)
{
尝试
{
foreach(轮流)
{
如果(part.Dire==“Right”)
{
if(part.Rect.IntersectsWith(新矩形(旋转X+25,旋转Y,1,1)))
{
part.Dire=转向.Dire;
if(part==parts.Last())
{
turns.Remove(turns.Last());
}
}
}
否则如果(part.Dire==“Down”)
{
if(part.Rect.IntersectsWith(新矩形(turn.X,turn.Y+25,1,1)))
{
part.Dire=转向.Dire;
if(part==parts.Last())
{
turns.Remove(turns.Last());
}
}
}
否则如果(part.Dire==“Up”)
{
if(part.Rect.IntersectsWith(新矩形(turn.X,turn.Y-25,1,1)))
{
part.Dire=转向.Dire;
if(part==parts.Last())
{
turns.Remove(turns.Last());
}
}
}
else if(part.Dire==“Left”)
{
if(part.Rect.IntersectsWith(新矩形(turn.X-25,turn.Y-25,1,2)))
{
part.Dire=转向.Dire;
if(part==parts.Last())
{
turns.Remove(turns.Last());
}
}
}
}
}
捕获{}
}
}
}
}
静态私有void changePos()
{
foreach(蛇形部分)
{
如果(part.Dire==“Right”){part.Rect=新矩形(part.Rect.X+2,part.Rect.Y,part.Rect.Width,part.Rect.Height);}
如果(part.Dire==“Left”){part.Rect=新矩形(part.Rect.X-2,part.Rect.Y,part.Rect.Width,part.Rect.Height);}
if(part.Dire==“Up”){part.Rect=新矩形(part.Rect.X,part.Rect.Y-2,part.Rect.Width,part.Rect.Height);}
如果(part.Dire==“Down”){part.Rect=新矩形(part.Rect.X,part.Rect.Y+2,part.Rect.Width,part.Rect.Height);}
}
}
}
}

谢谢你

那些空的挡块是一面红旗-你永远不想这么做。。。这不是缓存和重用图形对象的有效方法。每次买一个新的,然后处理掉

private void Draw()
{
    using (Graphics g = this.CreateGraphics())
    {
        g.Clear(Color.Black);

        foreach (Snake_part part in parts)
            g.FillRectangle(Brushes.White, part.Rect);
    }
}

在“turn”方法中,不能从turn迭代器中删除turn。最好是找到一种方法,将转弯标记为“完成”,并在最后进行清理。还有很多转弯对象永远不会被移除——例如,只要按住右键,你就会看到转弯列表快速累积

为什么要在
turn()
中迭代整个蛇?在我看来,只有头和脚
private void Draw()
{
    using (Graphics g = this.CreateGraphics())
    {
        g.Clear(Color.Black);

        foreach (Snake_part part in parts)
            g.FillRectangle(Brushes.White, part.Rect);
    }
}