问题在于:
我一直在研究怪物从主体的墙壁(边缘)反弹的小游戏,并且它正在游泳,但它只能在每种类型的怪物中绘制一个它应该迭代的列表他们每个人都调用他们的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);
}
为什么只有一个出现的任何想法?谢谢!
答案 0 :(得分:1)
你确定你给角色个人的起始位置和速度吗?也许他们都在画画,但在同一个地方?
答案 1 :(得分:0)
您使用传递给OnPaint
的相同PaintEventArgs
为每个九头蛇和幽灵调用Pacmen_Paint
。也许OnPaint
方法没有使用正确的Graphics
对象。
答案 2 :(得分:0)
尝试使用简单的替换Ghost
方法的正文:
Console.WriteLine("Ghost at " + pos.X + ", " + pos.Y);
然后运行应用程序并检查VS中的“输出”窗口以查看它们的确切绘制位置。
其他说明(其他人可能已经评论过):
Use the using
construct在Paint
方法中处理画笔和其他一次性图形对象,或者缓存它们并制作Ghost
和Hydra
个对象{{3}在不再需要它们时处理它们。
如果您只是创建一个包含已绘制幽灵的Bitmap
字段,然后只需在Paint
内绘制它,您可以获得一些速度提升。这样你只需要创建一次图形对象(再次在using
构造内)。