Добавление 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. Если кому-то сейчас нужен мой код, то просто напишите мне или около того.