Как запустить несколько подключаемых игр XNA в одном окне WinForms

Я хочу создать приложение (WinForms), состоящее из нескольких панелей. Для каждой панели я хочу иметь возможность назначить файл .dll:

пример

Эти файлы .dll должны содержать игры XNA, которые должны отображаться на соответствующей панели.

Я могу загрузить эти игры с помощью

var game = (Game)Activator.CreateInstance(System.Reflection.Assembly.LoadFrom(path).GetTypes()
    .First(t => t.IsSubclassOf(typeof(Game))));

Теперь я не могу использовать game.Run(), потому что это запустит второй цикл сообщений.

Запуск нового потока также завершается ошибкой из-за InvalidOperationExceptions относительно доступа к элементам управления из другого потока.

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

Как я могу заставить свое приложение WinForms отображать эти игры XNA или есть лучшее решение для этого?


person pascalhein    schedule 17.06.2013    source источник


Ответы (1)


Я делал нечто подобное в прошлом, но использовал DrawableGameComponents вместо нескольких проектов XNA. Вместо этого вы можете рассмотреть возможность выбора этого маршрута. По сути, вы сможете вызывать различные функции Draw() из одного и того же двоичного файла.

Затем в своей форме вы можете создать указатель на дескриптор панели, который будет служить способом указать вашему графическому рендереру, где рисовать сцену:

IntPtr panel1Handle;                
IntPtr panel2Handle;
IntPtr panel3Handle;
panel1Handle = Panel1.Handle;
panel2Handle = Panel2.Handle;
panel3Handle = Panel3.Handle;

Затем в ваших соответствующих вызовах DrawableGameComponent.Draw() установите область, которую вы собираетесь рисовать, прежде чем выполнять фактическое рисование:

GraphicsDevice.Present(panel1Handle);
person jgallant    schedule 17.06.2013
comment
спасибо за ваше предложение. Сейчас я создаю эти DrawableGameComponents в игре, которую потом прячу, и показываю их на панелях формы. - person pascalhein; 18.06.2013
comment
собственно, у меня есть еще один вопрос: при запуске игры с несколькими dll она показывает только первую в каждой панели (и загружает только первый тип). как я могу загрузить разные типы и заставить их отображать разные DrawableGameComponent на каждой панели? - person pascalhein; 19.06.2013
comment
@csharpler Обязательно вызывайте GraphicsDevice.Present(panel) перед запуском соответствующего вызова отрисовки на каждой панели. - person jgallant; 19.06.2013