2013-12-06 3 views
1

мне нужна помощь с WPFWPF, приложение теряет способность создавать или манипулировать GUI объекты

Я начала работы с 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; 
    } 
} 

Существует, конечно, больше, но я оставил его в интересах удобочитаемости.

Когда я начать игру он втягивает область игры и добавляет яблоко и первоначальный прямоугольник змеи, до сих пор так хорошо

Но я обновить игру, и все идут к югу моего следующего вызова SnakeSegment конструктор в Head.Next = new SnakeSegment() заканчивается rectangleFactory при вызове new Rectangle()

программа не врезаться, но опрокидывается текущий стек и больше ничего не выполняется untinl таймер поднимает другое событие

ив пытался устраняйте и перенаправляйте поток немного, и если я вместо этого назову Apple :: newApple(), то то же самое произойдет, когда я доберусь до GameArea.Children.Remove(rect);

Im совершенно новый для WPF, и это действительно дает мне головную боль, если кто-нибудь может объяснить, почему это бывает id, очень благодарен.

С уважением, Tobias

+0

** Не создавайте элементы пользовательского интерфейса или не манипулируйте ими в процедурных кодах в WPF. Для этого и предназначен XAML. ** Изучите MVVM, прежде чем писать какую-либо строку кода в WPF. –

+0

@HighCore Не самый великий совет откровенно. Всегда потребуется код UI. Пользовательское поведение, динамическая анимация, пользовательские элементы управления. – Gusdor

+0

@ Гусдор неправильно. Начинающие в WPF ** должны понимать, что WPF - это не winforms, ни любой другой дрянной динозавр, наполовину испеченный устаревший бесполезный wannabe интерфейс. См. Ответ Шеридана. После того, как сделан inital mindshift, вы узнаете, что принадлежит коду, и что принадлежит виртуальным машинам и что принадлежит XAML. –

ответ

3

Если вы хотите, чтобы написать программу, как это, используйте WinForms. Если вы хотите использовать WPF, вам нужно будет начать все с нуля. WPF - это язык, ориентированный на данные ... мы манипулируем объектами данных, а не объектами пользовательского интерфейса.

Использование WPF, вам нужно будет подумать о своих игровых объектах как о коллекции объектов данных. Плата затем будет элементом управления контейнером UI, к которому вы привязываете данные. Затем вы определяете, как каждый объект должен выглядеть в DataTemplate в XAML. После привязки свойств местоположения объектов данных к свойствам местоположения объектов пользовательского интерфейса вы могли перемещать объекты в пользовательском интерфейсе, изменяя свойства местоположения объектов данных из кода.

Сказав все это, я думаю, что вы обнаружите, что WPF не является хорошей платформой для создания игр. Его основными сильными сторонами являются возможности привязки данных и богатые возможности пользовательского интерфейса, но это не очень эффективно. Вам понадобится хорошая графическая карта, чтобы максимально использовать ее.

+0

Спасибо Шерридан, вы, несомненно, правы. Я предпочитаю делать это в WPF просто потому, что я хотел немного использовать его и почувствовать его. Таким образом, это не совсем плохо, что им пришлось фактически немного научиться в этом процессе. – user25470

+2

Просто предложение, мой дорогой коллега, слово «язык» - не лучший выбор для описания WPF, который не является языком, а основой. Хотя очевидно, что вы знаете, что это может быть не очевидно для читателя, и важно всегда четко понимать различия между языками и структурами. –

+0

Спасибо, хорошая точка, сделанное редактирование. – Sheridan

Смежные вопросы