petter2012 Ответов: 1

Добавление eventhandler (compositiontarget. rendering) в WPF


Привет, что-то вроде вопроса новичка, но вот он идет...

Я пытаюсь использовать CompositionTarget.Рендеринг в моей игре WPF 2D для обновления окна. Однако я отстой в обработчиках событий и т. д., Так что ничего не происходит, когда я пытаюсь это сделать и нуждаюсь в некоторой помощи.

У меня есть мое главное окно и холст там, где происходит действие. Игра начинается, когда я нажимаю кнопку воспроизведения. Событие click кнопки (в MainWindow.xaml.cs) вызывает GameController.cs, который заботится о логике игры (например, игровой цикл).

Третий класс, BoardSetup, метод DrawGame затем вызывается из метода GameLoop GameController и перерисовывает объекты на холсте. (Это работает с DispatcherTimer, но не иначе.) Мне посоветовали использовать CompositionTarget.Визуализация (c# - Как обновить самый умный пользовательский интерфейс в 2D-игре WPF? - переполнение стека[^]) но не знаю, как его добавить.

Итак, как и где (какой файл и метод (если таковые имеются) я должен добавить CompositionTarget.Обработчик событий рендеринга, чтобы мой метод DrawGame перерисовал игру?

На самом деле мне все равно, как часто игра рендерится, если это, по крайней мере, 12 раз в секунду. Для меня важно, чтобы игра работала с одинаковой скоростью независимо от того, сколько объектов находится в игре (и gameloop делает это сегодня, просто результат никогда не обновляется на экране). Поэтому я выбрасываю свой DispatcherTimer, чтобы использовать CompositionTarget.Вместо этого рендеринг.

Пожалуйста, помогите!

Что я уже пробовал:

Я пытался использовать CompositionTarget.Рендеринг в MainWindow.XAML.cs и в игровом цикле, но пользовательский интерфейс все еще не перерисован. Я также просто попробовал миканвы.UpdateLayout (), но он ничего не рисует на экране (наверное, из-за запущенного gameloop).

johannesnestler

Итак, вы опубликовали несколько вопросов к этой теме... Судя по тому, что вы спрашиваете, я бы сказал, что вам нужно отойти от своего "временного" подхода. Если состояние игры меняется, визуальные объекты должны делать то же самое. Поэтому я бы создал элемент управления/представление для визуального представления состояния игры (с привязками)-так что нет необходимости в "цикле обновления". Петля есть только в логике игры.
Но: что я бы задал вопрос, так это использование WPF для такого рода " игр " - почему бы не использовать что - то лучше подходящее для игр (и с гораздо лучшей производительностью) - например,"Unity".
Для некоторых вещей, возможно, WPF-анимация (они хорошо работают и используют фиксированные временные интервалы) может быть хорошей подгонкой - но это зависит от характера вашей игры...

petter2012

Привет, Спасибо, Йоханнес!
На самом деле, вызывая мой gameloop из CompositionTarget.Событие рендеринга делает свое дело. Теперь я успешно попробовал использовать 30 динамических объектов, а также 300 динамических объектов. Объекты не двигаются плавно, если у меня есть 300 движущихся объектов, но время точное: я запустил игру в течение четырех минут (точно, и время правильное до секунды (по крайней мере - я подтверждаю таймером своего мобильного телефона :) ).

Надеюсь, через несколько недель я напишу статью о y game engine. Если кому-то сейчас нужен мой код, то просто напишите мне или около того.

1 Ответов

Рейтинг:
5

petter2012

На самом деле, вызывая мой gameloop из CompositionTarget.Событие рендеринга делает свое дело. Теперь я успешно попробовал использовать 30 динамических объектов, а также 300 динамических объектов. Объекты не двигаются плавно, если у меня есть 300 движущихся объектов, но время точное: я запустил игру в течение четырех минут (точно, и время правильное до секунды (по крайней мере - я подтверждаю таймером своего мобильного телефона :) ).

Надеюсь, через несколько недель я напишу статью о своем игровом движке. Если кому-то сейчас нужен мой код, то просто напишите мне или около того.