|
При выполнении в лабораторной работе упражнения №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 вместо рисованного курсора с изображением стрелы
- Устраните логическую некорректность, при которой автоматически не сбрасывается режим "Пауза в игре!" предыдущего сеанса с началом новой игры

