Reference = add reference, в висуал студия 2010 не могу найти в вкладке Solution Explorer, Microsoft.Xna.Framework. Его нету. |
Введение в XNA Framework
Добавьте вызов этого метода в конец обработчика события Paint и снова запустите программу на выполнение - на экране появится окно, закрашенное синим цветом, что и требовалось. Исходный код готового приложения находится в каталоге Ch01\Ex01.
1.2. Визуализация шахматной доски
Одна из перегрузок метода GraphicsDevice.Clear позволяет очищать не весь экран целиком, а лишь заданную прямоугольную область формы:
public void Clear(ClearOptions options, Color color, float depth, int stencil, Rectangle[] rect);
где
rect - массив структур Microsoft.Xna.Framework.Rectangle, задающих прямоугольные области экрана, которые должны быть очищены. Области экрана задаются в оконных координатах формы - начало координат расположено в левом верхнем углу. Структура Microsoft.Xna.Framework.Rectangle является близнецом одноименной структуры из пространства имен System.Drawing, и используется во избежание привязки XNA Framework к платформе Windows.
Примечание
Структура Rectangle объявлена в пространстве имен Microsoft.Xna.Framework, так как он используется многими классами XNA Framework, в том числе и не из пространства имен Microsoft.Xna.Framework.Graphics.
К примеру, следующий фрагмент кода нарисует в центре экрана зелeный прямоугольник на синем фоне (рисунок 1.6):
// Закрашиваем экран синим цветом device.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue); // Создаeм массив с координатами областей экрана, которые необходимо закрасить. Нам // нужна всего одна область Microsoft.Xna.Framework.Rectangle[] rect = new Microsoft.Xna. Framework.Rectangle[1]; // Задаeм координаты области экрана, расположенной в центре экрана и занимающей 25% // площади экрана rect[0] = new Microsoft.Xna.Framework.Rectangle(ClientSize.Width/4, ClientSize.Height/4, ClientSize.Width/2, ClientSize.Height/2); // Закрашиваем эту область зелeным цветом device.Clear(ClearOptions.Target, Microsoft.Xna.Framework. Graphics.Color.Green, 0.0f, 4> 0, rect);Листинг 1.3.
В принципе при грамотном использовании только одного метода Clear можно получать довольно интересные изображения. К примеру, никто не мешает нам нарисовать шахматную доску (рисунок 1.7). Для этого необходимо очистить экран белым цветом, затем создать массив областей экрана, соответствующих клеткам доски коричневого цвета и ещe раз очистить экран, но уже коричневым цветом (листинг 1.4).
// Полный код приложения находится в каталоге Examples\Ch01\Ex02 private void MainFormPaint(object sender, PaintEventArgs e) { // Очищаем экран белым цветом device.Clear(Microsoft.Xna.Framework.Graphics.Color. WhiteSmoke); // Создаeм массив областей закраски, соответствующих коричневым клеткам Microsoft.Xna.Framework.Rectangle[] rects = new Microsoft.Xna.Framework.Rectangle[32] ; int k = 0; // Перебираем коричневые клетки шахматной доски for (int j = 0; j < 8; j++) for (int i = j % 2; i < 8; i += 2) { // Заносим в массив координаты очередной клетки rects[k] = new Microsoft.Xna.Framework.Rectangle(i * ClientSize.Width / 8, 4 j * ClientSize.Height / 8, ClientSize.Width / 8, ClientSize.Height / 8); k++; } // Закрашиваем все области из массива rects коричневым цветом device.Clear(ClearOptions.Target, Microsoft.Xna.Framework. Graphics.Color.Brown, 0.0f, 0, 4> rects); device.Present(); }Листинг 1.4.
1.2.1. Конфигурирование DirectX для отладки приложени
Как вы помните, на платформе Windows XNA Framework в некотором роде является высокоуровневой надстройкой над DirectX. Соответственно, на платформе Windows подавляющее большинство вызовов методов XNA Framework так или иначе транслируется в вызовы методов DirectX. В большинстве случаев это обстоятельство можно полностью игнорировать. Тем не менее, при возникновении различных "аномалий" в приложении обращение к нижележащему уровню может помочь быстро решить проблему.
Конфигурирование DirectX осуществляется при помощи утилиты DirectX, запускаемой командой Start | All Programs | Microsoft DirectX SDK | DirectX Utilities | DirectX Control Panel. Внешний вид этой утилиты изображeн на рисунке 1.8. Как видно, данная утилита представляет собой обычное диалоговое окно с набором вкладок, отвечающих за настройку различных компонентов DirectX. Рассмотрим наиболее важные из них.
Вкладка Direct3D предназначена для настройки компонента Direct3D Graphics. Как правило, эта вкладка используется для переключения между отладочной и "обычной" версией Direct3D при помощи переключателей Use Debug Version of Direct3D и Use Retail Version of Direct3D соответственно (расположены в группе Debug/Retail D3D Runtime ). Отладочная версия Direct3D Graphics проводит дополнительную проверку правильности параметров передаваемых классам Direct3D Graphics и правильности выполнения этих методов. Информация о различных подозрительных ситуациях и ошибках передаeтся в отладчик (например, в отладчик Visual Studio 2005 ).
При разработке и отладке приложений рекомендуется всегда использовать отладочную версию Direct3D Graphics. Так же полезно установить ползунок Debug Output Level, отвечающий за подробность отладочной информации в крайнее правое положение, чтобы получать информацию о любых подозрительных ситуациях. Ведь согласно "эффекту бабочки", даже самый безобидный на первый взгляд недочeт может привести к каскаду трудноуловимых ошибок.
В группе Debugging желательно включить следующие флажки: Maximum Validation (максимальная проверка корректности параметров, передаваемых классам Direct3D Graphics ), Enable Shader Debugging (отладка шейдеров) и Break on Memory Leaks (обнаружение утечек памяти).
Внимание
Отладочная ( Debug ) версия DirectX Graphics значительно медленнее обычной ( Retail ) версии. Поэтому не забывайте отключать отладочную версию DirectX по завершению отладки. В противном случае вы рискуете столкнуться с аномально низкой производительностью трeхмерных игр и аналогичных приложений. Для того чтобы переключиться в нормальный режим, достаточно просто включить радиокнопку Use Retail Version of DirectX – остальные опции вроде Debug Output Level не оказывают никакого влияния на обычную версию Direct3D Graphics.
Debug View
По умолчанию Visual Studio 2005 Pro не отображает сообщения от отладочной версии DirectX, а в бесплатной версии Visual C# 2005 Express подобная функциональность не предусмотрена в принципе. Поэтому я включил в example.zip бесплатную программу Марка Руссиновича Debug View, расположенную в каталоге \Tools\DebugView. Скопируйте еe на локальный жесткий диск компьютера и запустите файл DebugView.exe. На экране появится окно следующего вида (рисунок 1.9). Наибольший интерес для нас представляет центральная часть окна, в которой отображают отладочные сообщения от всех приложений, выполняющихся в данный момент на компьютере. Если вы поработаете некоторое время на компьютере при запущенной утилите Debug View, то наверняка заметите множество отладочных сообщений от разнообразных приложений.
Откройте панель управления DirectX, и включите отладочную версию DirectX. Запустите на выполнение приложение, рисующую шахматную доску (пример Ch01\Ex02 ), поработайте с ним некоторое время, после чего завершите. Тем временем в окне Debug Info появится информация следующего вида:
// Библиотека Direct3D загружается в адресное пространство нашего приложения Direct3D9: :====> ENTER: DLLMAIN(041dd6e0): Process Attach: 0000041c, tid=000016a8 Direct3D9: :====> EXIT: DLLMAIN(041dd6e0): Process Attach: 0000041c // Direct3D находится в отладочном режиме Direct3D9: (INFO) :Direct3D9 Debug Runtime selected. // Расширенные возможности отладки Direct3D недоступны (эта функциональность доступна // только для DirectX-приложений, написанных на C++) D3D9 Helper: Enhanced D3DDebugging disabled; Application was not compiled with D3D_DEBUG_INFO // Сообщение с пометкой INFO содержат разнообразную служебную информацию о ходе // выполнения приложения. В частности следующее сообщение означает, что устройство // находится в режиме Software Vertex Processing (Программная обработка вершин). Иными // словами, при создании графического устройства был использован флаг // CreateOptions.SoftwareVertexProcessing. Direct3D9: (INFO) :======================= Hal SWVP device selected Direct3D9: (INFO) :HalDevice Driver Style 9 Direct3D9: :DoneExclusiveMode Direct3D9: :====> ENTER: DLLMAIN(041dd6e0): Process Detach 0000041c, tid=0000022c // Освобождение ресурсов Direct3D завершено Direct3D9: (INFO) :MemFini! // Завершение работы Direct3D Direct3D9: :====> EXIT: DLLMAIN(041dd6e0): Process Detach 0000041c
Обратите внимание
В столбце Time указано время поступления отладочного сообщения, что облегчает идентификацию сообщений. По умолчанию используется относительное время – за точку отсчeта берется время поступления первого события, т.е. время наступление первого события всегда равно 0.0 секунд.
Как видно, приложение выполняется без каких-либо эксцессов. Теперь закомментируйте строку device.Dispose() в обработчике события Close() и снова запустите приложение на выполнение. На этот раз отладочные сообщения будут несколько отличаться: