Windows Forms / C#:只有一个对象实例中的一个会绘制

时间:2009-11-13 08:52:55

标签: c# windows forms object

问题在于:

我一直在研究怪物从主体的墙壁(边缘)反弹的小游戏,并且它正在游泳,但它只能在每种类型的怪物中绘制一个它应该迭代的列表他们每个人都调用他们的OnPaint和Move方法:

private void Pacmen_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;
    Rectangle rect = e.ClipRectangle;

    g.Clear(backgroundColor);

    foreach (Hydra h in hydraList) {
        h.OnPaint(e);
        h.Move(e);
    } // end foreach

    foreach (Ghost gh in ghostList) {
        gh.OnPaint(e);
        gh.Move(e);
    } // end foreach
}

这是幽灵的方法:

public void OnPaint(PaintEventArgs e)
{
    Graphics g = e.Graphics;
    g.SmoothingMode = SmoothingMode.HighQuality;

    GraphicsPath path = new GraphicsPath();
    SolidBrush fillBrush = new SolidBrush(color);
    SolidBrush eyeBrush = new SolidBrush(Color.Black);

    path.AddArc(pos, (float)180, (float)180);
    path.AddLine((float)pos.Right, (float)(pos.Y + pos.Height / 2),
        (float)pos.Right, (float)pos.Bottom);
    path.AddLine((float)pos.Right, (float)pos.Bottom,
        (float)(pos.X + pos.Width / 2), (float)(pos.Bottom - radius / 2));
    path.AddLine((float)(pos.X + pos.Width / 2), (float)(pos.Bottom - radius / 2),
        (float)pos.Left, (float)pos.Bottom);
    path.AddLine((float)pos.Left, (float)pos.Bottom,
        (float)pos.Left, (float)(pos.Y + pos.Height / 2));

    g.FillPath(fillBrush, path);
    g.FillEllipse(eyeBrush, new Rectangle(pos.X + pos.Width / 4, pos.Y + pos.Height / 4, radius / 4, radius / 5));
    g.FillEllipse(eyeBrush, new Rectangle(pos.X + 3 * pos.Width / 4, pos.Y + pos.Height / 4, radius / 4, radius / 5));
} // end OnPaint

public void Move(PaintEventArgs e)
{
    pos.Offset(xSpeed, ySpeed);
}

为什么只有一个出现的任何想法?谢谢!

3 个答案:

答案 0 :(得分:1)

你确定你给角色个人的起始位置和速度吗?也许他们都在画画,但在同一个地方?

答案 1 :(得分:0)

您使用传递给OnPaint的相同PaintEventArgs为每个九头蛇和幽灵调用Pacmen_Paint。也许OnPaint方法没有使用正确的Graphics对象。

答案 2 :(得分:0)

尝试使用简单的替换Ghost方法的正文:

Console.WriteLine("Ghost at " +  pos.X + ", " + pos.Y);

然后运行应用程序并检查VS中的“输出”窗口以查看它们的确切绘制位置。

其他说明(其他人可能已经评论过):

  1. Use the using constructPaint方法中处理画笔和其他一次性图形对象,或者缓存它们并制作GhostHydra个对象{{3}在不再需要它们时处理它们。

  2. 如果您只是创建一个包含已绘制幽灵的Bitmap字段,然后只需在Paint内绘制它,您可以获得一些速度提升。这样你只需要创建一次图形对象(再次在using构造内)。