我现在正在跟踪蛇的教程,并按照上面的描述准确地写了东西,但是它甚至都不会显示蛇和食物的矩形。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);
答案 0 :(得分:0)
您没有从任何形式的可绘制上下文对象继承您的身体和食物类。因此,每当发生更改时,都需要显式调用“绘制”例程。您似乎正在尝试模仿WinForms UI组件的结构,该组件具有自己的内置Draw()方法,该方法在UI需要更新时会隐式调用。
此外,由于您正在调用不带任何参数的“绘图”,因此除非您在不需要参数的地方有重载,否则应该引发错误。在这种情况下,将没有图形上下文可绘制。
我不是游戏图形专家,但我知道不断调用UI组件的redraw方法效率极低。 Invalidate()方法有一些替代,您可以在其中提供矩形以仅使整个组件的一小部分失效。这可以帮助提高重提率。
我建议屏幕上有一个可渲染的UI组件,该组件可链接到您的数据对象。并重写该组件的draw()方法,以便根据存储在游戏对象中的数据绘制整个游戏板(或基于无效区域的部分)。