我的蛇程序不会显示我绘制的对象。我该如何解决?

时间:2019-02-08 18:09:22

标签: c#

我现在正在跟踪蛇的教程,并按照上面的描述准确地写了东西,但是它甚至都不会显示蛇和食物的矩形。enter code here 我正在使用Windows窗体应用程序。 我开设了单独的课程-食物;蛇;和一种形式。

//Snake class
public Rectangle[] Body;
        private int x = 0, y = 0, width = 20, height = 20;

        public Snake()
        {
            Body = new Rectangle[1];
            Body[0] = new Rectangle(x, y, width, height);
        }
        public void Draw()
        {
            for (int i = Body.Length - 1; i < 0; i--)
                Body[i] = Body[i - 1];
        }

        public void Draw (Graphics graphics)
        {
            graphics.FillRectangles(Brushes.AliceBlue, Body);

        }

         public void Move (int direction)         
         {
            Draw();

//Food Class
public class Food
    {
        public Rectangle Piece;
        private int x, y, width = 20, height = 20;

        public Food(Random rand)
        {
            Generate(rand);
            Piece = new Rectangle(x, y, width, height);
        }

        public void Draw(Graphics graphics)
        {
            Piece.X = x;
            Piece.Y = y;
            graphics.FillRectangle(Brushes.Red, Piece);

1 个答案:

答案 0 :(得分:0)

您没有从任何形式的可绘制上下文对象继承您的身体和食物类。因此,每当发生更改时,都需要显式调用“绘制”例程。您似乎正在尝试模仿WinForms UI组件的结构,该组件具有自己的内置Draw()方法,该方法在UI需要更新时会隐式调用。

此外,由于您正在调用不带任何参数的“绘图”,因此除非您在不需要参数的地方有重载,否则应该引发错误。在这种情况下,将没有图形上下文可绘制。

我不是游戏图形专家,但我知道不断调用UI组件的redraw方法效率极低。 Invalidate()方法有一些替代,您可以在其中提供矩形以仅使整个组件的一小部分失效。这可以帮助提高重提率。

我建议屏幕上有一个可渲染的UI组件,该组件可链接到您的数据对象。并重写该组件的draw()方法,以便根据存储在游戏对象中的数据绘制整个游戏板(或基于无效区域的部分)。