我需要一些WPF的帮助
我开始使用WPF并希望使用以下类进行简单的蛇游戏:
GameBoard : Window
{
private Game game;
public GameBoard(){ this.game = new Game(this); }
public Rectangle rectangleFactory(int x, int y)
{
Rectangle rect = new Rectangle();
rect.Width = 10;
rect.Height = 10;
GameArea.Children.Add(rect); /// My Canvas is called GameArea
Canvas.SetLeft(rect, 10 * x);
Canvas.SetTop(rect, 10 * y);
return rect;
}
public void rectangleBin(Rectangle)
{
GameArea.Children.Remove(rect);
}
}
Thing{
private GameBoard Board;
private System.Windows.Shapes.Rectangle rect;
private int[] coordinaters;
public Thing(GameBoard board, int[] coordinates)
{
this.Board = board;
Draw();
}
public Draw(){ rect = Board.rectangleFactory(coordinates);}
public Dispose(){ Board.rectangleBin(rect)}
}
SnakeSegment : Thing
{
SnakeSegment next;
public SnakeSegment(GameBoard board, int[] coordinates) : base(board, coordinates) { }
}
Apple : Thing()
{
public Apple(GameBoard board, int[] coordinates) : base(board, coordinates) { }
public void newApple()
{
Dispose();
getNewCoordinate();
Draw();
}
}
Game
{
private GameBoard Board;
private Apple apple;
Private Snake snake;
private static System.timers.timer timer
public Game(GameBoard board)
{
this.Board = board;
this.apple = new Apple(board, int start_coordinates);
this.snake = new snake(this);
this.timer = new Timer(100);
timer.Elapsed += new ElapsedEventHandler(update_game);
}
public void update_game(object o, ElapsedEventArgs s){ snake.move_forward(); }
}
Snake
{
private SnakeSegmet Head;
Private SnakeSegment Tail
private GameBoard Board;
public Snake(Game game)
{
this.Board = game.Board;
this.Head = new SnakeSegment(Board, start_cooridantse)
this.Tail = Head;
}
private void AddSegment()
{
Head.Next = new SnakeSegment(Board, newCoordinates);
Head = Head.Next;
}
}
当然还有更多,但为了便于阅读,我把它留了下来。
当我开始游戏时,它会绘制游戏区域并为蛇添加一个苹果和一个初始矩形,到目前为止一直很好
但随后我更新游戏,事情就变成了南方
我在Head.Next = new SnakeSegment()
中对SnakeSegment构造函数的下一次调用
调用new Rectangle()
程序不会崩溃,但它会推翻当前堆栈,并且在定时器引发其他事件时不会执行任何其他操作
香港专业教育学院尝试排除故障并重新路由流程,如果我改为调用Apple :: newApple(),当我到达GameArea.Children.Remove(rect);
时会发生同样的事情
我是WPF的新手,这让我很头疼,如果有人能解释为什么会发生这种情况,我将非常感激。
此致,托比亚斯
答案 0 :(得分:3)
如果你想编写你的程序,请使用WinForms。如果你想使用WPF,你需要从头开始重新开始。 WPF是一种以数据为中心的语言......我们操纵数据对象,而不是UI对象。
使用WPF,您需要将游戏对象视为数据对象的集合。然后,该板将是您将数据绑定到的集合的UI容器控件。然后,您将在XAML中的DataTemplate
中定义每个对象的外观。在将数据对象的位置属性绑定到UI对象的位置属性之后,您可以通过从代码更改数据对象的位置属性来移动UI中的对象。
说了这么多,我认为你会发现WPF不是制作游戏的好框架。它的主要优势在于其数据绑定功能和丰富的UI可能性,但效率不高。你需要一块好的显卡才能充分利用它。