При выполнении в лабораторной работе упражнения №1 , а именно при выполнении нижеследующего кода: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Microsoft.Xna.Framework.Graphics;
namespace Application1 { public partial class MainForm : Form { // Объявим поле графического устройства для видимости в методах GraphicsDevice device;
public MainForm() { InitializeComponent();
// Подпишемся на событие Load формы this.Load += new EventHandler(MainForm_Load);
// Попишемся на событие FormClosed формы this.FormClosed += new FormClosedEventHandler(MainForm_FormClosed); }
void MainForm_FormClosed(object sender, FormClosedEventArgs e) { // Удаляем (освобождаем) устройство device.Dispose(); // На всякий случай присваиваем ссылке на устройство значение null device = null; }
void MainForm_Load(object sender, EventArgs e) { // Создаем объект представления для настройки графического устройства PresentationParameters presentParams = new PresentationParameters(); // Настраиваем объект представления через его свойства presentParams.IsFullScreen = false; // Включаем оконный режим presentParams.BackBufferCount = 1; // Включаем задний буфер // для двойной буферизации // Переключение переднего и заднего буферов // должно осуществляться с максимальной эффективностью presentParams.SwapEffect = SwapEffect.Discard; // Устанавливаем размеры заднего буфера по клиентской области окна формы presentParams.BackBufferWidth = this.ClientSize.Width; presentParams.BackBufferHeight = this.ClientSize.Height;
// Создадим графическое устройство с заданными настройками device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware, this.Handle, presentParams); }
protected override void OnPaint(PaintEventArgs e) { device.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue);
base.OnPaint(e); } } } Выбрасывается исключение: Невозможно загрузить файл или сборку "Microsoft.Xna.Framework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d" или один из зависимых от них компонентов. Не удается найти указанный файл. Делаю все пунктуально. В чем может быть проблема? |
Компьютерная 2D-графика в Microsoft XNA Game Studio 3.0
Формирование установочного диска
Хорошим тоном установки программы являются следующие критерии:
- Запуск программы установки происходит один раз
- Программа установки имеет имя Setup.exe или Install.exe, и ее легко найти среди файлов установки
- Если программа распространяется на CD, то вставка диска в привод приводит к автоматическому запуску установки
- Весь процесс установки можно пройти, нажимая Enter. Это означает, что каждый шаг должен предполагать вариант по умолчанию.
- Информация, показанная при установке, необходима и достаточна. Не полагайтесь на то, что пользователь будет читать README -файл. Сначала он запустит Setup.exe и обратится к документации лишь в случае, когда столкнется с серьезными проблемами при установке.
- Одна программа установки работает на всех поддерживаемых приложением версиях операционной системы
- Все вспомогательные пакеты установки устанавливать либо в полностью скрытом от пользователя режиме, либо только с окном хода выполнения
Библиотеки .NET Framework 3.0 и XNA Framework 3.0, которые мы использовали при разработке нашего приложения, являются новым продуктом и не у всех потенциальных пользователей они развернуты на компьютере. Поэтому их нужно поставлять на установочном диске вместе с нашей распространяемой программой. Нашей программе понадобятся библиотеки, упакованные в пакеты, которые можно найти по адресу http://www.microsoft.com/downloads/en/A2ZPage.aspx. Для облегчения выполнения работы они прилагаются и находятся в каталоге Setup.
Таким образом, в состав установочного диска должны входить следующие инсталляционные пакеты:
- dotnetfx30.exe - библиотека .NET Framework 3.0 среды исполнения
- xnafx30_redist.msi - библиотека XNA Framework 3.0 для игровых компонентов, включая DirectX 9.0c runtime
- Lab58_Install.exe - пользовательска программа, подлежащая распространению
Чтобы не заморачивать голову неквалифицированному пользователю, библиотечные пакеты будем запускать на его компьютере со следующими опциями:
- dotnetfx30.exe /norestart - показывать ход выполнения и не перезапускать компьютер
- xnafx30_redist.msi /passive /norestart - показывать только ход выполнения и не перезапускать компьютер
При успешной установке этих пакетов в реестр добавляются определенные разделы. Чтобы проверить, установлены ли они на компьютере пользователя, нужно проверить в системном реестре
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup значение ключа InstallSuccess==1 (или в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5 значение ключа Install==1 )
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\XNA\Framework\v3.0 значение ключа Installed==1
Программу, установщик пакетов, будем запускать из файла сценариев WSH (Windows Scripting Host) с расширением .wsf (Windows Scripting File), написанного на JScript. В этом файле мы будем проверять в системном реестре метки установки вспомогательных системных библиотек .NET Framework 3.0 и XNA Framework 3.0 и принимать решение об отказе от их установки. Если библиотеки не обнаружены, то их нужно будет установить, ну и в любом случае - не забыть установить нашу прикладную программу.
- Командой меню Project/Add New Item создайте новый файл сценариев Windows Script Host с именем Install.wsf
Операционная система Windows распознает это зарегистрированное расширение и автоматически запускает сервер WScript.exe (или CScript.exe для запуска из командной строки), размещенный в каталоге %WINDIR%\System32.
- Заполните пакетный файл Install.wsf следующим кодом JScript
<?xml version="1.0" encoding="utf-8" ?> <package xmlns="http://schemas.microsoft.com/WindowsScriptHost"> <job> <script language="JScript"> // Возвращает true, если ключ существует в системном реестре function KeyExists(obj, key) { // Проверяет наличие раздела try { var key2 = obj.RegRead(key); } catch(e) { if(e != 0) // Нет раздела return false; } return true; } </script> <!-- Переменные сценария --> <script language="JScript"> var strSubDir = "Setup\\"; var strCommand = ""; var bWaitOnReturn = true;// Ждать завершения процесса var intWindowStyle = 10; // То же состояние, что и у запустившей программы var key; var title = "Установка системных библиотек"; var message; var vbYesNo = 4; var vbInformation = 64; var vbYes = 6; var WshShell=WScript.CreateObject("WScript.Shell"); </script> <!-- Устанавливаем DotNet --> <script language="JScript"> var keyDotNet35 = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft" + "\\NET Framework Setup\\NDP\\v3.5\\Install"; var keyDotNet30 = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft" + "\\NET Framework Setup\\NDP\\v3.0\\Setup\\InstallSuccess"; // Читаем ключи версий сверху вниз key = 0; if(KeyExists(WshShell, keyDotNet35)) { key = WshShell.RegRead(keyDotNet35); } else if(KeyExists(WshShell, keyDotNet30)) { key = WshShell.RegRead(keyDotNet30); } // Запускаем инсталлятор DotNet из подкаталога Installs if(key != 1) { message = " Требуется установка\n" + " библиотеки .NET Framework 3.0\n" + "Без нее программа работать не будет!\n" + " Установить?"; var result = WshShell.Popup(message, 0, title, vbYesNo + vbInformation); strCommand = strSubDir + "dotnetfx30.exe /norestart"; if(result == vbYes) { WshShell.Run(strCommand, intWindowStyle, bWaitOnReturn); WScript.Echo("Библиотека .NET Framework 3.0 устанавлена!"); } } </script> <!-- Устанавливаем XNA --> <script language="JScript"> var keyXNA30 = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\XNA\\Framework\\v3.0\\Installed"; // Читаем ключ key = 0; if(KeyExists(WshShell, keyXNA30)) { key = WshShell.RegRead(keyXNA30); } // Запускаем инсталлятор XNA в скрытом режиме с показом хода выполнения if(key != 1) { message = " Требуется установка\n" + " библиотеки XNA Framework 3.0\n" + "Без нее программа работать не будет!\n" + " Установить?"; var result = WshShell.Popup(message, 0, title, vbYesNo + vbInformation); strCommand = strSubDir + "xnafx30_redist.msi /passive /norestart"; intWindowStyle = 1; // Показывает окно if(result == vbYes) { WshShell.Run(strCommand, intWindowStyle, bWaitOnReturn); WScript.Echo("Библиотека XNA Framework 3.0 устанавлена!"); } } </script> <!-- Устанавливаем наше приложение --> <script language="JScript"> // Запускаем инсталлятор приложения strCommand = strSubDir + "Lab58_Install.exe"; intWindowStyle = 1; // Показывает окно bWaitOnReturn = false; // Не ждать, а закончить сценарий WshShell.Run(strCommand, intWindowStyle, bWaitOnReturn); </script> <!-- Этот код должен стоять последним --> <script language="JScript"> // Освобождаем объект WScript.DisconnectObject(WshShell); </script> </job> </package>
- В Проводнике решений вызовите контекстное меню для файла Install.wsf и командой Exclude From Project отсоедините его от основного проекта игры
Теперь осталось включить вызов этого файла в autorun.inf, который нужно разместить в корневом каталоге установочного диска вместе с файлом Install.wsf.
[autorun] OPEN="WScript.exe Install.wsf"
-
Сформируйте установочный диск, в корневом каталоге которого должны находиться файлы autorun.inf, Install.wsf и каталог Setup со следующим содержимым:
- dotnetfx30.exe
- xnafx30_redist.msi
- Lab58_Install.exe
- Работу преподавателю сдайте на установочном диске
Контрольные вопросы и задания
2.Контрольные вопросы
- Что такое pixel и texel, назовите их отличия
- Назовите предназначение методов LoadContent() и UnloadContent()
- В какой последовательности срабатывают типовые методы в заготовке игрового класса
- В какой формат преобразуются при компиляции файлы контента
- Что такое sprite в игровой терминологии
- Назовите предназначение библиотеки Microsoft XNA Game Studio 3.0
- Как осуществляется формирование установочного диска
- Для чего предназначена структура BoundingBox
2.Варианты для самостоятельной работы
- Добавьте возможность управлять движением подушки при помощи мыши
- Добавьте механизм увеличения скорости падения объектов при наборе определенного количества очков
- Разделите объекты на типы и добавьте возможность отнимать очки в случае пропущенного объекта определенного типа
- Добавьте возможность начислять бонусные очки в случае поимки наибольшего количества объектов за минимальное время. Алгоритм начисления бонуса придумайте сами
- Добавьте в табло игры счетчики пойманных и пропущенных объектов. Для этого подберите подходящий шрифт и его параметры
- Добавьте механизм переназначения клавиш управления игрой, например, приостановки игры по нажатию клавиши "Pause" вместо "Space"
- Добавьте возможность отключения/включения звуковых эффектов игры
- В режиме меню включите стандартный курсор Windows вместо рисованного курсора с изображением стрелы
- Устраните логическую некорректность, при которой автоматически не сбрасывается режим "Пауза в игре!" предыдущего сеанса с началом новой игры