С# XNA — пользовательский ввод

Я делаю 3D-моделирование с помощью С# XNA, я использую файлы изображений\текста для загрузки данных.

Я хочу предоставить пользователю возможность выбрать файл, который затем будет загружен и использован моей симуляцией. Это невозможно с С# XNA.

Мне удалось встроить 3D-приложение XNA в WinForm с помощью этот учебник, который работал для меня, но проблема в том, что после этого взаимодействие на основе клавиатуры совсем не гладкое. Он больше не отвечает как игра.

Как я могу добиться просмотра файлов и других вещей, таких как кнопки и все такое в игре?

Я мог бы иметь логику для отслеживания пользовательского ввода и использовать ее для обеспечения таких функций, как просмотр файлов в игре, но это слишком большая проблема. Легко ли было этого добиться. Если не с XNA, то может быть каким-то другим способом, например DirectX


person Moon    schedule 05.07.2011    source источник
comment
Какой метод ввода вы используете? События Windows Forms Mouse и Keyboard или обработка ввода XNA? Я думаю, из-за учебника вы пытаетесь использовать события WinForms. Пока можно сделать его гладким. Вы также можете использовать обработку ввода XNA. Возможно, вы можете предоставить больше кода для фактической обработки ввода.   -  person dowhilefor    schedule 05.07.2011
comment
Не видя, что вы делаете, возможно ли, что это проблема, когда вам нужно дважды буферизовать winform?   -  person Maynza    schedule 05.07.2011


Ответы (1)


В обычном XNA класс Game регулярно вызывает ваши функции Draw и Update (обычно со скоростью 60 кадров в секунду).

Образцы XNA WinForms работают несколько иначе. Цикл обновления/отрисовки отсутствует. Вместо этого вы получаете только функцию Draw. И это вызывается только тогда, когда элемент управления нуждается в перерисовке. Это означает, что:

  1. У вас нет возможности регулярно вызывать Keyboard.GetState(), если вы так вводите с клавиатуры.

  2. Даже если вы используете ввод, управляемый событиями (не XNA), ваше окно не будет перерисовываться регулярно, поэтому вы можете фактически не видеть результаты ввода до тех пор, пока элемент управления XNA не будет перерисован намного позже. .

К счастью, есть способ заставить элемент управления быстро перерисовываться. Взгляните на второй из этих образцов WinForms. Вы обнаружите, что он оживляется (другими словами: он часто обновляется). Как это делается? Взгляните на этот код из ModelViewerControl.cs:

protected override void Initialize()
{
    // Start the animation timer.
    timer = Stopwatch.StartNew();

    // Hook the idle event to constantly redraw our animation.
    Application.Idle += delegate { Invalidate(); };
}

Он использует Stopwatch для отслеживания того, сколько времени прошло (потому что нет класса Game, который сделает это за вас). И он становится недействительным в событии Application.Idle — другими словами, всякий раз, когда он не занят обработкой чего-либо, он запрашивает перерисовку.

(Конечно, это уже объяснено в документации к этому первому образцу WinForms. Внизу, в разделе «Анимация».)

Альтернативный бонусный ответ: ничто не мешает вам использовать OpenFileDialog из WinForms в обычной игре XNA. Просто добавьте ссылку на System.Windows.Forms, создайте экземпляр объекта, установите для него соответствующие свойства и вызовите ShowDialog().

person Andrew Russell    schedule 05.07.2011
comment
я глупый или что .. Альтернативный бонусный ответ, почему я этого не делаю .. лол, спасибо большое - person Moon; 05.07.2011
comment
это означает, что я также могу добавить полосу меню и т. д. - person Moon; 05.07.2011
comment
Я бы позаботился обо всем, что требует от вас извлечения объекта Form из XNA Game. В диалоговых окнах файлов нет, но я думаю, что добавление полосок меню и т. Д. Делает. - person Andrew Russell; 06.07.2011
comment
извините, я не понимаю вашу точку зрения, может быть, это потому, что английский не мой родной язык .. извините. Не могли бы вы перефразировать свой последний комментарий - person Moon; 06.07.2011
comment
Чтобы добавить MenuStrip, вы обычно устанавливаете Form.MainMenuStrip. Но получение объекта Form из окна XNA обычно делать не следует (хотя и можно). - person Andrew Russell; 07.07.2011
comment
почему бы и нет, должна быть причина - person Moon; 07.07.2011
comment
Поскольку он не является частью общедоступного API XNA, следовательно, вы не должны этого делать, и нет никаких гарантий, всегда ли он будет работать. Кроме того, это плохая практика разработки программного обеспечения. Если вы сами пишете код формы (согласно примерам XNA WinForms), то вы несете ответственность за весь код, управляющий состоянием формы. Альтернатива — вставка чего-то в собственный код окна XNA — вы просто надеетесь, что то, что вы вводите, всегда корректно взаимодействует с кодом XNA (которого вы не видите и который может измениться в любое время в будущем). ). - person Andrew Russell; 07.07.2011
comment
прежде всего. с будущим C# не проблема, потому что каждый новый .NET FW показывает пальцем на предыдущие. и во-вторых, не могли бы вы предложить, что мне делать.. мне нужна 3D-графика для моделирования с обычными элементами управления Form\Window UI. Что я должен делать. Например, скажем, мне нужно сделать Google Earth с небольшим изменением, что глобус является реальным 3D-объектом, а сфера имеет реальную топографическую карту высот. Пожалуйста, предложите. - person Moon; 08.07.2011
comment
Я предлагаю вам использовать подход XNA WinForms, как показано в примерах. Если у вас есть проблемы с задержкой взаимодействия, диагностируйте и решайте проблемы (согласно моему ответу), а не сдавайтесь и занимайтесь чем-то хакерским. - person Andrew Russell; 08.07.2011
comment
у меня это работает... В случае с XNA WinForms возникает двусмысленность. Когда вы пытаетесь проверить ввод с клавиатуры, он просит указать, из какого именно System.Forms.Input или Microsoft.Xna.Framework.Input, поэтому вам нужно явно указать это. Я думаю, что это также произойдет и с мышью. - person Moon; 09.07.2011
comment
Быстрый совет: вы можете делать такие вещи: using Mouse=Microsoft.Xna.Framework.Input.Mouse;. - person Andrew Russell; 10.07.2011
comment
да я это уже делал. вот почему я сказал, что мне нужно быть явным об этом. Теперь мне просто нужно выяснить, снизит ли загрузка XNA в форме его эффективность или нет. - person Moon; 11.07.2011
comment
При работе в оконном режиме XNA запускается на WinForm (следовательно, вы можете вытащить объект Form и начать играть с ним, но не должны, как мы обсуждали). Таким образом, использование Form не снижает эффективности. - person Andrew Russell; 11.07.2011
comment
ну, это здорово, чем. Большое спасибо за помощь - person Moon; 11.07.2011
comment
Это может быть немного поздно, но вы заставили мышь работать? У меня есть клавиатура для перемещения камеры в моем XNA/WinForm, но мышь вообще не обновляется. - person ; 19.08.2013
comment
Я ответил на ваш вопрос здесь. В основном вы должны установить Mouse.WindowHandle правильно. - person Andrew Russell; 22.08.2013